2012-11-12 80 views
0

阅读multicolumned PDF文档iText的阅读multicolumned PDF文档

当iText的阅读PDF(提取网页内容到一个字符串变量),那么内容就会被固定在那里:

reader = new PdfReader(getResources().openRawResource(R.raw.resume1)); 
original_content = PdfTextExtractor.getTextFromPage(reader, 2); 
String sub_content = original_content.trim().replaceAll(" {2,}", " "); 
sub_content = sub_content.trim().replaceAll("\n ", "\n"); 
sub_content = sub_content.replaceAll("(.+)(?<!\\.)\n(?!\\W)", "$1 "); 

如果文档仅为1列,但如果文档具有多列,则会每行提取文档1。它会结合左列和右列。

我使用this作为样本PDF,这是来自START QA文档。

如何阅读多版本的PDF文档?

回答

2

有两种不同的方法来解决这个问题,使用哪一种方法取决于PDF本身。

  1. 如果在PDF中的问题网页内容字符串已经是所需的顺序:而是隐含使用的使用PdfTextExtractor.getTextFromPage过载的LocationTextExtractionStrategy的,明确使用SimpleTextExtractionStrategy;你的情况:

    original_content = PdfTextExtractor.getTextFromPage(reader, 2, new SimpleTextExtractionStrategy()); 
    
  2. 如果有问题的PDF页面内容的字符串所需的顺序不而是隐含使用的PdfTextExtractor.getTextFromPage您使用过载LocationTextExtractionStrategy的,明确的在FilteredTextRenderListener中包含一个这样的策略,限制它仅接收单个列的区域的文本;你的情况:

    Rectangle left = new Rectangle(0, 0, 306, 792); 
    Rectangle right = new Rectangle(306, 0, 612, 792); 
    RenderFilter leftFilter = new RegionTextRenderFilter(left); 
    RenderFilter rightFilter = new RegionTextRenderFilter(right); 
    [...] 
    TextExtractionStrategy strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), leftFilter); 
    original_content = PdfTextExtractor.getTextFromPage(reader, 2, strategy); 
    originalContent += " "; 
    strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), rightFilter); 
    original_content += PdfTextExtractor.getTextFromPage(reader, 2, strategy); 
    
+0

谢谢你的回答,MKL。我已经尝试了您发布的两种代码,第二种方法与我的要求一起使用了1列和2列的pdf。第一种方法存在问题,似乎它从pdf中提取时除去了多余的pdf(没有使用3个或更多列的PDF文档进行尝试),所以删除了双'\ n'。顺便说一下,第一种方法是否可能只提取PDF而不编辑内容的形式? –

+0

其实第一种方法(SimpleTextExtractionStrategy)是对页面内容进行最少操纵的方法,它只在坐标跳转所提示的地方插入空格和换行符。第二种方法更符合单个文本段的坐标分析。 – mkl

+0

谢谢mkl,但我只想'SimpleTextExtractionStrategy'提取内容而不操作'\ n'。 –