Java實(shí)現(xiàn)PDF模板動(dòng)態(tài)賦值與文檔生成的多種方式
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ù)組遍歷、編碼轉(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),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
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過程
文章詳細(xì)介紹了棧的概念、特點(diǎn)以及如何使用數(shù)組和鏈表實(shí)現(xiàn)棧,通過入棧(push)和出棧(pop)操作,展示了棧的數(shù)據(jù)處理過程,并提供了具體的代碼實(shí)現(xiàn)2024-12-12
Java實(shí)現(xiàn)各種文件類型轉(zhuǎn)換方式(收藏)
這篇文章主要介紹了Java?各種文件類型轉(zhuǎn)換的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03

