1. 程式人生 > >Java中使用phantomjs將HTML頁面轉為pdf

Java中使用phantomjs將HTML頁面轉為pdf

之前有個需求,將頁面轉為pdf,當時使用itext轉換,但是呢樣式與實際在瀏覽器中開啟的樣式存在差異。比如選擇項長得不一樣,CheckBox長得不一樣,這就不行,需求要跟瀏覽器開啟一模一樣,後經過多方面查詢,終於找到一個靠譜點的解決方案:使用phantomjs外掛。

首先下載 phantomjs 外掛:

這個外掛各個版本都有些小bug,我這裡使用的是1.9.7。 高版本存在問題是:table中跨列的單元格左側邊框不顯示。

低版本能顯示,但是也存在問題:table 中跨列的單元格的左側的單元格高度不正確,如下圖:(理論上左側三行高度應該平均分配)

使用phantomjs :

一、下載後,解壓到目錄,我這裡解壓到C盤:(根據專案需求,可放在專案中,然後獲取專案根目錄來取到檔案目錄)

二、建立一個js檔案:html2pdf.js,我這裡放在資料夾phantom下。

內容如下:

var page = require('webpage').create();
var system = require('system');

////讀取命令列引數,也就是js檔案路徑。
if (system.args.length === 1) {
  console.log('Usage: loadspeed.js <some URL>');
//這行程式碼很重要。凡是結束必須呼叫。否則phantomjs不會停止
  phantom.exit();
}
page.settings.loadImages = true;  //載入圖片
page.settings.resourceTimeout = 30000;//超過10秒放棄載入
//截圖設定,
//page.viewportSize = {
//  width: 1000,
//  height: 3000
//};
var address = system.args[1];
page.open(address, function(status) {
	
	function checkReadyState() {//等待載入完成將頁面生成pdf
        setTimeout(function () {
            var readyState = page.evaluate(function () {
                return document.readyState;
            });

            if ("complete" === readyState) {
                
				page.paperSize = { width:'297mm',height:'500mm',orientation: 'portrait',border: '1cm' };
				var timestamp = Date.parse(new Date());
				var pdfname = 'HT_'+timestamp + Math.floor(Math.random()*1000000);
				var outpathstr = "E:/POMFiles/HTPDF/"+pdfname+".pdf";
				page.render(outpathstr);
				//page.render("c://test.png");
				//console.log就是傳輸回去的內容。
				console.log("生成成功");
				console.log("$"+outpathstr+"$");
				phantom.exit(); 
				
            } else {
                checkReadyState();
            }
        },1000);
    }
    checkReadyState();
});

三、Java中呼叫:

package com.eweaver.base.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * 轉換html為pdf
 * 
 * @author xiongfan
 * 
 */
public class Html2pdf {

	public static String parseHtml2Pdf(String url) throws IOException {
		System.out.println(url);
		//執行phantomjs 生成js 
		Runtime rt = Runtime.getRuntime();
		Process p = rt.exec("C:\\phantom\\bin\\phantomjs.exe C:\\phantom\\html2pdf.js "+url);
		InputStream is = p.getInputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		StringBuffer sbf = new StringBuffer();
		String tmp = "";
		while ((tmp = br.readLine()) != null) {
			sbf.append(tmp);
		}
		String resultstr = sbf.toString();
		String[] arr = resultstr.split("\\$");
		String result = "";
		for(String s : arr){
			if(s.endsWith("pdf"))result = s;
		}
		return result;
	}

}

呼叫 parseHtml2Pdf()方法,就可以將html頁面轉換為pdf了。路徑也可以定義。我這邊直接固定寫死了。

關於跨行的單元格左側行高不一致問題,我的解決方法是在頁面中加入js程式碼,自動為跨行所涉及到的tr計算行高,並賦值,這樣就解決了,程式碼就不貼了。

相關推薦

Java使用phantomjsHTML頁面轉為pdf

之前有個需求,將頁面轉為pdf,當時使用itext轉換,但是呢樣式與實際在瀏覽器中開啟的樣式存在差異。比如選擇項長得不一樣,CheckBox長得不一樣,這就不行,需求要跟瀏覽器開啟一模一樣,後經過多方面查詢,終於找到一個靠譜點的解決方案:使用phantomjs外掛。 首先下

使用iText html頁面PDF檔案(itext+freemarker)

1.匯入jar包(使用maven管理) <!--itext start--> <dependency> <groupId>com.lowagie&l

java使用pd4mlhtml轉換成pdf

import java.awt.Insets; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.F

js實現html頁面轉為pdf下載

1、簡單描述 最近做了一個專案,我也是剛學js才幾個多月,對js不是很懂,但是我相信,只要肯學,總會進步的。專案裡面要實現把網頁的試題下載成pdf,所以我有個同事就實現了這個功能,然後我參考著他寫的程式碼就總結了一下。網頁渲染的過程中因伺服器效能和圖片的數量而定,圖片太多的

利用itexthtml頁面轉成pdf(不模糊)

relative long ble wid ems map entity repl oat 1.maven項目進入依賴 <dependency> <groupId>org.xhtmlrenderer</groupId>

Oracle存儲圖片的類型為BLOB類型,Java如何其讀取並轉為字符串?

ava 字節數組 object [] str string類 arch data mpi 一,讀取圖片轉為String類型: 需要使用Sun公司提供的Base64工具 String str = ((Map) list1.get(0)).get("EINVOICEFILE")

HTML頁面自動儲存為PDF檔案並上傳的兩種方式(一)-前端(react)方式

一、業務場景   公司的樣本檢測報告以React頁面的形式生成,已調整為A4大小的樣式並已實現分頁,業務上需要將這個網頁生成PDF檔案,並上傳到伺服器,後續會將這個檔案傳送給客戶(這裡不考慮)。 二、原來的實現形式   瀏覽器原生方法:window.print()可以將網頁儲存為PDF檔案,由於檢測報告

java使用wkhtmltopdfhtml或者URI連結生成PDF

最近專案有個需求,將客戶提供的URI連結轉化為PDF檔案,原本打算使用itext轉換的,發現使用itext轉化後的PDF格式和html差異過大。後來經同事介紹可以使用wkhtmltopdf對html或URI連結轉化為PDF,經過測試確實很強大,也比較簡單,但是要安裝wkhtmltopdf外掛。

前端和java後臺HTML轉換成pdf

前端和java後臺將HTML轉換成pdf java後臺方式: private final static String DEST = "C:\\80afa41a3bfc474cbf1ac8b5bc1d.pdf"; //生成pdf的路徑 private final

java程式碼word,excel轉為pdf

新建javaweb工程 下載aspouse-word-14.11.0-jdk16.jar包和aspose-cells-8.5.2.jar包並引入 word轉pdf的java函式 package webViewer; import java.io.*;  import com.as

使用phantomJShtml轉為圖片

問題描述 近期寫稿專案碰到一個問題,由於文章會發布到不同裝置和平臺上,在前端展示的時候可能會與平臺本身的樣式發生覆蓋,導致表格樣式顯示不正常。短時間內想要做出一個適應所有環境的前端樣式不太現實。因為使用本地模板生成的表格不存在樣式問題,所以考慮將本地html模板中的<t

Linux使用命令列方式呼叫openoffice服務word檔案轉為PDF

Linux中使用命令列方式呼叫openoffice服務將word檔案轉為PDF 測試安裝之後的openoffice用命令將docx檔案轉換為PDF   需要一份python的指令碼程式,因為轉換需要通過py程式去呼叫api處理,將下面程式儲存到topdf.py檔案: #

iText – 使用JavaHTML轉換為PDF

iText “XML Worker”允許開發人員以一種程式設計師友好的方式將XML檔案轉換成PDF檔案。iText還可以將包含CSS樣式的HTML轉換為PDF格式的文件。 目標: 實現如何利用iText Java庫將HTML檔案轉換成PDF文件?

java如何office檔案轉成pdf或者圖片(親測有效)

前段時間做專案時,需要將word文件在瀏覽器中開啟,一般的在瀏覽器中開啟word都是直接提示下載的,找了好久都是些pageoffice等的收費外掛,小專案成本要儘量壓縮,所以就放棄了這種收費的外掛了。突然想到有些瀏覽器能直接開啟pdf或者圖片,手機端也需要顯示圖片,所以可以

JAVA常用API或程式設計工具001---ITEXT把html轉換成pdf的jar包,使用JavaHTML轉換為PDF

iText “XML Worker”允許開發人員以一種程式設計師友好的方式將XML檔案轉換成PDF檔案。iText還可以將包含CSS樣式的HTML轉換為PDF格式的文件。 目標: 實現如何利用iText Java庫將HTML檔案轉換成PDF文件? Environment &

JavaHTML轉化為PDF+獲得頁數+合併PDF

最近公司用到了HTML轉PDF的技術,這裡就把用到的方式和技術在這裡寫一下,方便他人和自己以後有需要時進行

HTML頁面部分內容匯出為PDF

若前者小於後者說明不用分頁,直接新增圖片資料匯出,原始碼如下: if(contentHeight < pageHeight){ pdf.addImage(imgData, 'JPEG', 0, 0,pdfFormat[format][0],pdfFormat[format][

JavaExecutorService轉為守護程式

問題描述 我正在Java 1.6中使用一個ExecutoreService,簡單地開始 ExecutorService pool = Executors.newFixedThreadPool(THREADS). 當我的主執行緒完成(以及由執行緒池處理的所有任務)時

用js 當前html頁面匯出pdf

引入的js <script src="./js/libs/jquery-2.0.2.js"></script> <script src="./js/exportpdf/jspdf.debug.js"></script>

JAVA使用wkhtmltopdf Html 匯出PDF

1.安裝wkhtmltopdf  根據自己的系統來選擇對應的安裝包 2.下載之後安裝,然後將其配置到環境變數中 3.做個小測試 命令:wkhtmltopdf 需要轉化為pdf的html地址  匯出位置 4.下面附上JAVA程式碼 主要工具類