1. 程式人生 > >PDF筆記(一):Itext 的基礎知識

PDF筆記(一):Itext 的基礎知識

<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需要合併。