3

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

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

链接到 PDF

编辑:我在发布此内容后注意到,当您点击文件的链接(托管在 Google Drive 上)时,它将允许您选择和复制页面上的大多数文本,但不是我缺少的内容。下载文件时,您可以在 PDF 阅读器中选择缺失的文本。

4

3 回答 3

2

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

于 2013-02-20T17:29:06.453 回答
1

我通过从 git 获取最新的未发布版本的 Ghostscript 并构建它来解决这个问题。现在 txtwrite 设备给了我我需要的东西。感谢 chrisl 的回答和评论将我引向正确的方向。

于 2013-03-01T18:19:48.543 回答
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添加 a来打印您所追求的文本。dup ==(这可以变得更复杂)我也不必担心字体警告消息,但如果将数据写入文件,这些将被过滤掉。

由于正在执行字距调整,因此有些单词被分成几部分和单独的字母。给定时间,这也可以被过滤。

修改 /Tj from pdf_ops.ps /Tj { dup == 0 0 moveto Show 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:)

后记不好玩吗?

于 2013-02-21T01:30:22.240 回答