【问题标题】:Extracting text locations from PDF从 PDF 中提取文本位置
【发布时间】:2015-03-19 21:40:02
【问题描述】:

我正在尝试在 PDF 中查找文本元素的位置。为此,我扩展了 PDFTextStripper。我正在使用multi-page LaTeX-produced PDF 进行测试。

public class TextFinder extends PDFTextStripper {
    private static final Logger logger =
        LoggerFactory.getLogger(TextFinder.class);

    private PDRectangle mediaBox;

    public static class CMProcessor extends OperatorProcessor {

        @Override
        public void process(PDFOperator operator, List<COSBase> arguments)
                throws IOException {

            if ("cm".equals(operator.getOperation())) {
                logger.debug("CM operation");
            }
        }
    }

    private CMProcessor cmProcessor = new CMProcessor();

    public TextFinder() throws IOException {
        this.registerOperatorProcessor("cm", cmProcessor);
    }

    @Override
    protected void startPage(PDPage page) throws IOException {
        super.startPage(page);
        mediaBox = page.findMediaBox();
        logger.debug(String.format("MEDIA (%f,%f) (%f,%f)",
            mediaBox.getLowerLeftX(), mediaBox.getLowerLeftY(),
            mediaBox.getUpperRightX(), mediaBox.getUpperRightY()));
    }

    @Override
    protected void writeString(String text, List<TextPosition> textPositions)
            throws IOException {
        for (TextPosition position : textPositions) {
            float x = position.getXDirAdj();
            float y = mediaBox.getHeight() - position.getYDirAdj();
            logger.debug(String.format("(%f,%f) (%f,%f)", x, y,
                x + position.getWidthDirAdj(), y + position.getHeightDir()));
        }
        super.writeString(text, textPositions);
    }
}

我面临的问题是,所有位置似乎都被转换为 (0, 0) 是最左边文本元素的坐标:

MEDIA (0.000000,0.000000) (595.270020,841.890015)
(0.000000,0.000000) (11.486961,14.255401)
(11.486961,0.000000) (20.660002,14.255401)
(20.660002,0.000000) (36.733482,14.255401)

感谢 mkl,问题是由自定义 OperatorProcessor 引起的。没有它,它工作得很好。但我需要操作员处理器,因为我用它来查找图像。我还是不太明白,为什么添加自定义处理器会影响 PDFTextStripper 的行为。

【问题讨论】:

  • 我只是试图重现您的问题。但是,运行您的代码,我得到不同的坐标,尤其是不是从 0,0 开始。您使用哪个 PDFBox 版本?我使用 1.8.8 进行了测试。如果我没记错的话,曾经有一个版本,其中writeString 检索了一个错误的textPositions 列表。
  • 对不起,我的错。我没有在 sn-p 中添加自定义 OperatorProcessor,这实际上导致了这个问题。
  • 我还是不太明白,为什么添加自定义处理器会影响 PDFTextStripper 的行为。 - 实际上你没有添加而是替换现有的,以及转换矩阵在确定位置的情况下非常重要。
  • 我将评论作为实际答案。

标签: java pdf text position pdfbox


【解决方案1】:

为什么添加自定义处理器会影响 PDFTextStripper 的行为。

原因是你的添加

registerOperatorProcessor("cm", cmProcessor);

实际上替换现有的处理器。原始位置对于确定页面上的正确位置很重要。

解决方案是链接处理器。

【讨论】:

  • 我已经通过覆盖PDFStreamEngine.processOperator(PDFOperator operator, List&lt;COSBase&gt; arguments) 而不是使用OperatorProcessor 解决了这个问题。
  • 这本质上也是链接。您只需链接 processOperator 调用而不是 Processor.process 调用。
猜你喜欢
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 2017-03-10
  • 2011-09-30
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多