2013-02-20 145 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