我一直在使用pdftotext从PDF中提取文本。我也用Ghostscript做过这个。最近,一家公用事业提供商更改了他们的PDF,因此其中一部分没有被这些方法提取。具体来说,我错过了到期日和总到期日。当我在阅读器中打开PDF时,"丢失"的文本可以突出显示、复制并粘贴到外部编辑器中。当我在Acrobat Pro中打开它并查看内容(查看->显示/隐藏->导航窗格->内容)时,我需要的文本就在那里。如何在不手动复制和粘贴的情况下将其取出?(这不是一种选择,因为我将在成千上万的PDF上这样做)?
这是我正在处理的一个例子。我已经删除了所有敏感数据:
PDF 链接
编辑:我在发布这篇文章后注意到,当你点击文件(托管在谷歌硬盘上)的链接时,它会允许你选择并复制页面上的大部分文本,但不会复制我缺少的内容。下载文件时,您可以在PDF阅读器中选择丢失的文本。
Ghostscript的最新版本有一个txtwrite设备,可能值得一试。
我已经解决了这个问题,从git获得了Ghostscript的最新未发布版本并进行了构建。现在txtwrite设备正是我所需要的。感谢chrisl的回答和评论,引导我朝着正确的方向前进。
有一种非常糟糕的方法来提取数据,但它只适用于旧版本的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
通过在每个定义的开头添加一个dup ==
,使用/Tj {} def
和/TJ {} def
打印您要打印的文本。(这可能会变得更复杂)我也不必担心字体警告消息,但如果数据写入文件,这些消息会被过滤掉。
由于正在进行紧排,一些单词被拆分为多个单独的字母。如果时间允许,这也可以被过滤掉。
从pdf_ops.ps修改/Tj/Tj{dup==0 0移动到显示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:)
后记不是很有趣吗?