html轉pdf 兩種方式


Maven
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.10</version>
</dependency>

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>

<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf-itext5</artifactId>
    <version>9.1.6</version>
</dependency>

<dependency>
    <groupId>com.itextpdf.tool</groupId>
    <artifactId>xmlworker</artifactId>
    <version>5.5.8</version>
</dependency>
Java代碼
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.*;
import java.nio.charset.Charset;

public class Html2Pdf {

    // HTML文件路徑
    public static final String HTML = "X:\\xxx.html";

    // 生成PDF路徑
    public static final String PDF_PATH = "X:\\xx.pdf";

    public static void main(String[] args) {
//        Html2Pdf.XMLWorkerHelperHtmlToPDF();
        Html2Pdf.itextHtmlToPDF();
    }

    public static void XMLWorkerHelperHtmlToPDF() {

        Document document = null;
        try {
            Long startTime = System.currentTimeMillis();

            document = new Document(PageSize.A2);
            PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(PDF_PATH));
            document.open();
            document.addAuthor("pdf作者");
            document.addCreator("pdf創建者");
            document.addSubject("pdf主題");
            document.addCreationDate();
            document.addTitle("pdf標題,可在html中指定title");
            XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
            InputStream inputStream = null;
            // 方式一/文件生成PDF
            worker.parseXHtml(pdfWriter, document, new FileInputStream(HTML), inputStream, Charset.forName("UTF-8"), new AsianFontProvider());
            // 方式二/HTML代碼字符串生成PDF
//            worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(htmlString.getBytes("UTF-8")),inputStream,Charset.forName("UTF-8"),new AsianFontProvider());

            Long endTime = System.currentTimeMillis();
            System.out.print("XMLWorkerHelper parse Html to Pdf End -> " + (endTime -startTime));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            document.close();
        }

    }

    public static void itextHtmlToPDF() {

        OutputStream os = null;
        try {
            Long startTime = System.currentTimeMillis();

            os = new FileOutputStream(PDF_PATH);
            ITextRenderer renderer = new ITextRenderer();
            ITextFontResolver fontResolver = renderer.getFontResolver();
            // 設置中文字體/宋體
            fontResolver.addFont("C:/Windows/Fonts/SimSun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            // 獲取HTML文件的URL
            String url = new File(HTML).toURI().toURL().toString();
            // 方式一/URL方式生成PDF
            renderer.setDocument(url);
            // 方式二/HTML代碼字符串方式生成PDF
            // HTML代碼字符串
            String htmlString = "<html></html>";
            renderer.setDocumentFromString(htmlString);
            renderer.layout();
            renderer.createPDF(os);

            Long endTime = System.currentTimeMillis();
            System.out.print("Itext parse Html to Pdf End -> " + (endTime -startTime));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
           if (null != os) {
               try {
                   os.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
        }

    }

}

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;

/**
* XMLWorkerHelper字庫類
*/
public class AsianFontProvider extends XMLWorkerFontProvider {

public Font getFont(final String fontname, final String encoding,
final boolean embedded, final float size, final int style,
final BaseColor color) {
BaseFont bf = null;
try {
bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
BaseFont.NOT_EMBEDDED);
} catch (Exception e) {
e.printStackTrace();
}
Font font = new Font(bf, size, style, color);
font.setColor(color);
return font;
}
}
 

總結

  PDF生成時,對html代碼規范要求較高,所有的標簽必須有閉合標簽,否則生成過程中會報異常。異常提示會明確指出對應標簽缺少閉合標簽。

  XMLWorkerHelper方式缺點,對css樣式支持不友好,樣式丟失,圖片丟失,甚至出現文本丟失。無具體解決方案,資料查閱度較為困難,且在生成過程中發現生成耗時為Itext方式兩倍。故直接放棄使用。

  Itext方式生成注意要點

    中文支持,需要在java代碼及html代碼中同步配置

    控制PDF頁面大小,需要在html代碼中配置

    <style>

      body{font-family:SimSun}<!-- 支持中文字體, SimSun宋體-->

      @page{size:240mm 360mm;}<!-- 設置PDF頁面大小,此配置只對生成PDF文件有效,不會對頁面顯示生效 -->

    </style>

 

補充

  判斷操作環境加載系統字體

// 設置中文字體
if ("LINUX".equalsIgnoreCase(System.getProperty("os.name"))) {
  fontResolver.addFont("/usr/share/fonts/truetype/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
} else {
  fontResolver.addFont("c:/windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}

以上代碼會發生問題

  項目發布至LINUX環境時,如果系統中無中文字體,會無法找到字體,報IO異常

    java.io.IOException: /usr/share/fonts/truetype/simsun.ttc not found as file or resource.

如果無法安裝字體至環境中時,使用下載字體至本地項目中,加載項目中存放字體的方法

  下載SimSun.ttc文件

    復制c:/windows/fonts/simsun.ttc至瀏覽器或資源管理器中,自動下載

    將SimSun.ttc文件放入項目src/main/resources目錄下,舉例為新建文件夾fonts

    配置字體PATH為 

private static String FONT_PATH = "/fonts/SimSun.ttc";

    配置中文字體方式為

fontResolver.addFont(FONT_PATH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

 

至此,WINDOWS環境運行成功。LINUX環境運行情況待測。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM