【java】java实现pdf根据内容定位插入图片

10 篇文章 0 订阅

java实现pdf根据内容定位插入图片

1.导入jar包
<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext7-core</artifactId>
            <version>7.1.12</version>
            <type>pom</type>
        </dependency>
2.实现类
package test;


import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.parser.PdfDocumentContentParser;
import com.itextpdf.kernel.pdf.canvas.parser.listener.IPdfTextLocation;
import com.itextpdf.kernel.pdf.canvas.parser.listener.RegexBasedLocationExtractionStrategy;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;



import java.util.Collection;

public class Test {
    public static void main(String[] args)  throws Exception {
        String input = "D:\\te1.pdf";
        //通过指定pdf文件名,指定关键字,和指定的pdf文件的待处理页数做参数
        getKeyWordsLocation(input, "甲方:", 1);

    }
    /**
     * 得到关键字位置
     * @param input 源文件
     * @param KEY_WORD 关键字
     * @param pageNum 文档页数
     */
    public static void getKeyWordsLocation(String input, String KEY_WORD, int pageNum) {
        RegexBasedLocationExtractionStrategy strategy = new RegexBasedLocationExtractionStrategy(KEY_WORD);
        try {
            //得到需要插入的图片
            ImageData imageData = ImageDataFactory.create("D:\\1.jpg");
            //核心思路为对PdfDocument对象采用某种Strategy,这里使用RegexBasedLocationExtractionStrategy
            PdfReader pr = new PdfReader(input);
            //生成新的PDF文件
            PdfDocument pd = new PdfDocument(pr, new PdfWriter("D:\\test.pdf"));
            //pageNum = pd.getNumberOfPages();
            Document document = new Document(pd);
            PdfDocumentContentParser pdcp = new PdfDocumentContentParser(pd);
            //文本内容具体解析借助使用PdfDocumentContentParser类(实质使用PdfCanvasProcessor进行处理), 对待处理页面装配合适策略
            RegexBasedLocationExtractionStrategy regexStrategy = pdcp.processContent(pageNum, strategy);
            //获取处理结果
            Collection<IPdfTextLocation> resultantLocations = strategy.getResultantLocations();
            //自定义结果处理
            if (!resultantLocations.isEmpty()) {
                for (IPdfTextLocation item : resultantLocations) {
                    Rectangle boundRectangle = item.getRectangle();
                    System.out.println(item.getText());
                    System.out.println("关键字“" + KEY_WORD + "” 的坐标为 x: " + boundRectangle.getX() + "  ,y: " + boundRectangle.getY());
                    Image image = new Image(imageData).scaleAbsolute(70, 20).setFixedPosition(pageNum, boundRectangle.getRight() + 5f, boundRectangle.getBottom());
                    document.add(image);
                }
                document.close();
            } else {
                System.out.println("结果为空");
            }
            pr.close();
            pd.close();
        } catch (Exception e) {
            System.err.println("读取文件失败!");
            e.printStackTrace();
        }
    }
    
}

3.实现效果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值