最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)勢(shì)進(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實(shí)現(xiàn)按照大小寫字母順序排序的方法

    Java實(shí)現(xiàn)按照大小寫字母順序排序的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)按照大小寫字母順序排序的方法,涉及java數(shù)組遍歷、編碼轉(zhuǎn)換、判斷等相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • SpringBoot整合Web開發(fā)之Json數(shù)據(jù)返回的實(shí)現(xiàn)

    SpringBoot整合Web開發(fā)之Json數(shù)據(jù)返回的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot整合Web開發(fā)其中Json數(shù)據(jù)返回的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java中的函數(shù)式編程

    Java中的函數(shù)式編程

    這篇文章介紹Java中的函數(shù)式編程,函數(shù)式編程是一種編程范式,其中程序是通過應(yīng)用和組合函數(shù)來構(gòu)造的。它是一種聲明式編程范式,其中函數(shù)定義是表達(dá)式樹,每個(gè)表達(dá)式樹返回一個(gè)值,而不是一系列改變程序狀態(tài)的命令語句,具體情況請(qǐng)看下文,希望對(duì)你有所幫助
    2021-10-10
  • springboot集成redis之字典緩存詳解

    springboot集成redis之字典緩存詳解

    Redis的字典緩存是支撐其高性能的一個(gè)關(guān)鍵因素,它使得Redis能夠以極快的速度處理大量的數(shù)據(jù),這篇文章主要介紹了springboot集成redis之字典緩存,需要的朋友可以參考下
    2024-07-07
  • java實(shí)現(xiàn)將域名解析成ip示例

    java實(shí)現(xiàn)將域名解析成ip示例

    這篇文章主要介紹了java實(shí)現(xiàn)將域名解析成ip示例,需要的朋友可以參考下
    2014-04-04
  • SpringBoot整合Logback日志框架及高并發(fā)下的性能優(yōu)化

    SpringBoot整合Logback日志框架及高并發(fā)下的性能優(yōu)化

    在現(xiàn)代的Java應(yīng)用開發(fā)中,日志記錄是不可或缺的一部分,Spring Boot作為目前最流行的Java開發(fā)框架之一,默認(rèn)集成了Logback作為日志框架,Logback是Log4j的繼任者,具有更高的性能和更豐富的功能,本文將詳細(xì)介紹如何在Spring Boot中整合Logback日志框架
    2025-03-03
  • java實(shí)現(xiàn)入棧push和出棧pop過程

    java實(shí)現(xiàn)入棧push和出棧pop過程

    文章詳細(xì)介紹了棧的概念、特點(diǎn)以及如何使用數(shù)組和鏈表實(shí)現(xiàn)棧,通過入棧(push)和出棧(pop)操作,展示了棧的數(shù)據(jù)處理過程,并提供了具體的代碼實(shí)現(xiàn)
    2024-12-12
  • java排序算法圖文詳解

    java排序算法圖文詳解

    這篇文章主要為大家詳細(xì)介紹了Java經(jīng)典排序算法之歸并排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望可以對(duì)你有所幫助
    2021-07-07
  • Java類的訪問權(quán)限關(guān)鍵字用法說明

    Java類的訪問權(quán)限關(guān)鍵字用法說明

    這篇文章主要介紹了Java類的訪問權(quán)限關(guān)鍵字用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java實(shí)現(xiàn)各種文件類型轉(zhuǎn)換方式(收藏)

    Java實(shí)現(xiàn)各種文件類型轉(zhuǎn)換方式(收藏)

    這篇文章主要介紹了Java?各種文件類型轉(zhuǎn)換的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03

最新評(píng)論

宜春市| 茶陵县| 晴隆县| 铁力市| 丁青县| 罗江县| 淅川县| 罗江县| 民县| 江陵县| 札达县| 泸水县| 海林市| 门头沟区| 凉城县| 博乐市| 乐安县| 万年县| 雅安市| 毕节市| 麻阳| 英山县| 沧源| 龙里县| 金山区| 通海县| 梁山县| 新宁县| 家居| 昭苏县| 南和县| 台东县| 泰兴市| 新竹县| 佛坪县| 西昌市| 汝阳县| 新民市| 巩义市| 赫章县| 嘉善县|