java使用itext操作填充pdf模板,(根據一個模板生成多頁資料)
阿新 • • 發佈:2018-12-12
直接開始需要兩個jar包 itext-asian-5.2.0.jar和 itextpdf-5.5.6.jar ,我的業務邏輯可能比較複雜,在這裡我就簡單的提供一個demo ,需要的人自己按照自己的業務邏輯來改。 首先我們要用 Adobe Acrobat 來編輯pdf
簡單講講思路
1 .讀取到要填充的pdf 地址 2. 然後轉成PdfReader物件,代表一個pdf 3. 然後轉成PdfStamper 4. 獲取到 AcroFields s = ps.getAcroFields(); 5. 填充 s.setField(“表單裡面你寫的值” , 具體的要填充的資料); 6. 然後把pdf放到 PdfReader裡面,然後多個PdfReader直接往list裡面放就完事了 7. 合併成一個pdf,(可能多頁)
//我自己的資料來源 final List rows = pa.getRows(); //每一條資料代表一個pdf表格 List<PdfReader> list = new ArrayList(); try { PdfStamper sd = null; //記錄行 !我的業務需求 int NO = 1; //頁碼 !我的 業務需求 int page = 1; //不確定資料有多少,所以要無限迴圈 while (true) { String realPath = request.getSession().getServletContext().getRealPath("/");//專案路徑 //使用微軟雅黑字型顯示中文 BaseFont chinessFont = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); PdfReader reader = new PdfReader(realPath + "/Template/receiveMoney.pdf");//讀取 ByteArrayOutputStream bos = new ByteArrayOutputStream(); PdfReader pdfReader = null; //因為一頁有25條資料 if (rows.size() > 26) { //回去填充pdf的物件 PdfStamper ps = new PdfStamper(reader, bos); AcroFields s = ps.getAcroFields(); for (int j = 0; j < 25; j++) { int k = j + 1; s.setField("NO" + k, NO + ""); BasicDBObject basicDBObject2 = (BasicDBObject) rows.get(0); if (basicDBObject2.get("SN") != null) { **//仔細看這裡,具體填充** s.setField("SN" + k, basicDBObject2.get("SN").toString()); } if (basicDBObject2.get("CompanyName") != null) { s.setFieldProperty("CompanyName" + k, "textfont", chinessFont, null); //設定中文格式 s.setField("CompanyName" + k, basicDBObject2.get("CompanyName").toString()); } if (basicDBObject2.get("VATReward") != null) { s.setField("VATReward" + k, basicDBObject2.get("VATReward").toString()); } if (basicDBObject2.get("BusinessTaxReward") != null) { s.setField("BusinessTaxReward" + k, basicDBObject2.get("BusinessTaxReward").toString()); } if (basicDBObject2.get("BIncomeTaxReward") != null) { s.setField("BIncomeTaxReward" + k, basicDBObject2.get("BIncomeTaxReward").toString()); } if (basicDBObject2.get("PIncomeTaxReward") != null) { s.setField("PIncomeTaxReward" + k, basicDBObject2.get("PIncomeTaxReward").toString()); } if (basicDBObject2.get("ChangeTaxReward") != null) { s.setField("ChangeTaxReward" + k, basicDBObject2.get("ChangeTaxReward").toString()); } if (basicDBObject2.get("Totals") != null) { s.setField("Totals" + k, basicDBObject2.get("Totals").toString()); } if (basicDBObject2.get("WithholdTotal") != null) { s.setField("WithholdTotal" + k, basicDBObject2.get("WithholdTotal").toString()); } //TODO 扣除預付款及代扣費 /* if(basicDBObject2.get("SN")!=null){ s.setField("SN"+j, basicDBObject2.get("SN").toString()); }*/ if (basicDBObject2.get("SupportAmount") != null) { s.setField("SupportAmount" + k, basicDBObject2.get("SupportAmount").toString()); } NO++; rows.remove(0); } BasicDBObject object = (BasicDBObject) rows.get(0); Object startHandleDate = object.get("StartHandleDate"); if (startHandleDate != null && !startHandleDate.toString().equals("")) { String[] split = startHandleDate.toString().split("-"); String s1 = split[0] + split[1]; int days = QzUtil.getDays(Integer.parseInt(split[0]), Integer.parseInt(split[1])); s.setField("ReceiveData", split[0] + split[1] + "01" + "~" + s1 + days + ""); } s.setField("User", getSessionUser().getUsername()); s.setField("CrrentData", DateUtil.getDay()); s.setField("Page", page + ""); page++; ps.close(); pdfReader = new PdfReader(bos.toByteArray()); list.add(pdfReader); //沒到25條的 } else { PdfStamper ps = new PdfStamper(reader, bos); AcroFields s = ps.getAcroFields(); for (int j = 0; j < rows.size(); j++) { //填充模板pdf int k = j + 1; s.setField("NO" + k, NO + ""); BasicDBObject basicDBObject2 = (BasicDBObject) rows.get(j); if (basicDBObject2.get("SN") != null) { s.setField("SN" + k, basicDBObject2.get("SN").toString()); } if (basicDBObject2.get("CompanyName") != null) { s.setFieldProperty("CompanyName" + k, "textfont", chinessFont, null); //設定中文格式 s.setField("CompanyName" + k, basicDBObject2.get("CompanyName").toString()); } if (basicDBObject2.get("VATReward") != null) { s.setField("VATReward" + k, basicDBObject2.get("VATReward").toString()); } if (basicDBObject2.get("BusinessTaxReward") != null) { s.setField("BusinessTaxReward" + k, basicDBObject2.get("BusinessTaxReward").toString()); } if (basicDBObject2.get("BIncomeTaxReward") != null) { s.setField("BIncomeTaxReward" + k, basicDBObject2.get("BIncomeTaxReward").toString()); } if (basicDBObject2.get("PIncomeTaxReward") != null) { s.setField("PIncomeTaxReward" + k, basicDBObject2.get("PIncomeTaxReward").toString()); } if (basicDBObject2.get("ChangeTaxReward") != null) { s.setField("ChangeTaxReward" + k, basicDBObject2.get("ChangeTaxReward").toString()); } if (basicDBObject2.get("Totals") != null) { s.setField("Totals" + k, basicDBObject2.get("Totals").toString()); } if (basicDBObject2.get("WithholdTotal") != null) { s.setField("WithholdTotal" + k, basicDBObject2.get("WithholdTotal").toString()); } if (basicDBObject2.get("SupportAmount") != null) { s.setField("SupportAmount" + k, basicDBObject2.get("SupportAmount").toString()); } NO++; } BasicDBObject object = (BasicDBObject) rows.get(0); Object startHandleDate = object.get("StartHandleDate"); if (startHandleDate != null && !startHandleDate.toString().equals("")) { String[] split = startHandleDate.toString().split("-"); String s1 = split[0] + split[1]; int days = QzUtil.getDays(Integer.parseInt(split[0]), Integer.parseInt(split[1])); s.setField("ReceiveData", split[0] + split[1] + "01" + "~" + s1 + days + ""); } s.setField("User", getSessionUser().getUsername()); s.setField("CrrentData", DateUtil.getDay()); s.setField("Page", page + ""); page++; ps.close(); pdfReader = new PdfReader(bos.toByteArray()); list.add(pdfReader); // sd = new PdfStamper(pdfReader, response.getOutputStream()); break; } } //上面已經獲得了pdf的每一頁,這裡我只需要合併成為一個pdf,然後返回 Document document = new Document(); PdfCopy copy = new PdfCopy(document, response.getOutputStream()); document.open(); for (int k = 0; k < list.size(); k++) { PdfReader pdfReader = list.get(k); document.newPage(); copy.addDocument(pdfReader); } copy.close(); } catch (Exception e) { e.printStackTrace(); }
對了返回的格式要加下
@RequestMapping(value = "/queryReceiveMoneyePrint.do", produces = "application/pdf;charset=UTF-8")
頁面
<object type="application/pdf" data="" id="review" data=“這裡寫後臺方法地址” style="width:1100px; height:1000px; "> </object>
程式碼質量有點差,大家湊合看。不懂的直接評論