PdfBox文字定位并且插入图片

2022-02-14  本文已影响0人  后来猫走丢了

Github地址

PDF文字定位插入图片

核心库

<!--    PDF解析核心    -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.22</version>
</dependency>

效果示例

所有演示基于AllPdfSearch

普通文档PDF

// 传入需要查找的文字和图片插入时需要定位的文字下标
PrintTextLocations stripper = new PrintTextLocations("审核单位盖章", 5);
image
PrintTextLocations stripper = new PrintTextLocations("授权签署人签字", 6);
image
可以看到图片定位到下标5的"章"字,以及下标6的"字"字

特殊类PDF

image
PrintTextLocations stripper = new PrintTextLocations("北京/广州办事处", 7);
image

核心代码

@Override
protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
    for (int i = 0; i < textPositions.size(); i++) {
        TextPosition textInfo = textPositions.get(i);
        String pdfStringTxt = textInfo.getUnicode();
        List<String> targetStringList = List.of(this.targetString.split(""));
        int targetSize = targetStringList.size();
        String firstString = targetStringList.get(0);
        boolean findTarget = false;
        // 打印文字
//            log.info("{}, X: {}, Y: {}", pdfStringTxt, textInfo.getX(), textInfo.getY());
        if (firstString.equals(pdfStringTxt)) {
            for (int j = 1; j <targetSize; j++) {
                String nextString = targetStringList.get(j);
                if (i + targetSize <= textPositions.size()
                        && nextString.equals(textPositions.get(i + j).getUnicode())) {
                    findTarget = true;
                } else {
                    findTarget = false;
                    break;
                }
            }
            if (findTarget) {
                // 定位,只定位第一次出现
                // X轴定时时需要加上文字的宽度,让添加的图片定位准确
                fontSize = textPositions.get(i + targetIndex).getFontSizeInPt();
                xTarget = textPositions.get(i + targetIndex).getX();
                yTarget = textPositions.get(i + targetIndex).getY();
                break;
            }
        }
    }
}

提示

上一篇下一篇

猜你喜欢

热点阅读