1. 程式人生 > >jsp生成pdf(html2canvas.js使用)

jsp生成pdf(html2canvas.js使用)

前段時間有個電子簽章的需求,需要將jsp頁面內容生成pdf檔案,然後傳給電子簽章。自己嘗試過集中方法,有的整合麻煩,需要引入報表。再就是速度慢,流程很長,不適用於高併發。這裡整理了一個了很簡單靈活的方法,而且很方便理解。

程式碼思路:

jsp頁面通過html2canvas.js來擷取div轉成image圖片,然後將圖片提交到服務端,服務端建立pdf檔案將圖片插進去。

資源依賴:html2canvas.js (擷取圖片)  itextpdf-5.5.9.jar(生成pdf檔案)

前端原始碼:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> 
<title>Test</title> 
<style type="text/css"> 
*{ 
  margin:0 auto; 
  padding:0; 
} 
.btn{ 
  width:100px; 
  height:30px; 
  line-height:30px; 
  background:green; 
  color:#fff; 
  border-radius:10px; 
  -webkit-border-radius:10px; 
  text-align:center; 
  display:block; 
  text-decoration:none; 
  } 
.container{ 
  background:#e5e5e5; 
} 
</style> 
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 
<script src="https://cdn.bootcss.com/html2canvas/0.4.1/html2canvas.js"></script> 
<script> 
$(function(){ 
  $("#btn").click(function(){ 
    html2canvas($("#container"), { 
      onrendered: function(canvas) { 
        //把擷取到的圖片替換到a標籤的路徑下載 
        //$("#download").attr('href',canvas.toDataURL()); 
        alert(canvas.toDataURL());
        $.post("<%=request.getContextPath()%>/test",{image:canvas.toDataURL()},function(result){
            alert("成功");
          });
        //下載下來的圖片名字 
        //$("#download").attr('download','share.png') ;  
        //document.body.appendChild(canvas); 
      },
	useCORS: true	//解決資源跨域問題  
//可以帶上寬高擷取你所需要的部分內容 
//     , 
//     width: 300, 
//     height: 300 
    }); 
  }); 
}); 
</script> 
</head> 
  
<body> 
  <div style="padding:10px 0"> 
    <div class="btn" id="btn">擷取螢幕</div> 
    <p style="color:red; text-align:center;">先點選擷取屏幕後再點選截圖下載</p> 
    <div style="margin-top:10px"> 
      <a href="javascript:;" rel="external nofollow" class="btn" id="download">截圖下載</a> 
    </div> 
  </div> 
  <div class="container" id="container"> 
    <p style="text-align:center">以下是測試內容</p> 
    <img src="http://a.hiphotos.baidu.com/image/pic/item/9f510fb30f2442a76160eca6dd43ad4bd1130242.jpg"> 
  </div> 
</body> 
</html>

服務端原始碼:

public void createPDF(HttpServletRequest request, HttpServletResponse response) throws DocumentException, MalformedURLException, IOException{
		String imgStr=request.getParameter("image");
		byte[] b=GenerateImage(imgStr.replace("data:image/png;base64,", ""));
		
		
		 // 1.新建document物件
        Document document = new Document();

        // 2.建立一個書寫器(Writer)與document物件關聯,通過書寫器(Writer)可以將文件寫入到磁碟中。
        // 建立 PdfWriter 物件 第一個引數是對文件物件的引用,第二個引數是檔案的實際名稱,在該名稱中還會給出其輸出路徑。
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:/chenggong.pdf"));

        // 3.開啟文件
        document.open();

        // 4.新增一個內容段落
        //document.add(new Paragraph("Hello World!"));

        //圖片1
        Image image1 = Image.getInstance(b);
        //設定圖片位置的x軸和y周
        image1.setAbsolutePosition(100f, 550f);
        //設定圖片的寬度和高度
        image1.scaleAbsolute(200, 200);
        //將圖片1新增到pdf檔案中
        document.add(image1);

        // 5.關閉文件
        document.close();
	}
/** 
     * base64字串轉化成圖片 
     * @param imgStr 
     * @return 
	 * @throws IOException 
     */  
	public byte[] GenerateImage(String imgStr) throws IOException { // 對位元組陣列字串進行Base64解碼並生成圖片
		// if (imgStr == null) // 影象資料為空
		BASE64Decoder decoder = new BASE64Decoder();

		// Base64解碼
		byte[] b = decoder.decodeBuffer(imgStr);
		for (int i = 0; i < b.length; ++i) {
			if (b[i] < 0) {// 調整異常資料
				b[i] += 256;
			}
		}
		// 生成jpeg圖片
		// String imgFilePath = "E:/test33.jpg";// 新生成的圖片
		// OutputStream out = new FileOutputStream(imgFilePath);
		// out.write(b);
		// out.flush();
		// out.close();
		return b;

	} 

這只是個簡單的demo,具體尺寸引數根據需求配置

注意:html2canvas擷取部分,如果資料是以特有的標籤賦值請修改賦值方式,比如C標籤的迴圈方式賦值,這時候可能擷取的頁面會亂,這個方法生成的pdf只有圖片,如果要文字編輯那麼請採用報表形式生成

相關推薦

jsp生成pdfhtml2canvas.js使用

前段時間有個電子簽章的需求,需要將jsp頁面內容生成pdf檔案,然後傳給電子簽章。自己嘗試過集中方法,有的整合麻煩,需要引入報表。再就是速度慢,流程很長,不適用於高併發。這裡整理了一個了很簡單靈活的方法,而且很方便理解。程式碼思路:jsp頁面通過html2canvas.js來

根據圖片的URL生成PDF保存到本地前臺js

避免 就會 需要 uri con bug 是個 tput llb //需要引用html2canvas.js和jspdf.js SavePDF:function(e){ var that = this; $.post("/Biz/D

二維碼生成QRCode.js

結果 phone rec max andro javascrip user doc area 什麽是 QRCode.js? QRCode.js 是一個用於生成二維碼的 JavaScript 庫。主要是通過獲取 DOM 的標簽,再通過 HTML5 Canvas 繪制而成,不依

【Java】itext根據模板生成pdf包括圖片和表格

金額 res report als fields positions 創建模板 bst open() 1、導入需要的jar包:itext-asian-5.2.0.jar itextpdf-5.5.11.jar。 2、新建word文檔,創建模板,將文件另存為pdf,並用Ado

二維碼的兩種生成方法前端js生成,後端java生成

package com.payplatform.util; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.u

JFina連線資料庫mysql並執行增刪改操作+jspvue.js

先給大家看一下 我專案的整個構造 1.首先把JFinal基本的框架搭建好,那麼 第一步,就是匯入依賴: <dependency> <groupId>junit</groupId> <artifactId>juni

封裝的一套簡單輕量級JS 類庫RapidDevelopmentFramework.JS

需要 and arr ucc rda 找到 目的 tco 類庫 1.最近好久沒有更新自己的博客了,一直在考慮自己應該寫一些什麽。4.2日從蘇州回到南京的路上感覺自己的內心些崩潰和失落,我就不多說了? 猛然之間我認為自己需要找一下內心的平衡。決定開發屬於自己一套快速開發的JS

數字鍵盤js

outb htm -a 字符 cit style elements nim 實現 實現的要求: 第一位不能是0 不能同時出現兩個"." 最後一位不能是"." 只能輸入n位小數 註意:在ios中input會出現光標,可以加上

JSP復習part 2

war setattr current ren 客戶端 代碼 body 練習 params 3.4.2 訪問(獲取)請求參數 1.方法 String 字符串變量 =request.getParamete

JSP復習part 3

響應頭 utf 瀏覽器 聲明 數據 thead code 直接 web服務器 3.4.4 request對象提供了一些用來獲取客戶信息的方法,利用這些方法,可以獲取客戶端的IP地址 協議等有關信息 3.5 request對象和response對象相對應,用於

JSP復習part 4

com name script out java 內置 當前時間 jsp getc 3.5.2 重定向網頁 使用response對象中的sendRedirect()方法實現一個重定向到另一個頁面。 例如: resp

JSP的範圍作用域

如果 用戶 請求 方法 str tro 不同 include 來看 JSP的範圍(作用域) 在JSP頁面中的對象,包括用戶創建的對象如JavaBean,都有一個範圍屬性,這個範圍也被叫做“作用域”。範圍定義了在什麽時間內,在哪一個JSP頁面中可以訪問這些對象。例如,sess

MFC與Webbrowser交互通過JS

omv .cn amp c++ ocs scrip spa script files 最近修改老舊的MFC項目,用的網頁做界面,和HTML交互采用的是COM方式,繁瑣,醜陋又性能低,於是考慮利用js來進行界面交互,查了一天的資料,現在整理如下,供後來需要的人參考,雖然大概幾

移動端滑動條原生JS

顏色 empty || 原生 pre border relative innerhtml 課程 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"

四則運算生成程序python版

本地化 tee 情況 class 數字 是否 波蘭表達式 api 提示 四則運算題目生成—基於控制臺 項目托管在碼雲:飛機票 需求分析 根據控制臺提示信息,輸入題目生成相關配置參數 題目生成數量 數字範圍 式子中是否有分數 .... 程序支持 10000 題目生成

[對抗訓練]20180117,Linux下自動生成flagv0.1

itl kill 查看 src nbsp 定時 ssl pla 用戶 [對抗訓練]20180117,Linux下自動生成flag (v0.1)設置目標靶機(Linux)定時生成flag的過程。在靶機終端登錄root用戶 使用命令 su ,然後輸入roo

jsonp跨域寫淘寶搜索聯想詞原生js

div 註意 abs scrip 基礎 屬性 體驗 blur ext 一、主體 1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset=

Elasticsearch技術解析與實戰 PDF 內含目錄

setting 4.6 2.2.3 tps 重寫 約定 系統 檢測 概念 Elasticsearch技術解析與實戰 下載地址:https://pan.baidu.com/s/1q46lwAqzbUMs0qbKyBNBqg 關註微信公眾號獲取提取碼:   輸入:esj

從尾到頭打印鏈表基於js

tail nsh module != [] fff node color 方法 輸入一個鏈表,按鏈表值從尾到頭的順序返回一個ArrayList。 首先你得知道什麽是鏈表,可以參考 把當前的Node的val值用 unshift 方法放進數組,然後指針後移,循環該步驟直到鏈表尾

實現word轉pdf,HTML轉pdf探索篇

ner ase node eth ack line prope fin -o 筆者找依賴的jar包,找的好辛苦。 ITextRenderer、ITextFontResolver這兩個類依賴的jar包到底是哪個,還有怎麽下載?苦苦糾結了3個小時。終於找到你了!記錄個網址:ht