2012-11-25 133 views
5

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

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

图像提取:

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应用程序中,而不是将它转换为文件。如果我不可能,那么当用户使用它时,我会坚持删除图像。

我的目的是要EXTRACT(NOT VIEW)来自PDF文件的文本和图像,并按顺序显示在android应用程序中。

+0

正如前面对其他问题的回应所述,人们在PDF中查看元素(文本或图像)的顺序并不一定以PDF的形式在手边呈现。因此,要匹配通用PDF中的解析图像和解析文本,必须提取两者的位置,并使用启发式方法在文本中锚定图像。即使你只在制定时想要按顺序获取图像,也必须提取/了解结构(多列?),并根据该结构分析图像位置。而如果在两栏文档中有一个图像在中心? ;) – mkl

回答

0

高层次的方法:

  1. 提取所有文本从文档,而无需关心阅读顺序
  2. 确定基于字符,二元语法分布和文本的语言卦
  3. 一次语言是已知的,您知道是使用LTR(从左到右)还是使用RTL阅读顺序
  4. 使用诸如每个字符的边界框以及语言和字体之类的信息,启发式地构建文本行(良好的初始度量可能是“连接t” WO如果他们大致在同一y位置和它们的x-立场之间的差距落在平均+ std_dev范围内)
  5. 一旦你已经建行,建段(类似于启发式前)
  6. 现在字符你有段落和文本的语言,你可以按照正确的顺序打印段落。

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

最简单的解决方案当然是有一个标记的PDF文档。标记文档包含关于哪些视觉元素以何种方式属于一起的信息。或者,简而言之,您不必关心制作线条和段落,这已经完成并标记出来。

相关问题