Java實(shí)現(xiàn)根據(jù)模板讀取PDF并替換指定內(nèi)容
在實(shí)際開發(fā)里,經(jīng)常會(huì)遇到需要根據(jù) PDF 模板文檔生成特定 PDF 的需求,比如合同、證書等。咱們可以借助 iText 庫來實(shí)現(xiàn)讀取 PDF 模板文檔、替換指定內(nèi)容,最后重新生成新 PDF 的功能。下面我就詳細(xì)給大家講講具體怎么做。
1. 引入依賴
如果你用 Maven 管理項(xiàng)目,在 pom.xml 里添加以下依賴:
<dependencies> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.3</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> </dependencies>
itext-asian 這個(gè)依賴是為了支持中文等亞洲文字的顯示。
2. 創(chuàng)建 PDF 模板
首先,得有一個(gè) PDF 模板文件 template.pdf,在模板里用特定的占位符來表示需要替換的內(nèi)容??梢允褂?Adobe Acrobat 等工具在 PDF 里添加文本域作為占位符,比如添加一個(gè)名為 name 的文本域來表示姓名。
3. Java 代碼實(shí)現(xiàn)
import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.*; import java.io.*; import java.util.HashMap; import java.util.Map; public class PdfTemplateProcessor { public static void main(String[] args) { try { // 讀取 PDF 模板文件 PdfReader reader = new PdfReader("template.pdf"); // 創(chuàng)建一個(gè)輸出流,用于保存新生成的 PDF FileOutputStream outputStream = new FileOutputStream("output.pdf"); // 創(chuàng)建一個(gè) PdfStamper 對象,用于操作 PDF 內(nèi)容 PdfStamper stamper = new PdfStamper(reader, outputStream); // 獲取 PDF 表單 AcroFields form = stamper.getAcroFields(); // 設(shè)置支持中文 BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); form.addSubstitutionFont(baseFont); // 準(zhǔn)備要替換的數(shù)據(jù) Map<String, String> data = new HashMap<>(); data.put("name", "張三"); data.put("date", "2024-10-01"); // 替換表單中的占位符 for (Map.Entry<String, String> entry : data.entrySet()) { String fieldName = entry.getKey(); String fieldValue = entry.getValue(); form.setField(fieldName, fieldValue); } // 關(guān)閉表單編輯 stamper.setFormFlattening(true); // 關(guān)閉 stamper 和 reader stamper.close(); reader.close(); outputStream.close(); System.out.println("新的 PDF 文檔生成成功!"); } catch (IOException | DocumentException e) { e.printStackTrace(); System.out.println("生成新的 PDF 文檔失?。? + e.getMessage()); } } }
4. 代碼解釋
1.讀取 PDF 模板文件
PdfReader reader = new PdfReader("template.pdf"); FileOutputStream outputStream = new FileOutputStream("output.pdf"); PdfStamper stamper = new PdfStamper(reader, outputStream);
通過 PdfReader 讀取 template.pdf 文件,使用 FileOutputStream 創(chuàng)建一個(gè)輸出流,用于保存新生成的 PDF 文件。PdfStamper 是 iText 里用于操作 PDF 內(nèi)容的重要類,它能讓我們在不改變原文件結(jié)構(gòu)的情況下修改 PDF 內(nèi)容。
2.獲取 PDF 表單并設(shè)置中文支持
AcroFields form = stamper.getAcroFields(); BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); form.addSubstitutionFont(baseFont);
AcroFields 表示 PDF 中的表單域,通過 stamper.getAcroFields() 獲取表單。為了支持中文顯示,使用 BaseFont.createFont 方法創(chuàng)建一個(gè)支持中文的字體,并添加到表單中。
3.準(zhǔn)備要替換的數(shù)據(jù)
Map<String, String> data = new HashMap<>(); data.put("name", "張三"); data.put("date", "2024-10-01");
創(chuàng)建一個(gè) Map 對象,將占位符(表單域名稱)和要替換的內(nèi)容進(jìn)行映射。
4.替換表單中的占位符
for (Map.Entry<String, String> entry : data.entrySet()) { String fieldName = entry.getKey(); String fieldValue = entry.getValue(); form.setField(fieldName, fieldValue); }
遍歷 Map,使用 form.setField 方法將表單域中的占位符替換為實(shí)際內(nèi)容。
5.關(guān)閉表單編輯并保存新 PDF
stamper.setFormFlattening(true); stamper.close(); reader.close(); outputStream.close();
stamper.setFormFlattening(true) 用于將表單域扁平化,防止表單域被再次編輯。最后關(guān)閉 stamper、reader 和輸出流,保存新生成的 PDF 文件。
以上就是Java實(shí)現(xiàn)根據(jù)模板讀取PDF并替換指定內(nèi)容的詳細(xì)內(nèi)容,更多關(guān)于Java讀取PDF的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot中如何自動(dòng)轉(zhuǎn)JSON輸出
這篇文章主要介紹了Springboot中如何自動(dòng)轉(zhuǎn)JSON輸出,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Java開發(fā)之Spring連接數(shù)據(jù)庫方法實(shí)例分析
這篇文章主要介紹了Java開發(fā)之Spring連接數(shù)據(jù)庫方法,以實(shí)例形式較為詳細(xì)的分析了Java Spring開發(fā)中針對數(shù)據(jù)庫的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過程解析
在Mybatis中,我們需要?jiǎng)?chuàng)建一個(gè)與實(shí)體類對應(yīng)的Mapper接口,然后在該接口上添加方法,這些方法對應(yīng)著SQL語句,這篇文章主要介紹了Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過程,需要的朋友可以參考下2023-11-11Java通過httpclient比較重定向和請求轉(zhuǎn)發(fā)
這篇文章主要介紹了Java通過httpclient比較重定向和請求轉(zhuǎn)發(fā),HttpClient?4.x?版本,get請求方法會(huì)自動(dòng)進(jìn)行重定向,而post請求方法不會(huì)自動(dòng)進(jìn)行重定向,需要的朋友可以參考下2023-04-04淺試仿?mapstruct實(shí)現(xiàn)微服務(wù)編排框架詳解
這篇文章主要為大家介紹了淺試仿?mapstruct實(shí)現(xiàn)微服務(wù)編排框架詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08