1. 程式人生 > >java使用itext操作填充pdf模板,(根據一個模板生成多頁資料)

java使用itext操作填充pdf模板,(根據一個模板生成多頁資料)

直接開始需要兩個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>

程式碼質量有點差,大家湊合看。不懂的直接評論