【发布时间】: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