使用iTextPdf为Pdf模板填充表单项

说明

日常开发中,通常会有动态填充Pdf表单的需求,程序可根据用户的输入或后台数据库的内容,动态、批量向Pdf模板中填充内容。

这里简单介绍一下Pdf模板的制作,以及通过iTextPdf组件给pdf Form表单进行内容填充。

Pdf模板制作

1、word中制作表格

使用Office word 或 WPS word,制作出一个表格,通过表格底色,颜色、字体设置、对齐等方式美化一下表格。

效果图如下:
在这里插入图片描述

2、word导出为pdf

可以使用WPS的另存为功能,将word导出为pdf文件
导出完的pdf文件,效果如下:
在这里插入图片描述

3、pdf模板制作

使用 “Adobe Acrobat DC” 软件,对已经生成的pdf文件进行表单项默认文本的替换。

在这里插入图片描述
操作方法:
A). 使用该软件打开上述pdf模板后,依次点击左上角菜单处“文档”–》右侧工具栏中“编辑PDF”;
B). 新的面板中可以看到左上角已出现“编辑PDF”菜单,在其下拉菜单中,选择最下方的“准备表单”项,这时可以看到所有的pdf表单项均被识别出来了;
C). 但是表单上面默认的文本项名称为类似“fill_1”这种文档,双击该文件,在弹窗中将其修改为业务字段名称,如下:
在这里插入图片描述
D). 修改适配完毕后,保存该表单pdf文件,为后续程序读写该文件做准备。

使用iTextPdf对pdf表单进行读写

iText(公司网址:https://itextpdf.com/en)是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

项目要使用iText,必须引入jar包才能使用,maven依赖如下:

<!-- 核心jar-->
 <dependency>
     <groupId>com.itextpdf</groupId>
     <artifactId>itextpdf</artifactId>
     <version>5.5.10</version>
</dependency>

<!-- 设置输出中文 -->
 <dependency>
     <groupId>com.itextpdf</groupId>
     <artifactId>itext-asian</artifactId>
     <version>5.2.0</version>
 </dependency>
 
<!-- 设置pdf文件密码 -->
<dependency>
     <groupId>org.bouncycastle</groupId>
     <artifactId>bcprov-jdk15on</artifactId>
     <version>1.54</version>
</dependency>

GenerateResumePDF.java代码清单:

package com.david.pdf;

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.*;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;

public class GenerateResumePDF {

    public static void resumeGenerate(Map<String, String> paramsMap) {
        String templatePath = "C:\\Users\\user\\Desktop\\pdf_template\\test-output-2.pdf";

        String outputPDFPath = "C:\\Users\\user\\Desktop\\pdf_template\\" + paramsMap.get("name") + "-" + paramsMap.get("phone") + ".pdf";

        PdfReader reader;
        FileOutputStream out;
        ByteArrayOutputStream bos;
        PdfStamper stamper;

        try {
            out = new FileOutputStream(outputPDFPath);
            reader = new PdfReader(templatePath);
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields(); //获取pdf上的表单集合,如name/phone

            //给表单添加中文字体
            BaseFont baseFont = BaseFont.createFont("C:\\Windows\\Fonts\\simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            form.addSubstitutionFont(baseFont);

            //遍历map插入数据
            for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
                form.setField(entry.getKey(), entry.getValue());
                System.out.println(String.format("插入PDF数据---> key=%13s, value=%5s", entry.getKey(), entry.getValue()));
            }



            //如果设置为false,那么生成的文件还能编辑,一般都需要设置为false
            stamper.setFormFlattening(true);
            stamper.close();

            //文档对象,包括header、footer、page信息、和页面元数据信息
            Document doc = new Document();
            //Make copies of PDF documents. Documents can be edited after reading and before writing them out.
            PdfCopy copy = new PdfCopy(doc, out);
            //文档打开,等待写入
            doc.open();
            //待写入的页面
            PdfImportedPage importedPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
            //添加页面
            copy.addPage(importedPage);
            doc.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }

    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("name", "david");
        map.put("age", "30");
        map.put("gender", "男");
        map.put("phone", "13666666666");
        map.put("email", "me@189.com");
        map.put("marriage", "未婚");
        map.put("jobyear", "2");
        map.put("education", "博士");
        map.put("location", "墨尔本");

        System.out.println("map = " + map);

        resumeGenerate(map);
    }

}

经过代码填充表单的pdf文件,效果如下图所示:
在这里插入图片描述
参考列表,致谢:

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
使用iTextPDF生成pdf填充自定义数据的步骤如下: 1. 首先,获取需要生成pdf的初始模板,包含格式,但不包含数据。可以使用工具如Adobe Acrobat来编辑pdf模板,在对应区域生成文本域,为每个域设置一个唯一的名称。 2. 在Java代码中,使用iTextPDF库来对pdf进行操作。首先,需要获取PdfReader对象,将模板文件加载为PdfReader对象。可以使用以下代码: ```java PdfReader reader = new PdfReader(templatePath); // templatePath是模板pdf文件的路径 ``` 3. 接下来,使用PdfStamper对象来填充数据并生成最终的pdf文件。可以使用以下代码: ```java PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputPath)); // outputPath是生成的pdf文件的路径 AcroFields fields = stamper.getAcroFields(); // 使用fields对象来填充文本域的数据 fields.setField("fieldName1", "fieldValue1"); fields.setField("fieldName2", "fieldValue2"); // 继续填充其他文本域的数据 // 最后,调用stamper的close方法来保存并关闭pdf文件 stamper.close(); ``` 4. 通过上述步骤,你可以使用iTextPDF将自定义数据填充pdf模板中,并生成最终的pdf文件。 请注意,以上代码只展示了主要的方法代码,并不是整个流程的逻辑代码。具体的实现可能会根据具体的需求和模板结构有所不同。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [java使用itextpdf生成pdf填充自定义数据](https://blog.csdn.net/qq_34244426/article/details/104833805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值