日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

OpenPDF 或 itext5 根据pdf模板生成多页PDF

發布時間:2023/12/31 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenPDF 或 itext5 根据pdf模板生成多页PDF 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

  • 本文使用openpdf 1.3.29 版本,也建議使用openpdf。<dependency><groupId>com.github.librepdf</groupId><artifactId>openpdf</artifactId><version>1.3.29</version> </dependency>
  • OpenPDF 是基于 itext4 開發的開源的jar,itext5也是基于 itext4 開發,且itext5是部分開源,部分收費,且官方不再更新維護,需要引入的包多,itext7絕大部分功能收費了
  • OpenPDF相比 itext5簡單使用,且在github下載源碼,里面有些例子,共參考
  • 有興趣的可以下載看看:

    https://github.com/LibrePDF/OpenPDF

軟件安裝

  • 所需軟件Adobe Acrobat XI Pro,用于制作PDF模板,也可下載其他版本,僅供參考
  • 可去官網下載,有30天試用期,可使用amtemu.v0.9.2-painter激活,官網下載需要注冊用戶
  • https://www.adobe.com/cn/products/catalog.html

  • 由于上傳有存在版權問題,無法上傳,需要可以留言聯系
  • 制作PDF模板

    • 使用Adobe Acrobat XI Pro創建各種需要的域
    • 條形碼
      使用選定的域對輸入進行編碼,并將它顯示為可以通過解碼軟件或硬件(分別提供)來解釋的可視模式。
    • 按鈕
      促發用戶計算機上的變化,如打開文件、播放聲音,或者向網絡服務器提交數據。這些按鈕可通過圖像、文本以及鼠標動作觸發的可見變化進行自定義。
    • 復選框
      為個別項顯示是或否選擇。如果表單包含多個復選框,用戶通??梢愿鶕枰x擇。
    • 數字簽名域
      允許用戶使用數字簽名以電子形式對 PDF 文檔進行簽名。
    • 下拉列表
      允許用戶從彈出式菜單中選擇項,或鍵入值。您可以設置表單域屬性,以使用戶可以輸入自定義值。
    • 列表框
      顯示用戶可以選擇的選項列表。您可以設置表單域屬性,以使用戶可以按 Shift 鍵并單擊來選擇列表中的多個項。
    • 單選鈕
      顯示一組選項,用戶僅可以從中選擇一項。名稱相同的所有單選鈕作為一個組一起工作。
    • 文本域
      允許用戶鍵入文本,例如名稱、地址或電話號碼。
    • 步驟如下:
    • 建議先創建一個word,先繪制出來想要的表格或文檔(在Adobe Acrobat XI Pro中編輯PDF中不太方便話表格,同時操作內容沒有word豐富),然后將word導出PDF,個人使用的是WPS
    • 用Adobe Acrobat XI Pro 打開,點擊編輯圖標,右邊展示了編輯框,注意內容和表單是常用,如下:
    • 編輯或新增域,點擊表單-編輯;定義域的一般屬性 名稱 是否可見 只讀 ,字體大小
    • 在代碼中通過獲取該名稱屬性來進行對模板填值
    • 域的屬性里,可設置字體,和多行,多行可自動換行,注意域的寬高不夠時顯示不出來
    • 重要: 最好將域的字體設置為TIme New Roman,然后代碼使用宋體,這樣就能兼容中午,即:一段文字,英文顯示TIme New Roman,中文顯示宋體

    代碼

    • 個人寫了個工具類,
    • 注意:由于STSong-Light與simsun字體不一樣,使用瀏覽器打開字體有差異,需要導入simsun,simsun就是我們使用WPS,Adobe Acrobat XI Pro選擇的宋體
    package com.test.business.util;import com.easipass.commoncore.exception.EasiServiceException; import com.lowagie.text.pdf.*; import lombok.extern.slf4j.Slf4j;import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import java.util.Map;/*** 描述:創建PDF 工具類* * @author bpzhang* @date 2022/7/15 12:55*/ @Slf4j public class CreatePdfUtil {private CreatePdfUtil() {throw new IllegalStateException("Utility class");}/*** 根據用Adobe Acrobat XI編輯好的PDF模板,生成pdf,放入輸出流os,** @param templateFilePath 模板路徑,一般在resources下,直接文件名即可* @param os 生成的pdf輸出流,方便調用者自己管理,關閉流等* @param fieldMapList 需要生成pdf域的填充值,List.size就是多少頁*/public static void createPdfByTemplate(String templateFilePath, OutputStream os, List<Map<String, String>> fieldMapList) {try (PdfReader reader = new PdfReader(templateFilePath)) {PdfCopyFields copy = new PdfCopyFields(os);fieldMapList.forEach(fieldMap -> {try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {PdfStamper stamp = new PdfStamper(reader, bos);AcroFields form = stamp.getAcroFields();BaseFont bfChinese = BaseFont.createFont("fonts/simsun.ttc,0",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);form.addSubstitutionFont(bfChinese);fieldMap.forEach((key, value) -> {try {form.setField(key, value);} catch (IOException e) {log.error(e.getMessage(), e);throw new EasiServiceException(e.getMessage());}});stamp.setFormFlattening(true);stamp.close();PdfReader pdfReader = new PdfReader(bos.toByteArray());pdfReader.close();copy.addDocument(pdfReader);} catch (IOException e) {log.error(e.getMessage(), e);throw new EasiServiceException(e.getMessage());}});copy.close();} catch (IOException e) {log.error(e.getMessage(), e);throw new EasiServiceException(e.getMessage());}} }
    • 兩種調用方式;templateFilePath=模板路徑, os = 生成的pdf輸出流,可以給目錄加文件名outputPath,直接生成文件,或者自動保存到OS流中,自行處理,fieldMapList=key:域的名字,value:域值
    • ** 重點** 域中在value使用\n可換行
    CreatePdfUtil.createPdfByTemplate("pdftmpl/EDS_DECL.pdf", os, fieldMapList); CreatePdfUtil.createPdfByTemplate("pdftmpl/EDS_DECL.pdf", Files.newOutputStream(Paths.get(outputPath)), fieldMapList);

    余留問題:

  • 域中如果中英文同時存在,空格自動換行
  • 域中行間距調節不了
  • 解決方案:

  • 問題一:可計算域的一行可放多少個字符,然后代碼在固定的字符中增加\n換行符
  • 問題二:暫時無解方案,只能調節字體大小
  • 以上內容,問題有更好解決方案,歡迎評論區討論

    轉載,或者引用請注明出處,已經看到要幾個網站直接原原本本貼過去,過分了!

    總結

    以上是生活随笔為你收集整理的OpenPDF 或 itext5 根据pdf模板生成多页PDF的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。