一、.差別概述
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiNx8FesU2cfdGLwczX0xiRGZkRGZ0Xy9GbvNGLwIzXlpXazxiMFRUT5RzValXOXJWQClGVF5UMR9Fd4VGdsATNfd3bkFGazxSUhxGatJGbwhFT1Y0Mk9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLjNjNkZGO0ETNzQTO3UjM4QmMwQzM3ImNzAzNzUjMkBzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
二、詳細對比
1.itext
這種方法生成的pdf品質會更高,但是在後端實作的步驟過于複雜,而且需要安裝字型,對于html代碼要求也是比較高,缺少标簽的時候會報錯
2.wkhtmltopdf
這種方式實作比較簡單,wkhtmltopdf是一個軟體,這個軟體生成pdf支援多種方式,可以直接使用網頁網址将頁面轉化為pdf,也可以使用本地的檔案将其轉為pdf,而且轉化結果及其的完美,加上實作的過程比較簡單,是以我覺得這是最優的一種html轉化為pdf的方式
三、操作過程
1.安裝wkhtmltopdf及示例
wkhtmltopdf把html轉成pdf很簡單,隻要在windows指令行中輸入c:\wkhtmltopdf.exe http://www.cnblogs.com c:\cnblogs.pdf
就可以把csdn網頁轉成pdf,并儲存到C槽根目錄。
在java中調用wkhtmltopdf的指令Runtime.getRuntime().exec(“c:\wkhtmltopdf.exe http://www.cnblogs.com c:\cnblogs.pdf”)就可以實作轉換。
2.itext使用示例
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
作者:washmore
連結:https://ld246.com/article/1528278305572
來源:鍊滴
協定:CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/
import com.itextpdf.text.Document;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
public class PDFUtil {
public static void writeStringToOutputStreamAsPDF(String html, OutputStream os) {
writeToOutputStreamAsPDF(new ByteArrayInputStream(html.getBytes()), os);
}
public static void writeToOutputStreamAsPDF(InputStream html, OutputStream os) {
try {
Document document = new Document(PageSize.A4);
PdfWriter pdfWriter = PdfWriter.getInstance(document, os);
document.open();
XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
worker.parseXHtml(pdfWriter, document, html, Charset.forName("UTF-8"), new AsianFontProvider());
document.close();
} catch (Exception e) {
}
}
}
/**
* 用于中文顯示的Provider
*/
class AsianFontProvider extends XMLWorkerFontProvider {
@Override
public Font getFont(final String fontname, String encoding, float size, final int style) {
try {
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
return new Font(bfChinese, size, style);
} catch (Exception e) {
}
return super.getFont(fontname, encoding, size, style);
}
}