JAVA使用itext导出PDF,使用PDF模板导出PDF文件

1 篇文章 0 订阅
1 篇文章 0 订阅

1.使用工具编辑好PDF模板

本人使用的是(Adobe Acrobat DC),添加域,生成如下模板:

2.实现PDF导出

2.1导入itex相关包
<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.1导出PDF
// pdf模板
    String fileName = "D:/表1进度付款申请单.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);
    //取出报表模板中的所有字段
    AcroFields fields = ps.getAcroFields();
    fields.addSubstitutionFont(bf);
    //对表单数据进行赋值
    fields.setField("GCMC", "XXX工程市政工程");
    fields.setField("BDMC", "XXX标段");
    fields.setField("BH", "HT-0010");
    fields.setField("XMJLJG", "XXX建设监理有限公司");
    fields.setField("startData", "2021年09月16日");
    fields.setField("endData", "2021年09月16日");
    fields.setField("work", "2021年09月16日");
    fields.setField("U_ALL_MONEY", "贰仟壹佰捌拾贰万贰仟壹佰肆拾圆伍角壹分");
    fields.setField("L_ALL_MONEY", "21822140.51");
    fields.setField("JDK", "21822140.51");
    fields.setField("AQSGF", "21822140.51");
    fields.setField("YFK", "21822140.51");
    fields.setField("YKK", "0.51");
    fields.setField("ZFK", "0");
    fields.setField("Data", "2021年09月16日");
    //必须要调用这个,否则文档不会生成的
    ps.setFormFlattening(true);

    ps.close();

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

    fos.write(bos.toByteArray());

    fos.flush();

    fos.close();

    bos.close();

3.导出结果

在这里插入图片描述

4.其他

以上模板只用到文本,如有需要插入图片,以下代码可供参考

String imgpath =“图片路径”;
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);

示例

package util;

import com.itextpdf.text.*;
import com.itextpdf.text.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;

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 = "D:/表1进度付款申请单.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);
        //取出报表模板中的所有字段
        AcroFields fields = ps.getAcroFields();
        fields.addSubstitutionFont(bf);
        //对表单数据进行赋值
        //设置图片
        String imgpath = "D:/aa.png";
        int pageNo = fields.getFieldPositions("image").get(0).page;
        Rectangle signRect = fields.getFieldPositions("image").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);
        //添加文本
        fields.setField("GCMC", "XXX工程市政工程");
        fields.setField("BDMC", "XXX标段");
        fields.setField("BH", "HT-0010");
        fields.setField("XMJLJG", "XXX建设监理有限公司");
        fields.setField("startData", "2021年09月16日");
        fields.setField("endData", "2021年09月16日");
        fields.setField("work", "2021年09月16日");
        fields.setField("U_ALL_MONEY", "贰仟壹佰捌拾贰万贰仟壹佰肆拾圆伍角壹分");
        fields.setField("L_ALL_MONEY", "21822140.51");
        fields.setField("JDK", "21822140.51");
        fields.setField("AQSGF", "21822140.51");
        fields.setField("YFK", "21822140.51");
        fields.setField("YKK", "0.51");
        fields.setField("ZFK", "0");
        fields.setField("Data", "2021年09月16日");
        //必须要调用这个,否则文档不会生成的
        ps.setFormFlattening(true);
        ps.close();
        OutputStream fos = new FileOutputStream("E:/new1.pdf");
        fos.write(bos.toByteArray());
        fos.flush();
        fos.close();
        bos.close();
    }
}

模板

导出文件

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值