IText更改pdf模板資料並匯出
阿新 • • 發佈:2019-02-09
1.匯入maven相關依賴
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.4.3</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>
注意:1.asian如果版本低於5.0的話,匯入資料時會報 "STSong-Light' with 'UniGB-UCS2-H' is not recognized"
2.所有過程中,pdf模板在專案執行的時候儘量不要同時開啟,不然報file reload異常
2.直接貼程式碼
@RequestMapping(value = "/editPDF2") @ResponseBody public Object editPDF2(String attr, HttpServletResponse response) throws IOException { // OutputStream ouputStream = response.getOutputStream(); //json格式的String型別引數,直接轉成map方便取值 Map<String, Object> data = JSON.parseObject(attr); // 本地模板 String fileName = "C:\\Users\\xianyu\\Desktop\\PDF Test\\Fill the forms.pdf"; PdfReader reader; // FileOutputStream out; ByteArrayOutputStream bos; PdfStamper stamper; try { // out = new FileOutputStream("C:\\Users\\xianyu\\Desktop\\PDF Test\\exportForm1.pdf");// 輸出流 reader = new PdfReader(fileName);// 讀取pdf模板 bos = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, bos); AcroFields form = stamper.getAcroFields(); int i = 0; java.util.Iterator<String> it = form.getFields().keySet().iterator(); while (it.hasNext()) { String name = it.next().toString(); form.setField(name, data.get(name).toString()); } stamper.setFormFlattening(true);//如果為false那麼生成的PDF檔案還能編輯,一定要設為true stamper.close(); //在建多一份document匯出。 Document doc = new Document(); PdfCopy copy = new PdfCopy(doc, ouputStream); doc.open(); PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1); copy.addPage(importPage); response.setHeader("Content-disposition", "formPDF"); response.setHeader("Content-type", "application/pdf;charset=utf-8"); response.setHeader("Content-disposition", "attachment;filename=formPDF.pdf"); response.setHeader("Pragma", "No-cache"); doc.close(); } catch (IOException e) { System.out.println(1); e.printStackTrace(); } catch (DocumentException e) { System.out.println(2); e.printStackTrace(); } finally { if (ouputStream != null) { ouputStream.close(); } } return new Message(Message.SUCCESS_CODE, "成功"); }
模板:
執行url:localhost:8081/pdf/editPDF
引數:attr={ "sendUnitName":"sendUnitName1", "annexFile":"annexFile1", "officerAdvice":"辦公室處理", "copyUnitNames":"抄送","year":"2018","subject":"主題詞", "sendUnitNames":"sendUnitNames1", "count":"10", "caption":"檔案標題", "writers":"擬稿","secondSign":"會籤會籤","primarySign":"簽發簽發","officerName":"核稿", "deptMgrAdvice":"部門負責人", "checkerName":"校對", "mounth":"3", "word":"1000","day":"26","mark":"頁", "order":"order2" }
執行截圖:
注:pdf空白處需先定義好標誌,此處pdf所用的標誌符就是各個屬性的key值。