java 根据PDF模板生成PDF文件并导出

1.准备操作的maven包

<dependency>
   <groupId>com.itextpdf</groupId>
   <artifactId>itextpdf</artifactId>
   <version>5.5.1</version>
</dependency>
<dependency>
   <groupId>com.itextpdf</groupId>
   <artifactId>itext-asian</artifactId>
   <version>5.2.0</version>
</dependency>

2.准备好你需要操作的PDF模板

3.准备好Adobe Acrobat Distiller DC 工具

4.使用Adobe Acrobat 打开你准备好的pdf模板,如图:

打开工具栏,找到准备表单

打开后,你就可以对你需要赋值的PDF表单进行字段的编辑,如下图:

5.使用Java 读取pdf文件

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;

/**
 * Created by gf on 2019/4/20.
 */
public class PDFUtil {

    public static void main(String[] args) throws Exception {

        test();

        System.out.println("success");

    }


    public static void test() throws IOException, DocumentException {
        // pdf模板
        String fileName = "E:/tools/停车场业务申请表.pdf";
        //读取pdf
        PdfReader reader = new PdfReader(fileName);

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        //将要生成的目标PDF文件名称
        PdfStamper ps = new PdfStamper(reader, bos);

        //PdfContentByte under = ps.getUnderContent(1);

        //设置中文字体
        BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

        ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();

        fontList.add(bf);

        //取出报表模板中的所有字段
        AcroFields fields = ps.getAcroFields();

        fields.setSubstitutionFonts(fontList);

        //对表单数据进行赋值
        fillData(fields, ps, data());

        //必须要调用这个,否则文档不会生成的
        ps.setFormFlattening(true);

        ps.close();

        OutputStream fos = new FileOutputStream("E:/new.pdf");

        fos.write(bos.toByteArray());

        fos.flush();

        fos.close();

        bos.close();

    }

    public static void fillData(AcroFields fields, PdfStamper ps, Map<String, String> data) throws IOException, DocumentException {
        // 为字段赋值,注意字段名称是区分大小写的
        for (String key : data.keySet()) {
            if (key.equals("image")){
                /**
                 * 添加图片
                 */
                String imgpath = data.get(key);
                int pageNo = fields.getFieldPositions(key).get(0).page;
                Rectangle signRect = fields.getFieldPositions(key).get(0).position;
                float x = signRect.getLeft();
                float y = signRect.getBottom();
                // 读图片
                Image image = Image.getInstance(imgpath);
                // 获取操作的页面
                PdfContentByte under = ps.getOverContent(pageNo);
                // 根据域的大小缩放图片
                image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                // 添加图片
                image.setAbsolutePosition(x, y);
                under.addImage(image);
            }else {
                String value = data.get(key);
                fields.setField(key, value);
            }
        }

    }

    public static Map<String, String> data() {

        Map<String, String> data = new HashMap<String, String>();

        data.put("name", "王强");

        data.put("idcard", "5303811111111111");

        data.put("phone", "18200000000");

        data.put("companyName", "XXXXXX公司");

        data.put("payTime", "2018年10月10日");

        //选择框的设置On为选中
        data.put("build", "On");

        data.put("house", "On");

        data.put("other", "Off");

//        data.put("building", "18208817655");
//
//        data.put("floor", "18208817655");

        data.put("first", "On");

//        data.put("again", "18208817655");

//        data.put("change", "18208817655");

        data.put("expireTime", "2018年10月10日");

        data.put("plate", "京A10101");

        data.put("amount", "768.25");

        return data;

    }

}

这样对pdf文件赋值就成功了,新手小白欢迎指正

 

  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值