-1

我有 2 列格式的 pdf。我能够将其解析为简单的文本,但这些 pdf 之间也有图像。结果,对于中间有图像的pdf的特定页面,我的文本输出变得混乱。

例如,考虑 2 列页面格式

图像文本2

图像图像

图片文字3

文本 1 图像

    Text4   

输出是 Text4 Text3 Text2 Text1 而不是 Text1 Text2 Text3 Text4

有什么解决方案可以按正确的顺序阅读文本吗?

我正在使用以下代码

public void parsePdf(String pdf, String txt) throws IOException {

    PdfReader reader = new PdfReader(pdf);
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    PrintWriter out = new PrintWriter(new FileOutputStream(txt));
    TextExtractionStrategy strategy;
    for (int i = 76; i <= reader.getNumberOfPages(); i++) {
       strategy = parser.processContent(i, new SimpleTextExtractionStrategy());
        out.println(strategy.getResultantText());
    }
    out.flush();
    out.close();
}
4

1 回答 1

0

您正在使用 SimpleTextExtractionStrategy。此策略假设页面内容中的字母组已经处于合理的顺序。尝试使用 LocationTextExtractionStrategy 来对这些字母组进行排序。

不过,您似乎更喜欢有趣的顺序。根据你的问题,你想得到Text1 Text2 Text3 Text4 for

Image Text2
Image Image
Image Text3
Text1 Image
      Text4

但是,LocationTextExtractionStrategy 将主要从上到下排序,其次是从左到右。因此,您将获得Text2 Text3 Text1 Text4。根据您的要求,您应该复制 LocationTextExtractionStrategy 并将其更改为按照您需要的方式对文本片段进行排序。

但是,如果所需的顺序是由于内容被解释为两列,您可能希望通过过滤策略输入来分别解析列:

Rectangle rect = new Rectangle(x1, y1, x2, y2);
RenderFilter filter = new RegionTextRenderFilter(rect);
TextExtractionStrategy strategy = new FilteredTextRenderListener(
    new LocationTextExtractionStrategy(), filter);

授予 iText in Action,第 2 版示例ExtractPageContentArea

问候,迈克尔

于 2012-10-23T10:48:08.443 回答