經過填充表單的方式生成pdf文件

彙總一些pdf tools

生成pdf有多種方法,這裏demo一個經過變量填充帶表單的pdf模板的方法,相對比較簡單,也比較乾淨(相對於一個一個元素的拼接出來一個pdf文件)git

適用場景

需求方提供給咱們對應的word或者pdf模板,根據模板添加對應的數據以後導出pdf文件

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>
複製代碼

步驟

一、需求方提供模板 如:test.docx

image

二、使用office打開以後保存爲test.pdf

三、使用adobe Acrobat 添加表單test_form.pdf

image

四、使用工具類填充模板文件 test_form.pdf

示例中支持文本框、checkbox、radio、插入圖片,添加水印的話,google一下會有不少現成的代碼github

注意點

一、checkbox在編輯表單時注意添加選項-導出值不能使用中文 這裏使用的true bash

image
二、注意圖片的處理方式,具體參考代碼

代碼

/**
     * 
     * @param dataMap 表單參數
     * @param templateFilePath 模板路徑
     * @throws Exception
     */
    public static void createPDFAndDownload(Map<String, Object> dataMap, String templateFilePath) throws Exception {
        /* 使用中文字體 */
        BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
        fontList.add(bf);

        PdfReader reader = new PdfReader(PdfUtil.class.getClassLoader().getResourceAsStream("templates/" + templateFilePath));
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        PdfStamper ps = new PdfStamper(reader, bos);
        AcroFields fields = ps.getAcroFields();
        fields.setSubstitutionFonts(fontList);
        fillData(fields, dataMap, ps);
        /* 必需要調用這個,不然文檔不會生成的 */
        ps.setFormFlattening(true);
        ps.close();

        //輸出到本地指定目錄
        File file = new File("D:\\result.pdf");
        bos.writeTo(new FileOutputStream(file));
        bos.close();

        //直接輸出到response下載
//        response.setHeader("Content-Disposition",
//                "attachment; filename=" + new String(fileName.getBytes(charset), "iso8859-1"));
//        byte[] result = bos.toByteArray();
//        response.setContentLength(result.length);
//        OutputStream os = null;
//        os = response.getOutputStream();
//        os.write(result, 0, result.length);
//        os.flush();
//        os.close();

    }
複製代碼

填充數據maven

/**
     * 
     * @param fields
     * @param data
     * @param ps
     * @throws IOException
     * @throws DocumentException
     */
    public static void fillData(AcroFields fields, Map<String, Object> data, PdfStamper ps) throws IOException, DocumentException {
        for (String key : data.keySet()) {
            if (key.endsWith("Checkbox")) {
                fields.setField(key, "" + data.get(key));
            } else if (key.endsWith("Image")) {
                int pageNo = fields.getFieldPositions(key).get(0).page;
                Rectangle signRect = fields.getFieldPositions(key).get(0).position;
                float x = signRect.getLeft();
                float y = signRect.getBottom();
                // 讀圖片
                //key resources 下的相對路徑
                Image image = Image.getInstance(PdfUtil.class.getClassLoader().getResource((String) data.get(key)));
                // 獲取操做的頁面
                PdfContentByte under = ps.getOverContent(pageNo);
                // 根據域的大小縮放圖片
                image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                // 添加圖片
                image.setAbsolutePosition(x, y);
                under.addImage(image);
            } else if (key.endsWith("Radio")) {
                String value = data.get(key) + "";
                fields.setField(key, value); // 爲字段賦值,注意字段名稱是區分大小寫的
            } else {
                String value = data.get(key) + "";
                fields.setField(key, value); // 爲字段賦值,注意字段名稱是區分大小寫的
            }
        }
    }
複製代碼

main方法測試工具

public static void main(String[] args) {
        Map<String, Object> dataMap = new HashMap<String, Object>();
        //文本
        dataMap.put("code", "1234");
        //checkbox
        dataMap.put("checkbox1", "true");
        //插入圖片 非水印
        dataMap.put("testImage", "images/1.gif");
        //radio
        dataMap.put("testRadio", "select1");
        dataMap.put("testRadio", "select2");
        try {
            createPDFAndDownload(dataMap, "test_form.pdf");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
複製代碼

demo測試

相關文章
相關標籤/搜索