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