我已经完成了从 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 应用程序中按顺序显示。
最佳答案
高级方法:
- 从文档中提取所有文本,而不关心阅读顺序
- 根据字符、二元组和三元组的分布确定文本的语言
- 一旦熟悉了语言,您就知道是使用 LTR(从左到右)还是 RTL 阅读顺序
- 使用每个字符的边界框、语言和字体等信息,启发式地构建文本行(一个好的初始指标可能是“如果两个字符大致位于相同的 y 位置并且他们的 x 位置之间的差距落在平均值 + std_dev 范围内)
- 构建线条后,构建段落(与以前类似的启发式方法)
- 现在您有了段落和文本的语言,您可以按正确的顺序打印段落。
这是我在 iText 一直在研究的东西,这当然不是一项微不足道的任务。
最简单的解决方案当然是拥有一个带标签的 pdf 文档。标记文档包含有关哪些视觉元素以何种方式属于一起的信息。或者,简单地说,您不必担心构建行和段落,这些已经完成并已标记。
关于java - 如何在 Android 上使用 iText 从 PDF 文件中按顺序提取图像和文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13547359/