PDF筆記(一):Itext 的基礎知識
阿新 • • 發佈:2019-02-02
<span style="font-family:SimSun;"> // 迴圈解析模板定義的表單域 int len = 4; for (Map.Entry<String, Item> entry : acroFieldMap.entrySet()) { // 獲得塊名 String fieldName = entry.getKey(); String fieldValue = "fill_" + len; System.out.println(fieldName + ":" + fieldValue); form.setField(fieldName, fieldValue); len++; } // 模板中的變數賦值之後不能編輯 mPdfStamper.setFormFlattening(true); reader.close();// 閱讀器關閉,解析器暫時不關閉,因為建立動態表格還需要使用 mPdfStamper.close();</span>
5、完整程式碼如下:模板為上面截圖模板:
<span style="font-family:SimSun;">package pdf.templete; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Map; import java.util.Random; import com.itextpdf.text.pdf.AcroFields; import com.itextpdf.text.pdf.AcroFields.Item; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; /** * * @Title: 利用PDF模板 * @Description: * @Copyright: Copyright (c) 2014 * @Company: SinoSoft * * @author: ShaoMin * @version: 1.0 * @CreateDate:Nov 4, 2014 */ public class PdfTempleteWithIText { /** * @author ShaoMin * @param args */ public static void main(String[] args) { PdfTempleteWithIText pdfTemplete = new PdfTempleteWithIText(); try { // 1-給PDF表單域賦值 pdfTemplete.fillFormDatas(); // 2-給PDF表格賦值 pdfTemplete.fillTableDatas(); } catch (Exception e) { e.printStackTrace(); } } /** * 獲取模板表單,並賦值 固定用法 * * @author ShaoMin * @throws Exception */ public void fillFormDatas() throws Exception { // 1-封裝的資料,這邊的key與pdf模板的域名保持一致 Map<String, String> mMapDatas = new HashMap<String, String>(); mMapDatas.put("CustomerName", "SAM-SHO");// 客戶姓名 mMapDatas.put("ContNo", "123456789098765");// 合同號 mMapDatas.put("ContCount", "1");// 保單個數 mMapDatas.put("EdorType", "CT-退保");// 保全型別 mMapDatas.put("GetMoney", "999.99");// 保全失算金額 mMapDatas.put("AcceptName", "人壽保險");// 受理人 mMapDatas.put("AcceptDate", "2014-11-1");// 受理日期 // 2-模板和生成的pdf Random a = new Random(); a.nextInt(); String tPdfTemplateFile = "source/pdf/templete/EdorTemplete.pdf";// 獲取模板路徑 String tPdfResultFile = "temp/pdf/Edor_" + a.nextInt() + ".pdf";// 生成的檔案路徑 // 3-解析PDF模板 FileOutputStream fos = new FileOutputStream(tPdfResultFile);// 需要生成PDF PdfReader reader = new PdfReader(tPdfTemplateFile);// 模板 PdfStamper mPdfStamper = new PdfStamper(reader, fos);// 解析 // 4-獲取到模板上預定義的引數域 AcroFields form = mPdfStamper.getAcroFields(); // 獲取模板中定義的變數 Map<String, Item> acroFieldMap = form.getFields(); // 迴圈解析模板定義的表單域 for (Map.Entry<String, Item> entry : acroFieldMap.entrySet()) { // 獲得塊名 String fieldName = entry.getKey(); String fieldValue = mMapDatas.get(fieldName);// 通過名字,獲取傳入的引數值 if (!"".equals(fieldValue)) { // 為模板中的變數賦值(key與pdf模板定義的域名一致) form.setField(fieldName, fieldValue); System.out.println(fieldName + "," + fieldValue); } } // 模板中的變數賦值之後不能編輯 mPdfStamper.setFormFlattening(true); reader.close();// 閱讀器關閉,解析器暫時不關閉,因為建立動態表格還需要使用 mPdfStamper.close(); } /** * 給PDF表格賦值 值動態的,一般建議使用模板, 直接建立絕對位置的表格 * * @author ShaoMin * @throws Exception */ public void fillTableDatas() throws Exception { // 1-模板和生成的pdf String tPdfTemplateFile = "source/pdf/templete/EdorTemplete.pdf";// 獲取模板路徑 String tPdfResultFile = "temp/pdf/Edor_" + new Random().nextInt() + ".pdf";// 生成的檔案路徑 // 2-解析PDF模板 FileOutputStream fos = new FileOutputStream(tPdfResultFile);// 需要生成PDF PdfReader reader = new PdfReader(tPdfTemplateFile);// 模板 PdfStamper mPdfStamper = new PdfStamper(reader, fos);// 解析 // 3-獲取到模板上預定義的引數域 AcroFields form = mPdfStamper.getAcroFields(); // 獲取模板中定義的變數 Map<String, Item> acroFieldMap = form.getFields(); // 迴圈解析模板定義的表單域 int len = 4; for (Map.Entry<String, Item> entry : acroFieldMap.entrySet()) { // 獲得塊名 String fieldName = entry.getKey(); String fieldValue = "fill_" + len; System.out.println(fieldName + ":" + fieldValue); form.setField(fieldName, fieldValue); len++; } // 模板中的變數賦值之後不能編輯 mPdfStamper.setFormFlattening(true); reader.close();// 閱讀器關閉,解析器暫時不關閉,因為建立動態表格還需要使用 mPdfStamper.close(); } }</span>
(九)、合併PDF-——核心是合併舊的,生成新的PDF
1、涉及的核心類:PdfReader,PdfCopy(PdfWriter的子類)
2、實現:2次迴圈
1)第一層迴圈:PDF合併的檔案個數,有幾個PDF需要合併。