首頁 > 軟體

JAVA生成pdf檔案的實操教學

2022-11-13 14:01:04

一、簡介

PDF檔案格式可以將文字、字型、格式、顏色及獨立於裝置和解析度的圖形影象等封裝在一個檔案中。本文實現將html頁面轉PDF。

二、實操

生成pdf檔案成功,但是文字對不上。當修改”GetHtmlContent“部分的編碼之後,再次執行生成PDF檔案即可完成正確的實現。

Edit Configurations

三、原理解析

從這幾點深入剖析和總結這個小專案:

1.是什麼?

該專案實現瞭解析一個模板html檔案,將其轉為pdf檔案並輸出到相應的目錄中。

1.1.關鍵技術

freemarker,FreeMarker是模板引擎,一個Java類庫。
itextpdf,iText是一種生成PDF報表的Java類庫,可以將Xml,Html檔案轉化為PDF檔案。
類 XMLWorkerHelper,(用於解析 XHTML/CSS 或 XML 流到 PDF 的幫助器類)。

2.怎麼做?為什麼?

相關依賴

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.2</version>
</dependency>
<dependency>
    <groupId>com.itextpdf.tool</groupId>
    <artifactId>xmlworker</artifactId>
    <version>5.5.13.2</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.28</version>
</dependency>

模板檔案:generationpdf.html,所在目錄為src/main/resources/templates/generationpdf.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
    <style>
        body{font-family:SimSun;}
        .title{align-content: center;text-align: center;}
        .signature{float:right }
    </style>
</head>
<body>
<div>
    <h1 class="title">標題</h1>
    <h4 class="title">副標題</h4>
    <span>當前時間: ${date_time} </span>
    <div class="signature">日期:${date}</div>
</div>
</body>
</html>

GetHtmlContent.java:獲取模板內容

import freemarker.template.Configuration;
import freemarker.template.Template;
import java.io.*;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

public class GetHtmlContent {
    /**
     * 獲取模板內容
     * @param templateDirectory 模板資料夾
     * @param templateName      模板檔名
     * @param paramMap          模板引數
     * @return
     * @throws Exception
     */
    public static String getTemplateContent(String templateDirectory, String templateName, Map<String, Object> paramMap) throws Exception {
        Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);//不相容設定
        try {
            configuration.setDirectoryForTemplateLoading(new File(templateDirectory));//載入模板
        } catch (Exception e) {
            System.out.println("-- exception --");
        }

        Writer out = new StringWriter();
        Template template = configuration.getTemplate(templateName,"UTF-8");//快取
        template.process(paramMap, out);
        out.flush();
        out.close();
        return out.toString();
    }
    public static void main(String[] args) throws Exception {
        Map<String, Object> paramMap = new HashMap<>();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        paramMap.put("date_time", dateTimeFormatter.format(LocalDateTime.now()));
        paramMap.put("date", dateTimeFormatter.format(LocalDateTime.now()).substring(0, 10));
        ClassLoader classLoader = GetHtmlContent.class.getClassLoader();
        URL resource = classLoader.getResource("templates");
        String templateDirectory  =resource.toURI().getPath();

        String templateContent = GetHtmlContent.getTemplateContent(templateDirectory, "generationpdf.html", paramMap);
        System.out.println(templateContent);
    }

}

生成pdf檔案,將date_time和date儲存到HashMap中,然後將資料輸出到pdf中

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.nio.charset.Charset;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;


public class GeneratePDF {
    /**
     * HTML 轉 PDF
     * @param content html內容
     * @param outPath           輸出pdf路徑
     * @return 是否建立成功
     */
    public static boolean html2Pdf(String content, String outPath) {
        try {
            Document document = new Document(); //建立一個標準的A4紙檔案
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outPath));//書寫器與ducument檔案關聯
            document.open();//開啟檔案
            XMLWorkerHelper.getInstance().parseXHtml(writer, document,
                    new ByteArrayInputStream(content.getBytes()), null, Charset.forName("UTF-8"));
            document.close();//關閉檔案
        } catch (Exception e) {
            System.out.println("生成模板內容失敗"+e.fillInStackTrace());
            return false;
        }
        return true;
    }
    /**
     * HTML 轉 PDF
     * @param content html內容
     * @return PDF位元組陣列
     */
    public static byte[] html2Pdf(String content) {
        ByteArrayOutputStream outputStream = null;
        try {
            Document document = new Document();
            outputStream = new ByteArrayOutputStream();
            PdfWriter writer = PdfWriter.getInstance(document, outputStream);
            document.open();
            XMLWorkerHelper.getInstance().parseXHtml(writer, document,
                    new ByteArrayInputStream(content.getBytes()), null, Charset.forName("UTF-8"));
            document.close();
        } catch (Exception e) {
            System.out.println("------生成pdf失敗-------");
        }
        return outputStream.toByteArray();
    }
    public static void main(String[] args) throws Exception {
        Map<String, Object> paramMap = new HashMap<>();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        paramMap.put("date_time", dateTimeFormatter.format(LocalDateTime.now()));
        paramMap.put("date", dateTimeFormatter.format(LocalDateTime.now()).substring(0, 10));
        String outPath = "D:\A.pdf";
        String templateDirectory = "src/main/resources/templates";
        String templateContent = GetHtmlContent.getTemplateContent(templateDirectory, "generationpdf.html", paramMap);
        GeneratePDF.html2Pdf(templateContent, outPath);

    }
}

3.參考

總結 

到此這篇關於JAVA生成pdf檔案的文章就介紹到這了,更多相關JAVA生成pdf檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com