6

我已经完成了从 PDF 中提取文本,但现在我想提取图像。第一个问题是图像位于每页文本之间。我想知道的是如何按顺序提取图像,即使文件是每页 2 列,以及如何确定图像在文本中的位置。

这是我尝试过的一些代码。

图像提取:

ExtractImages.java:
public static final String RESULT = "results/part4/chapter15/Img%s.%s";
public void extractImages(String filename)
    throws IOException, DocumentException {
    PdfReader reader = new PdfReader(filename);
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    MyImageRenderListener listener = new MyImageRenderListener(RESULT);
    for (int i = 1; i <= reader.getNumberOfPages(); i++) {
        parser.processContent(i, listener);
    }
}

MyImageRenderListener:
public MyImageRenderListener(String path) {
    this.path = path;
}

public void renderImage(ImageRenderInfo renderInfo) {
    try {
        String filename;
        FileOutputStream os;
        PdfImageObject image = renderInfo.getImage();
        if (image == null) return;
        filename = String.format(path, renderInfo.getRef().getNumber(), image.getFileType());
        os = new FileOutputStream(filename);
        os.write(image.getImageAsBytes());
        os.flush();
        os.close();
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}

该代码处理 pdf 的内容并检查图像,然后将这些图像渲染为图像文件(.png、.jpg 等)。

我在这里遇到的问题是它没有按顺序提取图像。我希望图像按顺序排列,所以我会知道页面中的第一个图像和最后一个图像。我怎么做?那么,是否可以在不将其渲染到文件的情况下提取图像?我对图像的目标是在我的 android 应用程序中将其显示为图像而不将其转换为文件。如果我不可能,那么当用户完成使用它时,我会坚持删除图像。

我的目的是从 pdf 文件中提取(不查看)文本和图像,并在 android 应用程序中按顺序显示。

4

1 回答 1

1

高级方法:

  1. 从文档中提取所有文本,而不关心阅读顺序
  2. 根据字符、二元组和三元组的分布确定文本的语言
  3. 一旦知道语言,您就知道是使用 LTR(从左到右)还是 RTL 阅读顺序
  4. 使用诸如每个字符的边界框、语言和字体之类的信息,启发式地构建文本行(一个好的初始度量可能是“如果两个字符大致位于相同的 y 位置并且它们之间的间隙x 位置在平均值 + std_dev 范围内)
  5. 一旦你建立了线条,建立段落(与以前类似的启发式)
  6. 现在您有了段落和文本的语言,您可以按正确的顺序打印出段落。

这是我在 iText 一直在研究的东西,这当然不是一项简单的任务。

最简单的解决方案当然是有一个带标签的 pdf 文档。标记文档包含有关哪些视觉元素以何种方式属于一起的信息。或者,简单地说,您不必担心自己已​​经完成并标记了行和段落。

于 2017-07-27T14:58:53.507 回答