itext - PDF模板套打

項目需求:獲取列表數據之后直接將數據生成一個pdf。因此需要使用到?itext?對pdf進行直接操作。

環境配置

需要為pdf添加文字域,因此需要安裝Adobe Acrobat

準備一個空的PDF文件,如果有現成的模板更好

依賴配置,我們使用itext的7版本

        <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.3</version><type>pom</type></dependency>

?

快速使用

使用Adobe Acrobat Pro DC打開空PDF,使用 文字域 工具為PDF添加文字域,要注意為每個文字域命名。

如果你有現成的模板PDF,直接使用識別域可以識別空白區域然后自動生成文字域,但是一般都不太準確

如果你的單個數據很多的話,可以在屬性中設置多行?

?

設置完文字域之后記得保存。

代碼實現

@SpringBootTest
class StickerApplicationTests {private static final String TEMP_PATH = "C:\\Users\\An1ong\\Desktop\\Stickers.pdf";//生成PDF的位置private static final String DEST_PATH = "C:\\Users\\An1ong\\Desktop\\StickersOut.pdf";//本地上字體的路徑private static final String FONT_PATH = "";@Autowiredprivate StickerService stickerService;@Testvoid contextLoads() throws IOException {//創建一個新的PDF文件,并寫入數據PdfReader reader = new PdfReader(TEMP_PATH);// 創建一個 PdfWriter 對象以寫入新的PDFPdfWriter writer = new PdfWriter(DEST_PATH);// 創建一個 PdfDocument 對象PdfDocument pdfDoc = new PdfDocument(reader, writer);// 獲取 PDF 表單PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, false);//獲得數據,準備填充List<Sticker> stickerList = stickerService.list(10);//文本填充for(int i = 0; i < stickerList.size();i++){Sticker sticker = stickerList.get(i);// 生成自定義序號,格式為 "001"、"002"、"003"String customId = String.format("%03d", i + 1);String idFieldName = "id" + (i + 1);String nameFieldName = "name" + (i + 1);PdfFormField idField = form.getField(idFieldName);if (idField != null) {idField.setValue(customId);}PdfFormField nameField = form.getField(nameFieldName);if (nameField != null) {nameField.setValue(sticker.getStickerName());}}//消除掉表單域form.flattenFields();//關閉流pdfDoc.close();}
}

行數也不算少,但里面的邏輯其實也很簡單。這是一個Springboot的單元測試,我調用service中方法獲取了一個裝著對象的列表。

用PdfReader讀取你要套寫的模板,用PdfWriter將數據寫入模板。創建出一個PdfDocument對象并將這兩個參數傳入就可以開始對PDF操作了。

注意,這個過程不會直接在原PDF上操作,而是生成一個新的PDF進行操作,程序結束后原PDF模版還是空白的。

?PdfAcroFrom獲取PDF表單,然后PdfFormField獲取其中的文字域,最后使用for循環動態的將數據套打在模板上就完成了。

最終會生成一個新的文件

最終效果:

之所以要在最后調用form.flattenFields消除掉表單域是因為如果不消除表單域的話就會變成這樣。

封裝

我們可以把這個在單元測試中的程序封裝成工具類重復使用

public class PdfPrintUtil {//    private static final String TEMP_PATH = "C:\\Users\\An1ong\\Desktop\\Stickers.pdf";
//
//    private static final String DEST_PATH = "C:\\Users\\An1ong\\Desktop\\StickersOut.pdf";public static void printPDF(String TEMP_PATH,String DEST_PATH,List<Sticker> stickerList) throws IOException {//創建一個新的PDF文件,并寫入數據PdfReader reader = new PdfReader(TEMP_PATH);// 創建一個 PdfWriter 對象以寫入新的PDFPdfWriter writer = new PdfWriter(DEST_PATH);// 創建一個 PdfDocument 對象PdfDocument pdfDoc = new PdfDocument(reader, writer);// 獲取 PDF 表單PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, false);//文本填充for(int i = 0; i < stickerList.size();i++){Sticker sticker = stickerList.get(i);// 生成自定義序號,格式為 "001"、"002"、"003"String customId = String.format("%03d", i + 1);String idFieldName = "id" + (i + 1);String nameFieldName = "name" + (i + 1);PdfFormField idField = form.getField(idFieldName);if (idField != null) {idField.setValue(customId);}PdfFormField nameField = form.getField(nameFieldName);if (nameField != null) {nameField.setValue(sticker.getStickerName());}}//消除掉表單域form.flattenFields();//關閉流pdfDoc.close();}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162593.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162593.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162593.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python數據結構與算法-14_樹與二叉樹

樹和二叉樹 前面我們講了兩種使用分治和遞歸解決排序問題的歸并排序和快速排序&#xff0c;堆排序先就此打住&#xff0c;因為涉及到樹的概念&#xff0c;所以我們先來講講樹。 講完了樹之后后面我們開始介紹一種有用的數據結構堆(heap)&#xff0c; 以及借助堆來實現的堆排序…

python命令行 引導用戶填寫ssh登錄信息

字多不看&#xff0c;直接體驗&#xff1a; 待補充 演示代碼 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/23 9:20 file: 引導用戶填寫ssh接口信息.py desc: xxxxxx """# region 引入必要的依賴 impor…

【圖像分類】基于深度學習的垃圾分類系統的設計與實現(ResNet網絡,附代碼和數據集)

寫在前面: 首先感謝兄弟們的關注和訂閱,讓我有創作的動力,在創作過程我會盡最大能力,保證作品的質量,如果有問題,可以私信我,讓我們攜手共進,共創輝煌。(專欄訂閱用戶訂閱專欄后免費提供數據集和源碼一份,超級VIP用戶不在服務范圍之內,不想訂閱專欄的兄弟們可以私信…

LORA 教程

1 什么是LoRa 2 LoRa調制解調技術 3 什么是loraWAN 4 LoRa和LoRaWAN詳細介紹 5 LoRaWAN 物理層&#xff08;PHY&#xff09;詳解 6 LoRaWAN MAC幀格式詳解 7 LoraWAN MAC控制命令詳解 8 LoRaWAN 設備入網流程詳解&#xff08;OTAA和ABP&#xff09; 9 LoRaWAN 自適…

el-table表格排序(需要后端判別),el-table導出功能(向后端發送請求)

&#xff08;1&#xff09;表格排序 &#xff08;2&#xff09;簡單的table導出功能&#xff08;需要后臺支撐&#xff09;必須要有iframe &#xff08;3&#xff09;頁面所有代碼&#xff1a; <template><div class"mainContainer"><el-form:model&…

golang學習筆記——將 channel 用作通信機制

文章目錄 將 channel 用作通信機制Channel 語法無緩沖 channel緩沖 channelschannel 與 goroutine緩沖 channels 示例多路復用 將 channel 用作通信機制 golang學習筆記——將 channel 用作通信機制 golang學習筆記——并發計算斐波納契數 Go 中的 channel 是 goroutine 之間…

使用Pytorch從零開始構建DCGAN

在本文中&#xff0c;我們將深入研究生成建模的世界&#xff0c;并使用流行的 PyTorch 框架探索 DCGAN&#xff08;生成對抗網絡 (GAN) 的一種變體&#xff09;的實現。具體來說&#xff0c;我們將使用 CelebA 數據集&#xff08;名人面部圖像的集合&#xff09;來生成逼真的合…

網絡安全等級保護收費標準?

不同省份價格會略有不同&#xff0c;二級等保一般不低于5萬元;三級等保不低于9萬元&#xff0c;個別省份也可能7萬也能辦理&#xff0c;根據企業實際情況和省市選定的代理機構確定。 等級保護二級? 第二級等保是指信息系統受到破壞后&#xff0c;會對公民、法人和其他組織的合…

刷到一個很騷氣的 Go 錯誤處理新提案

在比較一段長的時間里&#xff0c;Go 的錯誤處理已經沒有什么特別的進展和新改進了。看著已經到了瓶頸期。 今天在 GitHub 上學習時&#xff0c;看到 Go 社區里有人提了個錯誤處理的優化提案《proposal: Go 2: Error-Handling Paradigm with !err Grammar Sugar》&#xff0c;…

《YOLOv8創新改進》專欄指導書冊 手把手創新教程

&#x1f680;&#x1f680;&#x1f680;YOLOv8改進專欄&#xff1a;http://t.csdnimg.cn/hGhVK 學姐帶你學習YOLOv8&#xff0c;從入門到創新&#xff0c;輕輕松松搞定科研&#xff1b; 本專欄為訂閱者提供答疑服務&#xff0c;每一篇提供源代碼和詳細的每一個步驟改進地方。…

Navicat 技術指引 | 適用于 GaussDB 的模型功能

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持對 GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結構同步、協同合作、數據遷移等&#xff09;&#xff0c;這…

工業交換機具備哪些功能?

在工業網絡中&#xff0c;工業交換機起著至關重要的作用&#xff0c;具備多樣功能和廣泛的應用。 1、工業交換機的作用是實現不同網絡設備之間的互聯。它能夠連接各種不同類型的設備&#xff0c;如計算機、服務器、傳感器和監控設備&#xff0c;實現設備間的相互通信和數據傳輸…

應用高斯高通濾波器提取圖像輪廓

任務要求&#xff1a; 圖為HALCON中的例圖“tooth_rim”&#xff0c;請用高斯高通濾波器提取圖像的輪廓。 任務分析&#xff1a; 圖像的邊緣對應頻譜的高頻部分&#xff0c;可以通過構造一個高頻濾波器&#xff0c;過濾掉圖像的低頻部分&#xff0c;從而得到圖像的邊緣。HALC…

蘋果怎么關閉懸浮球?讓我來解答您的疑惑!

懸浮球是蘋果設備上的一種可進行自定義的快捷操作功能&#xff0c;它可以位于手機屏幕的任意位置&#xff0c;以浮動的方式顯示。然而&#xff0c;有時候懸浮球對某些朋友來說可能會變得多余&#xff0c;那么蘋果怎么關閉懸浮球呢&#xff1f;接下來&#xff0c;小編將為大家揭…

docker compose搭建滲透測試vulstudy靶場示例

前言 滲透測試&#xff08;Penetration test&#xff09;即網絡安全工程師/安全測試工程師/滲透測試工程師通過模擬黑客&#xff0c;在合法授權范圍內&#xff0c;通過信息搜集、漏洞挖掘、權限提升等行為&#xff0c;對目標對象進行安全測試&#xff08;或攻擊&#xff09;&am…

【快應用】小程序轉快應用中如何獲取用戶已授權的權限

【關鍵詞】 權限、SystemInfo、setting 【問題背景】 小程序轉快應用&#xff0c;用戶在使用快應用的過程中如果產生了一些授權行為&#xff0c;開發者是否有辦法去收集到用戶已經授權過的權限呢&#xff0c;從而進行更好管理呢&#xff1f; 【解決方案】 小程序轉快應用中是…

詳解——菱形繼承及菱形虛擬繼承

目錄 一&#xff0c;菱形繼承 1.1單繼承 1.2多繼承 1.3菱形繼承 1.4菱形繼承的問題 1.5虛擬繼承解決數據冗余和二義性的原理 二.繼承的總結和反思 一&#xff0c;菱形繼承 C三大特性——繼承-CSDN博客 1.1單繼承 單繼承&#xff1a;一個子類只有一個直接父類時稱這個繼…

javaScript解決手機瀏覽器下載為圖片之后,圖片漆黑無法保存的問題

pc端能正常下載圖片并查看 手機移動端下載的圖片全是黑色的并且無法保存&#xff0c;這個問題可能與移動瀏覽器的安全策略有關 解決辦法&#xff1a;使用Blob對象和createObjectURL方法來創建一個臨時URL&#xff0c;然后將其賦給鏈接的href屬性下載&#xff1a; // 轉blob函…

anaconda安裝配置

創建分區 conda create -n cpu 安裝Cpu版本 https://pytorch.org/ conda install pytorch torchvision torchaudio cpuonly -c pytorch 激活環境 conda activate cpu 驗證 退出當前分區 conda deactivate 安裝GPU版本 創建分區conda create -n gpu 激活環境 conda…

Java面向對象(高級)-- final關鍵字的使用

文章目錄 一、 final的意義二、 final的使用&#xff08;1&#xff09; final修飾類&#xff08;2&#xff09; final修飾方法&#xff08;3&#xff09; final修飾變量1. 修飾成員變量1.1 舉例11.2 舉例2 2. 修飾局部變量2.1 舉例12.2 舉例2 &#xff08;4&#xff09;final搭…