从 pdf 文件导入/读取数据的最佳方法是啥?
Posted
技术标签:
【中文标题】从 pdf 文件导入/读取数据的最佳方法是啥?【英文标题】:What's the best way to import/read data from pdf files?从 pdf 文件导入/读取数据的最佳方法是什么? 【发布时间】:2010-09-06 17:38:33 【问题描述】:我们从客户那里以不同格式 [布局方式] 的 pdf 文件中获取大量数据,这些文件通常是报告输出,并且通常经过适当注释 [它们通常不需要 OCR],但没有格式化很好,从 acrobat 中简单地复制数百页文本是行不通的。
到目前为止,我发现的最佳方法是编写一个脚本来解析几乎有效的 xml 输出(cmets 无效,许多字符以不同的方式转义,é 变为 [[[e9]]]é, $ 变成 \$,% 变成 \%...) 的命令行 pdftoipe 实用程序(用于为名为 ipe 的程序转换 pdf 文件),它为我提供了文本元素及其在每一页上的位置 [参见下面的示例] ,这对于我关心的每个页面上相同的值位于相同位置的报告来说效果很好,但需要额外的脚本工作来导入矩阵 [cross-tab] pdf 文件。 pdftoipe 根本不是为此而设计的,充其量可以使用 cygwin for windows 手动编译。
是否有一些库可以通过我可以容忍的某种脚本语言轻松实现这一点?图形工具也很棒。还有一匹小马。
this sample 的 pdftoipe 输出如下所示:
<ipe creator="pdftoipe 2006/10/09"><info media="0 0 612 792"/>
<-- Page: 1 1 -->
<page gridsize="8">
<path fill="1 1 1" fillrule="wind">
64.8 144 m
486 144 l
486 727.2 l
64.8 727.2 l
64.8 144 l
h
</path>
<path fill="1 1 1" fillrule="wind">
64.8 144 m
486 144 l
486 727.2 l
64.8 727.2 l
64.8 144 l
h
</path>
<path fill="1 1 1" fillrule="wind">
64.8 144 m
486 144 l
486 727.2 l
64.8 727.2 l
64.8 144 l
h
</path>
<text stroke="1 0 0" pos="0 0" size="18" transformable="yes" matrix="1 0 0 1 181.8 707.88">This is a sample PDF fil</text>
<text stroke="1 0 0" pos="0 0" size="18" transformable="yes" matrix="1 0 0 1 356.28 707.88">e.</text>
<text stroke="1 0 0" pos="0 0" size="18" transformable="yes" matrix="1 0 0 1 368.76 707.88"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 692.4"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 677.88"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 663.36"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 648.84"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 634.32"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 619.8"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 605.28"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 590.76"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 576.24"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 561.72"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 547.2"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 532.68"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 518.16"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 503.64"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 489.12"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 474.6"> </text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 67.32 456.24">If you can read this</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 214.92 456.24">,</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 219.48 456.24"> you already have A</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 370.8 456.24">dobe Acrobat </text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 67.32 437.64">Reader i</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 131.28 437.64">n</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 141.12 437.64">stalled on your computer.</text>
<text stroke="0 0 0" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 337.92 437.64"> </text>
<text stroke="0 0.502 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 342.48 437.64"> </text>
<image rect="-92.04 800.64 374.4 449.76" ColorSpace="DeviceRGB" BitsPerComponent="8" Filter="DCTDecode" length="369925">
feedcafebabe...
</image>
</page>
</ipe>
【问题讨论】:
【参考方案1】:pdftohtml -xml
虽然 pdftoipe 看起来更详细!!
【讨论】:
【参考方案2】:如果你可以调用外部的东西,你可以使用ghostscript - 查看发行版中包含的 ps2ascii 脚本。我不确定你想要从图形工具中得到什么——你按下一个大按钮来选择输入和输出文件?预览?您可能可以使用 GSView,具体取决于您的需要。
【讨论】:
【参考方案3】:我们在其中一个应用程序中使用Xpdf。它是一个主要用于 pdf 渲染的 c++ 库,尽管它确实有一个可能对这个项目有用的文本提取器。
【讨论】:
pdftoipe 是一个基于 Xpdf 的代码。不幸的是,这是迄今为止最好的答案:自己修改 Xpdf 以满足我的需要。【参考方案4】:你看过 Aspose 吗?我们将它用于 ASP.net 应用程序,我也看到了一些使用它的 vbscript 示例。也不是特别贵。
http://www.aspose.com/
【讨论】:
我不相信这就是我要找的东西。 Aspose.Pdf.Kit 似乎只是输出。你能说得更具体点吗?以上是关于从 pdf 文件导入/读取数据的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
保持从文件中读取的字符串值列表的最佳java方法是啥[关闭]
在 Delphi 2009 中显示 PDF 文件的最佳方法是啥[关闭]