最近作了一個關於動態生成PDF合同的需求 java生成PDF 網絡上隨便一搜遍有了java
不要用手動在代碼裏面輸入合同中的文字這種方式 如這樣的方式 http://blog.csdn.net/justinytsoft/article/details/53320225網絡
需求的多變,那天須要修改一下字體的顏色,或者字體, 增長一行字,等等其餘奇葩要求,上面這個博客的方式都得修改代碼maven
使用itext使用pdf模版的方式,就不須要修改代碼了.測試
這裏用的是itext生成PDF字體
maven依賴spa
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.6</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
參考如下博客 ,可是該中仍是有一些問題,PDF模版
http://blog.csdn.net/top__one/article/details/65442390
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
如下都是踩過的坑,但願能幫助後來的人
原始pdf
word模版轉PDF後 導入Adobe Acrobat pro 若是pdf中 甲方:_______ 姓名:_____ 之類的下劃線,,他會自動生成表單
導入以後
上圖中的黑框 就是表單了 雙擊.net
重點關注表單中的名稱 這個就是之後再代碼分鐘動態填充的3d
坑來了
這裏能夠看到表單的字體和大小 code
實際上自動生成的表單, 咱們在往裏面填充內容的時候會有問題的.orm
若是須要填充的內容包含中文 一點要刪掉默認生成的表單域 而後從新添加 注意字體
填充漢字的時候有些漢字會顯示不出來 好比 軍 ,資 ,確定還有不少字不能顯示出來
第一感受就是更換字體 而後換成微軟雅黑
好吧,.如今漢字都顯示不出來了,只顯示數字
試了不少字體.都不行
最後,刪除了自動生成的表單.手動往須要 動態添加內容的地方 添加表單域
實際測試 這種方法可行
itext 代碼案例
//PdfTemplate類裏面定義了全部表單域的名稱 這裏只舉例子了兩個表單域//上面提到了表單域的名稱 public static void fillTemplate(PdfTemplate pdfTemplate) throws BusinessException{ // 模板路徑 String templatePath = "/pdf/xxxx.pdf"; // 填充模版文件後生成的待簽署的合同路徑 //TODO 地址 // 文件名BORROWPROTOCOL+協議編號 String newPDFPath = TEMP_PDF_LOCATION+pdfTemplate.getContract_no()+EXPANDEDNAME; PdfReader reader; FileOutputStream out; ByteArrayOutputStream bos; PdfStamper stamper; try { out = new FileOutputStream(newPDFPath); // 讀取pdf模板 reader = new PdfReader(templatePath); bos = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, bos); AcroFields form = stamper.getAcroFields(); //往pdf合同模版裏面設置值 //mock //合同編號 form.setField("contract_no", pdfTemplate.getContract_no()); //甲方 form.setField("first_user_name", pdfTemplate.getFirst_user_name()); //...須要填充的其餘表單域 // 若是爲false那麼生成的PDF文件還能編輯,必定要設爲true stamper.setFormFlattening(true); stamper.close(); Document doc = new Document(); PdfCopy copy = new PdfCopy(doc, out); doc.open(); //pdf模版的頁數 int pagecount= reader.getNumberOfPages(); for(int i=1 ;i<pagecount+1;i++){ PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i); copy.addPage(importPage); } doc.close(); } catch (IOException e) { throw new BusinessException("生成合同模版失敗,合同編號:"+pdfTemplate.getContract_no()); } catch (DocumentException e) { throw new BusinessException("生成合同模版失敗,合同編號:"+pdfTemplate.getContract_no()); } }