2013-02-20 143 views
3

我一直在使用pdftotext从PDF中提取文本。我也用Ghostscript完成了这个。最近,公用事业提供商更改了他们的PDF,因此其中的一部分不会被这些方法提取。具体来说,我错过了截止日期和到期总额。当我在阅读器中打开PDF文件时,“缺失”文本可以突出显示,复制并粘贴到外部编辑器中。当我在Acrobat Pro中打开它并查看内容(视图 - >显示/隐藏 - >导航窗格 - >内容)时,我需要的文本就在那里。如何在没有手动复制和粘贴的情况下将其取出? (这不是一种选择,因为我会在成千上万的PDF上做这个)?从PDF中提取文本内容

这里是我正在处理的一个例子。我已删除了所有敏感数据:

link to PDF

编辑:我张贴这一点,当你跟随链接到文件(托管在谷歌驱动器),它可以让你选择后发现和复制大多数文本页面,但不是我失踪的东西。当您下载文件时,您可以在PDF阅读器中选择缺失的文本。

回答

1

我已经通过从git获取Ghostscript的最新未发行版本并构建它来解决此问题。现在,txtwrite设备正是我所需要的。感谢chrisl对他的回答和评论,使我朝着正确的方向前进。

+0

你好,你有没有试过从PDF中删除图像,以便PDF只包含文本?我正在寻找一种方法来做到这一点。你有使用ghostScript或其他cli工具的解决方案吗?请帮助。 – codin 2013-12-19 09:55:21

2

最近发布的Ghostscript有一个txtwrite设备,可能值得尝试。

+0

我试过txtwrite设备,它给了我pdftotext相同的结果 - 仍然缺少截止日期和帐户总数。 – 2013-02-20 17:31:39

+0

什么遗漏?我认为它是“2012年11月12日 - 2012年12月12日”,但我从txtwrite的输出中看到。 – chrisl 2013-02-20 17:51:26

+0

我错过了右上角:“请在2012年12月28日之前付款”和“总额到期1,839.42美元” – 2013-02-20 18:05:29

0

有一个非常罕见的方法来提取数据,但它只适用于老版本的ghostscript,如8.51或8.62。在旧版本的ghostscript中,PDF命令是在/lib/pdf_ops.ps中定义的。新版本还有其他一些功能。

版本8.62的测试版本可在此处获得。

http://sourceforge.net/projects/ghostscript/files/GPL%20Ghostscript/8.62/gs862w32.exe/download 

你后面的文本是用/Tj {} def/TJ {} def通过添加dup ==每个定义的开始打印。 (这可能会更复杂)我也没有担心字体警告消息,但如果数据写入文件,这些会被过滤掉。

由于字距正在完成,因此有些字被分割成单独的字母。考虑到时间,这也可以被过滤。

改性/ TJ从pdf_ops.ps /TJ {DUP == 0 0通过MoveTo显示settextposition } bdef

改性从pdf_ops.ps

/TJ
/TJ { dup == 
    0 0 moveto { 
    dup type /stringtype eq { 
     Show 
    } { -1000 div 
     currentfont /ScaleMatrix .knownget { 0 get mul } if 
     0 Vexch rmoveto 
    } ifelse 
    } forall settextposition 
} bdef 

输出

(Help a neighbor within your county each month by contributing to The Salvation) 
(Army's Project SHARE and Georgia Power will match your gift. To help, simply check) 
($1, $2, $5, or $10 on the return portion of this bill. Starting next month, your pledge) 
(amount will be included on your monthly bill.) 
(Our business offices will be closed on December 24 and 25 for Christmas and January) 
(1 for New Year's Day. In case of an emergency, please call us at the number on your) 
(bill 24 hours a day, 7 days a week.) 
(PLEASE KEEP THIS PORTION FOR YOUR RECORDS.) 
(PLEASE RETURN THIS PORTION WITH YOUR PAYMENT, MAKING SURE THE RETURN ADDRESS SHOWS IN THE ENVELOPE WINDOW.) 
(Account Number) 
(Mail To:) 

不是后记的乐趣吗?

+0

尝试运行ghostscript时,出现“找不到初始化文件gs_init.ps”。使用8.62。另外,我的pdf_ops.ps在lib \中,而不是\ bin。我认为它应该留在lib \中。 – 2013-02-22 19:03:54

+0

和gs_init.ps存在于lib \中。 – 2013-02-22 19:05:11

+0

非常奇怪,gs_init.ps是在阅读pdf_ops.ps之前阅读的,所以我怀疑这可能是一个无关的问题。尝试在没有修改的情况下运行GS并查看错误是否消失。在GPL Ghostscript 8.62(2008-02-29)之前你会看到gs_init.ps文件吗?在这个软件没有任何担保之后,pdf_ops.ps就会被读取。详细信息请参见PUBLIC文件。如果错误发生在此消息之前,肯定还有其他事情发生。是的,导演应该是\ lib而不是\ bin,并且该文件应该保留在\ lib中。 – 2013-02-22 20:51:52