我一直在尝试编写一个简单的控制台应用程序或PowerShell脚本来从大量PDF文档中提取文本.有几个库和CLI工具可以实现这一点,但事实证明,没有一个能够可靠地识别文档结构.特别是我关注文本列的识别.即使非常昂贵的PDFLib TET工具也经常混淆两个相邻文本列的内容.
经常注意到PDF格式没有列的任何概念,甚至没有单词的概念.关于SO的类似问题的几个答案提到了这一点.这个问题非常严重,甚至可以保证学术研究.这篇期刊文章指出:
PDF文件中的所有数据对象都以面向视觉的方式表示,作为一系列操作符...通常不传达有关更高级别文本单元(如标记,行或列)的信息 - 有关这些单元之间边界的信息只能通过空格隐式提供
因此,我尝试过的所有提取工具(iTextSharp,PDFLib TET和Python PDFMiner)都无法识别文本列边界.在这些工具中,PDFLib TET表现最佳.
然而,SumatraPDF,非常轻量级的开源PDF阅读器,以及许多其他类似的可以完美识别列和文本区域.如果我在其中一个应用程序中打开文档,选择页面上的所有文本(甚至整个文档用CTRL + A)复制并粘贴到文本文件中,文本将以正确的顺序呈现几乎完美无缺.它偶尔会将页脚和标题文本混合到其中一列中.
所以我的问题是,这些应用程序如何做看似困难的事情(即使是像PDFLib这样昂贵的工具)?
编辑2014年3月31日:值得一提的是,我发现PDFBox在文本提取方面比iTextSharp好得多(尽管有一个定制的策略实现),PDFLib TET略胜PDFBox,但它相当昂贵.Python PDFMiner是没有希望的.我见过的最好的结果来自谷歌.可以将PDF(每次2GB)上传到Google云端硬盘,然后将其作为文本下载.这就是我在做的事情.我写了一个小工具,将我的PDF分成10个页面文件(Google只会转换前10页),然后在下载后将它们拼接回来.
编辑2014年4月7日.取消我的最后一次.最好的提取是通过MS Word实现的.这可以在Acrobat Pro中自动执行(工具>操作向导>创建新操作).可以使用.NET OpenXml库自动化Word到文本.这是一个非常巧妙地进行提取(docx到txt)的类.我的初始测试发现MS Word转换在文档结构方面要准确得多,但是一旦转换为纯文本就不那么重要了.
我想在pdf中提取表格的内容,如下所示:

我用iText java PDF libray编写了这个java程序,它可以逐行读取PDF文件的内容,但我不知道如何获取表的内容
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
public class PDFReader {
public static void main(String[] args) {
// TODO, add your application code
System.out.println("Lecteur PDF");
System.out.println (ReadPDF("D:/test.pdf"));
}
private static String ReadPDF(String pdf_url)
{
StringBuilder str=new StringBuilder();
try
{
PdfReader reader = new PdfReader(pdf_url);
int n = reader.getNumberOfPages();
for(int i=1;i<n;i++)
{
String str2=PdfTextExtractor.getTextFromPage(reader, i);
str.append(str2);
System.out.println(str);
}
}catch(Exception err)
{
err.printStackTrace();
}
return String.format("%s", str);
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:

但这不是我想要的,我想逐行和逐列提取表的内容,例如,保存java数组中的每一行
第一个数组将包含:"N°","DATE OBSERVATIONS","TEXTE"
第二个阵列将包含:"029/14","Le 1er sept …