Java使用lowagie根据模版动态生成PDF(无需额外设置系统字体)
生活随笔
收集整理的這篇文章主要介紹了
Java使用lowagie根据模版动态生成PDF(无需额外设置系统字体)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天客戶給了一個docx文檔模板,讓頁面填寫以后下載成pdf格式的文件,之前的項目里面用過wkhtmltopdf 動態生成pdf,但是如果使用這個方式需要先把word文件轉化成html,把數據填充到html以后,再轉成pdf,這樣轉起來太復雜了。
今天無意中發現使用lowagie 可以直接編輯pdf,而且也不需要像itextpdf那樣額外引入系統字體。
話不多說,開始操作:
第一步 設置pdf模板
wps 將word 轉成pdf,使用Adobe Acrobat DC編輯pdf。
Adobe Acrobat DC下載:
下載解壓后執行這個文件:
為PDF準備表單
表單準備完畢以后,如下圖:
雙擊一個區域,自定義key:
設置兩個字段試試:
保存一下,生成一個新的帶表單的pdf。
使用maven的項目
導入依賴
<dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.1.7</version></dependency><dependency><groupId>cn.lesper</groupId><artifactId>iTextAsian</artifactId><version>3.0</version></dependency><dependency><groupId>com.lowagie</groupId><artifactId>itext-rtf</artifactId><version>2.1.7</version></dependency>java代碼創建PdfUtils類
package pdf.kit.util;import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Map;import com.lowagie.text.pdf.AcroFields; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.PdfReader; import com.lowagie.text.pdf.PdfStamper; /*** @ClassName PdfUtils * @Description TODO* @Author lgn* @Date 16:43 2022/8/22* @Version 1.0**/ public class PdfUtils {public static void main(String[] args) throws Exception {export();System.out.println("生成完成");}public static void export(){try {// pdf模板所在路徑,就是網站制作好后下載的pdf模板路徑String fileName = "C:\\Users\\lgn\\Desktop\\JS-PAS-2208-001222.pdf";PdfReader reader = new PdfReader(fileName);ByteArrayOutputStream bos = new ByteArrayOutputStream();PdfStamper ps = new PdfStamper(reader, bos);// 使用中文字體BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();fontList.add(bf);AcroFields fields = ps.getAcroFields();fields.setSubstitutionFonts(fontList);fillData(fields, data());//必須要調用這個,否則文檔會出現你不想出現的東西ps.setFormFlattening(true);ps.close();//生成pdf路徑存放的路徑OutputStream fos = new FileOutputStream("C:\\Users\\lgn\\Desktop\\result.pdf");fos.write(bos.toByteArray());fos.flush();fos.close();bos.close();}catch (Exception e){e.printStackTrace();}}/*** 填充模板中的數據*/public static void fillData(AcroFields fields, Map<String, String> data) {try {for (String key : data.keySet()) {String value = data.get(key);// 為字段賦值,注意字段名稱是區分大小寫的fields.setField(key, value);}} catch (Exception e) {e.printStackTrace();}}/*** 填充數據源* 其中data存放的key值與pdf模板中的文本域值相對應*/public static Map<String, String> data() {Map<String, String> data = new HashMap<String, String>();data.put("executor", "鋼鐵俠");data.put("reviewed", "小辣椒");return data;} }驗證一下:
總結
以上是生活随笔為你收集整理的Java使用lowagie根据模版动态生成PDF(无需额外设置系统字体)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux使用笔记: 设置Samba服务
- 下一篇: 王高利:Apache Httpd负载均衡