欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)PDF模板動(dòng)態(tài)賦值與文檔生成的多種方式

 更新時(shí)間:2025年07月10日 10:38:57   作者:自由的瘋  
除了 iText 庫,在 Java 中還有其他一些庫可以用于處理 PDF 模板并進(jìn)行動(dòng)態(tài)賦值,這篇文章就來為大家詳細(xì)介紹幾種常見的庫及其使用示例吧

1. Apache PDFBox

Apache PDFBox 是一個(gè)開源的 Java 庫,可用于創(chuàng)建、操作和提取 PDF 文檔中的內(nèi)容。它提供了豐富的 API 來處理 PDF 表單,能夠?qū)崿F(xiàn)從 PDF 模板生成新文檔并動(dòng)態(tài)賦值的功能。

添加依賴

如果你使用 Maven 項(xiàng)目,在 ??pom.xml?? 中添加以下依賴:

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>3.0.0</version>
</dependency>

示例代碼

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDField;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class PdfBoxTemplateGenerator {

    public static void main(String[] args) {
        String templatePath = "template.pdf";
        String outputPath = "output.pdf";
        Map<String, String> values = new HashMap<>();
        values.put("name", "李四");
        values.put("age", "30");

        try {
            generatePdfFromTemplate(templatePath, outputPath, values);
            System.out.println("PDF 文檔生成成功,路徑為: " + outputPath);
        } catch (IOException e) {
            System.err.println("生成 PDF 文檔時(shí)出現(xiàn)錯(cuò)誤: " + e.getMessage());
            e.printStackTrace();
        }
    }

    public static void generatePdfFromTemplate(String templatePath, String outputPath, Map<String, String> values) throws IOException {
        // 加載 PDF 模板文檔
        try (PDDocument document = PDDocument.load(new File(templatePath))) {
            // 獲取文檔中的表單
            PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm();
            if (acroForm != null) {
                // 遍歷動(dòng)態(tài)賦值的鍵值對(duì)
                for (Map.Entry<String, String> entry : values.entrySet()) {
                    // 獲取表單字段
                    PDField field = acroForm.getField(entry.getKey());
                    if (field != null) {
                        // 設(shè)置字段的值
                        field.setValue(entry.getValue());
                    }
                }
            }

            // 保存修改后的文檔
            document.save(outputPath);
        }
    }
}

代碼解釋

  • ??PDDocument.load??:用于加載 PDF 模板文件。
  • ??document.getDocumentCatalog().getAcroForm()??:獲取 PDF 文檔中的表單。
  • ??acroForm.getField??:通過字段名稱獲取表單字段。
  • ??field.setValue??:設(shè)置表單字段的值。
  • ??document.save??:保存修改后的文檔。

2. Flying Saucer

Flying Saucer 是一個(gè)用于將 HTML/CSS 轉(zhuǎn)換為 PDF 的 Java 庫。你可以先創(chuàng)建 HTML 模板,然后將其轉(zhuǎn)換為 PDF 文檔,并在 HTML 中使用占位符進(jìn)行動(dòng)態(tài)賦值。

添加依賴

如果你使用 Maven 項(xiàng)目,在 ??pom.xml?? 中添加以下依賴:

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

示例代碼

import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class FlyingSaucerTemplateGenerator {

    public static void main(String[] args) {
        String templatePath = "template.html";
        String outputPath = "output.pdf";
        Map<String, String> values = new HashMap<>();
        values.put("${name}", "王五");
        values.put("${age}", "35");

        try {
            generatePdfFromTemplate(templatePath, outputPath, values);
            System.out.println("PDF 文檔生成成功,路徑為: " + outputPath);
        } catch (Exception e) {
            System.err.println("生成 PDF 文檔時(shí)出現(xiàn)錯(cuò)誤: " + e.getMessage());
            e.printStackTrace();
        }
    }

    public static void generatePdfFromTemplate(String templatePath, String outputPath, Map<String, String> values) throws Exception {
        // 讀取 HTML 模板文件內(nèi)容
        String htmlContent = new String(Files.readAllBytes(Paths.get(templatePath)));

        // 替換 HTML 中的占位符
        for (Map.Entry<String, String> entry : values.entrySet()) {
            htmlContent = htmlContent.replace(entry.getKey(), entry.getValue());
        }

        // 創(chuàng)建輸出流
        try (OutputStream outputStream = new FileOutputStream(new File(outputPath))) {
            // 創(chuàng)建 ITextRenderer 對(duì)象
            ITextRenderer renderer = new ITextRenderer();
            // 設(shè)置 HTML 內(nèi)容
            renderer.setDocumentFromString(htmlContent);
            // 布局渲染
            renderer.layout();
            // 生成 PDF
            renderer.createPDF(outputStream);
        }
    }
}

代碼解釋

  • ??Files.readAllBytes??:讀取 HTML 模板文件的內(nèi)容。
  • ??htmlContent.replace??:替換 HTML 中的占位符。
  • ??ITextRenderer.setDocumentFromString??:設(shè)置 HTML 內(nèi)容。
  • ??renderer.layout??:進(jìn)行布局渲染。
  • ??renderer.createPDF??:生成 PDF 文檔。

各庫的優(yōu)缺點(diǎn)比較

庫名稱優(yōu)點(diǎn)缺點(diǎn)
iText功能強(qiáng)大,支持復(fù)雜的 PDF 操作,有豐富的文檔和社區(qū)支持部分高級(jí)功能需要付費(fèi)許可證
Apache PDFBox開源免費(fèi),易于使用,適合處理簡單的 PDF 表單對(duì)于復(fù)雜的 PDF 布局處理能力相對(duì)較弱
Flying Saucer可以利用 HTML/CSS 的優(yōu)勢進(jìn)行模板設(shè)計(jì),靈活性高性能相對(duì)較低,對(duì)于復(fù)雜的 PDF 效果實(shí)現(xiàn)可能有一定難度

到此這篇關(guān)于Java實(shí)現(xiàn)PDF模板動(dòng)態(tài)賦值與文檔生成的多種方式的文章就介紹到這了,更多相關(guān)Java PDF模板動(dòng)態(tài)賦值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java-ElementUi中的row-class-name使用

    Java-ElementUi中的row-class-name使用

    這篇文章主要介紹了Java-ElementUi中的row-class-name使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java Optional解決空指針異??偨Y(jié)(java 8 功能)

    Java Optional解決空指針異??偨Y(jié)(java 8 功能)

    這篇文章主要介紹了Java Optional解決空指針異常總結(jié)(java 8 功能),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java動(dòng)態(tài)規(guī)劃之硬幣找零問題實(shí)現(xiàn)示例

    Java動(dòng)態(tài)規(guī)劃之硬幣找零問題實(shí)現(xiàn)示例

    本文主要介紹了Java動(dòng)態(tài)規(guī)劃之硬幣找零問題實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 通過JDBC連接oracle數(shù)據(jù)庫的十大技巧

    通過JDBC連接oracle數(shù)據(jù)庫的十大技巧

    通過JDBC連接oracle數(shù)據(jù)庫的十大技巧...
    2006-12-12
  • CommonMark 使用教程:將 Markdown 語法轉(zhuǎn)成 Html

    CommonMark 使用教程:將 Markdown 語法轉(zhuǎn)成 Html

    這篇文章主要介紹了CommonMark 使用教程:將 Markdown 語法轉(zhuǎn)成 Html,這個(gè)技巧我們做任何網(wǎng)站都可以用到,而且非常好用。,需要的朋友可以參考下
    2019-06-06
  • 詳解Java中雪花算法的實(shí)現(xiàn)

    詳解Java中雪花算法的實(shí)現(xiàn)

    雪花算法是一種分布式的id生成算法。原理是將long分成若干個(gè)區(qū)段分別管理。本文將利用Java簡單的實(shí)現(xiàn)雪花算法,感興趣的可以了解一下
    2022-12-12
  • mybatis-plus如何配置自定義數(shù)據(jù)類型TypeHandle

    mybatis-plus如何配置自定義數(shù)據(jù)類型TypeHandle

    這篇文章主要介紹了mybatis-plus如何配置自定義數(shù)據(jù)類型TypeHandle,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 解析Java中的Field類和Method類

    解析Java中的Field類和Method類

    這篇文章主要介紹了Java中的Field類和Method類,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-12-12
  • Java Socket編程詳解及示例代碼

    Java Socket編程詳解及示例代碼

    本文主要講解Java Socket編程,這里整理了詳細(xì)的技術(shù)資料及簡單的示例代碼幫助大家學(xué)習(xí)參考,有需要的小伙伴可以參考下本文內(nèi)容
    2016-09-09
  • Java設(shè)計(jì)模式中的抽象工廠模式解讀

    Java設(shè)計(jì)模式中的抽象工廠模式解讀

    這篇文章主要介紹了Java設(shè)計(jì)模式中的抽象工廠模式解讀,抽象工廠模式為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口,而且無需指定他們的具體類,需要的朋友可以參考下
    2023-11-11

最新評(píng)論