2012-10-01 217 views
0

我正在尋找解決方案來從pdf中刪除/刪除所有文本。我已經使用iTextSharp一段時間了,從PDF中提取文本很容易(在使用OCR的時候)。但是我找不到刪除文本的選項。從PDF中刪除文本

This solution坦率地說不適合我。

page.GetAsArray(PdfName.CONTENTS); 

返回null對我來說,也使用PdfName.Text時和其他一些我已經試過。

要使用的庫並不重要,我只是認爲iTextsharp應該能夠做到這一點。但是,如果有另一個(免費)解決方案,把它

編輯:只是爲了清楚,爲什麼我想從PDF文件

我想,以減少PDF文件的大小,刪除所有文本。我通過降低pdf中圖像的分辨率來做到這一點。然而,在很多情況下,矢量圖像佔據了大部分空間。所以我想到了以下內容: 刪除所有文本,而不是將剩餘的pdf(僅包含圖像和向量)轉換爲位圖(jpeg)。之後,我再次將文字粘貼在它上面。 另一種選擇是將文本隱藏,但我認爲這並不容易。

+0

只是爲了澄清,你試圖刪除從PDF文本,但保留圖像的完整? –

+0

準確地說,史蒂夫Czetty – Chumbawamba

+1

爲了更清楚地說明:你想刪除所有可識別文本的痕跡,所以在它的地方是白色區域?或者你想將由字體組成的文本轉換成小光柵圖像,這樣copy'n'pa'ing同一文本不再工作(但讀取它仍然有效)?或者,將完整的PDF頁面轉換爲一個光柵圖像(而不是一組矢量對象),這樣copy'n'paste不再起作用了? –

回答

2
  1. 頁面字典的/Contents並不總是由數組組成。如果內容被存儲爲流,則顯然GetAsArray()返回null
  2. 假設您使用GetAsStream()並從流中刪除所有文本內容,那麼您仍可能在XObjects中有文本內容。該文本不會從內容流中引用,但iText將無法將XObject作爲「未使用的對象」移除,因爲對象仍將從頁面字典中的/Resources引用。

請閱讀ISO-32000-1以瞭解您做錯了什麼。

+0

'GetAsStream()'確實會返回一些內容。但是如果我從流中刪除所有內容,整個頁面都是空白的,圖像也會被刪除。 如何只刪除流中的文本? 謝謝 – Chumbawamba

+2

您需要解析PDF語法,保留所有圖形狀態操作符,並保留所有圖形狀態操作符。對於每個'Do'操作符,您都需要檢查是否正在處理Form XObject或Image XObject。您必須保留所有Image XObjects,並檢查所有Form XObjects(再次丟棄文本,並保留圖形狀態和圖像)。如果你僱用某人來做這件事,那麼請指望支付2至3天的工作時間。 –

+0

對不起,但我不僱用某人爲我做這件事.. 我更新了我的問題,爲什麼我想刪除所有文本。 – Chumbawamba

1

現在你已經更新了你的問題,並透露預期措施的動機,讓我來告訴你真相:

  • 這些措施絕不會減少 PDF文件的大小。

  • 相反,他們會導致一個巨大的增加文件:

    1. 先刪除文本+字體可能會導致尺寸略有縮小,是的。

    2. 然後,將頁面的剩餘部分轉換爲位圖後,肯定會大幅增加大小(或者您同意非常低的圖像質量,也許?)。

    3. 最後'粘貼'文本再次會增加文件大小(很可能與第一步中保存的文件大小相同)。

這不是一個很好的計劃都沒有。

如果您提供了一個典型示例PDF文件的鏈接,我可能會想出一個Ghostscript(加上其他工具)命令行,它可以直接使用,並且可以更有效地縮小PDF大小。

+0

我很抱歉,我不能分享pdf,但我可以告訴你。 所有pdf的尺寸都是A4。 它們通常包含很多非常詳細的矢量圖像,它們佔用幾個MB,而作爲位圖,它們可以是100kb。 我做了我對文件大小的研究,差異是顯着的。 – Chumbawamba

0

要刪除PDF中的所有文本,最簡單的解決方案是使用ghostcript

gs -o output_no_text.pdf -sDEVICE=pdfwrite -dFILTERTEXT input.pdf