如何查找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
相关产品推荐
相关产品推荐

