java - 如何在 Android 上使用 iText 从 PDF 文件中按顺序提取图像和文本

标签 java android pdf itext

我已经完成了从 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 应用程序中按顺序显示。

最佳答案

高级方法:

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

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

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

关于java - 如何在 Android 上使用 iText 从 PDF 文件中按顺序提取图像和文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13547359/

相关文章:

java - 从Object.notifyAll中唤醒的线程在哪里并且获取锁失败?

java - 增加可用内核和 RAM 的数量是否会导致 JVM 执行更多的 GC?

java - 在 JAVA 中将 PDF 打印为字节数组

python - 下载多个 PDF 时出现问题

Java prepairedStatement setInt 在 SQL 中添加引号

java - 如何将方法中的值存储到数组中?

android - 如何根据项目的更多点击次数更改网格项目的位置

javascript - 使用 Phonegap 的 Android 设备视频

android - 如何从文件夹运行./gradlew命令?

ios - 如何在ios中正确读取pdf中的中文