Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析PDF表格并将其显示为CSV(Java)_Java_Itext_Pdfbox - Fatal编程技术网

解析PDF表格并将其显示为CSV(Java)

解析PDF表格并将其显示为CSV(Java),java,itext,pdfbox,Java,Itext,Pdfbox,我正在尝试解析PDF文件中的表并将其显示为CSV。我在下面附上了PDF格式的样本数据(只有几列)和样本输出。每个列宽都是固定的,比如说公司名称(18个字符)、金额(8个字符)、类型(5个字符)等等。我尝试使用Itext和PDFBox JAR获取每个页面数据并逐行解析,但听起来这不是一个很好的解决方案,因为PDF中的换行符和换页符不合适。如果有其他合适的解决方案,请告诉我。我们想使用任何开源软件来实现这一点 这是一个非常复杂的问题。关于这一点,甚至有多篇硕士论文 一个简单的类比:我有5000块拼图

我正在尝试解析PDF文件中的表并将其显示为CSV。我在下面附上了PDF格式的样本数据(只有几列)和样本输出。每个列宽都是固定的,比如说公司名称(18个字符)、金额(8个字符)、类型(5个字符)等等。我尝试使用Itext和PDFBox JAR获取每个页面数据并逐行解析,但听起来这不是一个很好的解决方案,因为PDF中的换行符和换页符不合适。如果有其他合适的解决方案,请告诉我。我们想使用任何开源软件来实现这一点


这是一个非常复杂的问题。关于这一点,甚至有多篇硕士论文

一个简单的类比:我有5000块拼图,它们都是完美的正方形,可以放在任何地方。有些上面有几行,有些上面有文本片段

然而,这并不意味着它不能做到。这只需要工作

一般做法:

  • 使用iText(特别是IEventListener)获取每个页面的所有呈现事件的信息
  • 选择那些对应用程序有意义的呈现事件。PathRenderInfo和TextRenderInfo
  • pdf中的事件不需要按照规范的顺序显示。通过在IEventData上实现比较器来解决此问题。此比较器应根据读取顺序进行排序。这意味着您可能必须实现一些基本的语言检测,因为不是每种语言都从左向右读取
  • 排序后,现在可以根据文献中的各种启发式方法将项目聚集在一起。例如,如果两个字符在已排序的事件列表中紧跟在一起(意味着它们在阅读顺序中彼此相邻),如果y位置相差不太大(下标和上标可能与此有关),如果x位置相差不太大(紧排),则可以将两个字符分组为一个文本片段
  • 继续对字符进行聚类,直到形成单词
  • 假设您已经形成了单词,请使用类似的算法将单词形成行。如果单词与直线相交,请使用PathRenderInfo保留合并单词
  • 假设已经创建了行,现在查找表。一种可能的方法是应用水平和垂直投影。并在页面中查找(投影时)显示网格状结构的子区域
  • 这种高层次的方法应该让人痛苦地明白为什么这不是一个广泛可用的东西。这很难实现。它需要PDF、字体和机器学习方面的领域知识

    如果您同意商业解决方案,请尝试pdf2Data。它是一个iText附加组件,具有这种确切的功能


    解析器应该如何做到这一点?没有你的样本输出,我不知道哪几行应该在一起。。。如果您的pdf正确标记,您可能会很幸运。如果您共享了一个示例pdf文件而不是图像,我们可以在其中查找更多线索。请将您的问题限制为iText或Pdfbox。如果需要,创建两个单独的问题,一个用于iText,一个用于Pdfbox。分享你的pdf。分享你的代码。不要索要pdf库的购物清单,这在StackOverflow上是不允许的。你需要先自己尝试一下,然后在遇到困难时提问。嗨,mkl,谢谢你回答我的问题。由于列数、列宽、单个记录/元组将跨越的最大行数是固定的,所以我认为我们可以解析它。此外,如果公司名称最多跨3行,则“金额”和“卖方”列可能仅跨1行,那么其他2行的“金额”和“类型”列将为空。非常抱歉,我无法发送PDF:(嗨,Amedee Van Gasse,我已经测试了Itext和PDFBox,每个都有自己的局限性。因为我用它们来解决同一个问题,所以我对它们都做了标记。我不是要这里的购物清单,我尝试了两种不可行的解决方案,所以我只想看看是否有更好的方法{示例PDF->HTML/TXT文件->CSV或任何其他更好的PDF解析器}我关于共享PDF的问题仍然有效。mkl也问了这个问题。没有PDF,这是猜测。