2012-10-01 48 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