You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找PDF中指定文本的坐标并在对应位置绘制图片?

定位PDF文本并绘制图片的完整实现

我来帮你补全这部分缺失的代码逻辑,核心是先精准捕获目标文本的坐标信息,再根据这个位置计算图片的放置点,最后完成绘制。下面是基于PDFBox的完整实现:

步骤1:自定义文本提取器捕获目标文本坐标

我们需要继承PDFTextStripper,重写writeString方法来记录目标文本的边界框(包含x、y坐标和文本宽高):

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

class TargetTextLocator extends PDFTextStripper {
    private final String targetText;
    private final List<TextPosition[]> targetTextPositions = new ArrayList<>();

    public TargetTextLocator(String targetText) throws IOException {
        this.targetText = targetText;
    }

    @Override
    protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
        if (text.contains(targetText)) {
            // 捕获包含目标文本的文本块位置
            targetTextPositions.add(textPositions.toArray(new TextPosition[0]));
        }
        super.writeString(text, textPositions);
    }

    public List<TextPosition[]> getTargetTextPositions() {
        return targetTextPositions;
    }
}

步骤2:整合代码完成定位与绘制

把这段逻辑和你已有的代码结合,找到目标文本的坐标后,计算图片的放置位置(这里示例放在文本下方,你也可以调整为右侧):

// 你的已有代码部分
BufferedImage image = resizeImage(base64Picture, pictureScaling);
try (PDDocument document = PDDocument.load(base64Pdf)) {
    int lastPage = document.getNumberOfPages() - 1;
    PDPage page = document.getPage(lastPage);
    
    // 1. 定位目标文本"My car"的坐标
    TargetTextLocator textLocator = new TargetTextLocator("My car");
    textLocator.setStartPage(lastPage);
    textLocator.setEndPage(lastPage);
    textLocator.getText(document);
    
    List<TextPosition[]> targetPositions = textLocator.getTargetTextPositions();
    if (!targetPositions.isEmpty()) {
        // 获取目标文本块的第一个字符位置作为基准(也可以取整个文本块的边界)
        TextPosition firstChar = targetPositions.get(0)[0];
        TextPosition lastChar = targetPositions.get(0)[targetPositions.get(0).length - 1];
        
        // 计算文本的边界:x起始坐标,y起始坐标,文本宽度,文本高度
        float textX = firstChar.getXDirAdj();
        float textY = firstChar.getYDirAdj();
        float textWidth = lastChar.getXDirAdj() + lastChar.getWidthDirAdj() - textX;
        float textHeight = firstChar.getHeightDir();
        
        // 2. 计算图片放置位置:示例放在文本下方,y坐标减去图片高度和间距
        float imageX = textX;
        float imageY = textY - image.getHeight() * pictureScaling - 5; // 5是间距
        float imageWidth = image.getWidth() * pictureScaling;
        float imageHeight = image.getHeight() * pictureScaling;
        
        // 3. 绘制图片
        PDImageXObject pdImage = LosslessFactory.createFromImage(document, image);
        try (PDPageContentStream contents = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, false)) {
            contents.drawImage(pdImage, imageX, imageY, imageWidth, imageHeight);
        }
    }
    
    // 保存修改后的PDF(这里可以根据需求输出到文件或流)
    document.save("modified_pdf.pdf");
} catch (IOException e) {
    e.printStackTrace();
}

关键说明

  • 坐标系统注意:PDF的坐标原点在页面左下角,y值向上递增,所以要放在文本下方的话,需要用文本的y坐标减去图片高度。
  • 文本块边界:如果目标文本跨多个文本块,你可能需要遍历targetTextPositions里的所有元素,合并边界框来获取完整的文本范围。
  • 资源关闭:务必用try-with-resources来自动关闭PDDocument和PDPageContentStream,避免资源泄漏。

内容的提问来源于stack exchange,提问作者user7327905

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:20:33