使用itext为PDF添加批注文字

maven依赖

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.12</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-pdfa</artifactId>
    <version>5.5.12</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-xtra</artifactId>
    <version>5.5.12</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-imaging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.itextpdf.tool</groupId>
    <artifactId>xmlworker</artifactId>
    <version>5.5.12</version>
</dependency>

辅助实体类

@Data
public class PdfAddContentParm {

    // 要添加的文字
    private String content;

    // 页码
    private Integer pageNum;

    // 关键字
    private String keyword;

    // 文本框坐标(左下角x,y,右上角x,y)
    private Float llx;
    private Float lly;
    private Float urx;
    private Float ury;

    public PdfAddContentParm() {
    }

    public PdfAddContentParm(String content, Integer pageNum, Float llx, Float lly, Float urx, Float ury) {
        this.content = content;
        this.pageNum = pageNum;
        this.llx = llx;
        this.lly = lly;
        this.urx = urx;
        this.ury = ury;
    }

    public PdfAddContentParm(String content,  String keyword, Float llx, Float lly, Float urx, Float ury) {
        this.content = content;
        this.keyword = keyword;
        this.llx = llx;
        this.lly = lly;
        this.urx = urx;
        this.ury = ury;
    }

}

按坐标添加批注

public static byte[] pdfAddContent(String filePath, List<PdfAddContentParm> pdfAddContentParms) throws Exception {


    PdfReader pdfReader = new PdfReader(filePath);

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

    //设置输入文件以及输出文件地址
    PdfStamper stamper = new PdfStamper(pdfReader, byteArrayOutputStream);
    //设置字体
    BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
    for (PdfAddContentParm pdfAddContentParm : pdfAddContentParms) {
        Font font = new Font(baseFont, 10);
        PdfContentByte overContent = stamper.getOverContent(pdfAddContentParm.getPageNum());
        ColumnText columnText = new ColumnText(overContent);

        columnText.setSimpleColumn(pdfAddContentParm.getLlx(), pdfAddContentParm.getLly(), pdfAddContentParm.getUrx(), pdfAddContentParm.getUry());

        Paragraph elements = new Paragraph(pdfAddContentParm.getContent());

        elements.setFont(font);
        columnText.addElement(elements);
        columnText.go();
    }


    stamper.close();

    return byteArrayOutputStream.toByteArray();

}

按关键字添加批注

思路是:定位到关键字---->获取关键字的坐标---->根据关键字的坐标偏移得到要添加批注的坐标---->按坐标添加批注

private static byte[] pdfAddContByKeyword(String filename, List<PdfAddContentParm> pdfAddContentParms) throws Exception {


    PdfReader pdfReader = new PdfReader(filename);
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    //设置输入文件以及输出文件地址
    PdfStamper stamper = new PdfStamper(pdfReader, byteArrayOutputStream);
    // 获取PDF文件的总页数
    int pageNum = pdfReader.getNumberOfPages();
    PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);

    for (PdfAddContentParm pdfAddContentParm : pdfAddContentParms) {

        StringBuilder stringBuilder = new StringBuilder("");

        final boolean[] hasKeyword = {false, true};

        String keyword = pdfAddContentParm.getKeyword();
        int length = keyword.length();

        for (int page = 1; page <= pageNum; page++) {
            if (hasKeyword[0]) {break;}

            int finalPage = page;
            pdfReaderContentParser.processContent(page, new RenderListener() {
                @Override
                public void beginTextBlock() {}

                @SneakyThrows
                @Override
                public void renderText(TextRenderInfo renderInfo) {
                    // 读取PDF文件的内容
                    String text = renderInfo.getText().trim();

                    stringBuilder.append(text);

                    if (stringBuilder.toString().contains(keyword)) {

                        Rectangle2D.Float boundingRectange = renderInfo.getBaseline().getBoundingRectange();

                        if (hasKeyword[1]) {
                            System.out.println(boundingRectange);
                            // 关键字的坐标
                            double x = boundingRectange.getX();
                            double y = boundingRectange.getY();

                            //设置字体
                            BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                            Font font = new Font(baseFont, 10);

                            PdfContentByte overContent = stamper.getOverContent(finalPage);
                            ColumnText columnText = new ColumnText(overContent);
                            // 根据关键字的坐标计算+偏移量得到批注字体的坐标
                            columnText.setSimpleColumn((float) x+pdfAddContentParm.getLlx(), (float)y+pdfAddContentParm.getLly(),
                                    (float) x+100+pdfAddContentParm.getUrx(), (float) y+pdfAddContentParm.getUry());

                            Paragraph elements = new Paragraph(pdfAddContentParm.getContent());

                            elements.setFont(font);
                            columnText.addElement(elements);
                            columnText.go();

                            hasKeyword[1] = false;
                        }

                        hasKeyword[0] = true;

                    }

                    if (stringBuilder.toString().length() > length * 3) {
                        stringBuilder.setLength(0);
                    }

                }

                @Override
                public void endTextBlock() {}
                @Override
                public void renderImage(ImageRenderInfo renderInfo) {}
            });


        }

    }

    stamper.close();
    pdfReader.close();
    return byteArrayOutputStream.toByteArray();
}

调用示例:

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


    // 按坐标添加批注
    PdfAddContentParm name = new PdfAddContentParm("张三", 2, 280F, 36F, 475F, 78F);
    PdfAddContentParm no = new PdfAddContentParm("02666666666SSS", 2, 425F, 36F, 550F, 78F);
    
    List<PdfAddContentParm> pdfAddContentParms = new ArrayList<>();
    Collections.addAll(pdfAddContentParms, prtno, year, month, day,name,no);

    byte[] bytes = pdfAddContent("/Users/yy/Desktop/pppp.pdf", pdfAddContentParms);

    new FileOutputStream("/Users/yy/Desktop/pppadd.pdf").write(bytes);

    
    // 按关键字批注
    PdfAddContentParm keyword = new PdfAddContentParm("112233", "尊敬的客户", 1F, 2F, 3F, 40F);
    PdfAddContentParm keyword1 = new PdfAddContentParm("112233", "销售人员签名:", 1F, 2F, 3F, 40F);

    List<PdfAddContentParm> pdfAddContentParms = new ArrayList<>();
    Collections.addAll(pdfAddContentParms, keyword,keyword1);

    byte[] bytes = pdfAddContByKeyword("/Users/yy/Desktop/pppp.pdf", pdfAddContentParms);
    new FileOutputStream("/Users/yy/Desktop/pppadd.pdf").write(bytes);


}

效果:

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值