【问题标题】:Removing text from PDF从 PDF 中删除文本
【发布时间】:2012-10-01 13:24:16
【问题描述】:

我正在寻找从 pdf 中删除/删除所有文本的解决方案。我已经使用 iTextSharp 有一段时间了,使用它从 pdf 中提取文本很容易(不使用 OCR)。但是我找不到删除文本的选项。

This solution 坦率地说对我不起作用。

    page.GetAsArray(PdfName.CONTENTS);

为我返回 null,在使用 PdfName.Text 和我尝试过的其他一些时也是如此。

使用的库并不重要,我只是认为 iTextsharp 应该能够做到这一点。但是,如果有其他(免费)解决方案,请带上它

编辑:只是为了弄清楚我为什么要从 pdf 中删除所有文本

我想减小 pdf 的大小。我通过降低 pdf 中图像的分辨率来做到这一点。然而,在很多情况下,矢量图占据了大部分空间。所以我想到了以下几点: 删除所有文本,而不是将剩余的 pdf(仅包含图像和矢量)转换为位图 (jpeg)。之后,我再次将文本粘贴在上面。 另一种选择是使文本不可见,但我认为这并不容易。

【问题讨论】:

  • 澄清一下,您正试图从 pdf 中删除文本,但保留图像原样?
  • 进一步澄清:您想删除所有可识别文本的痕迹,所以取而代之的是白色区域?或者您想将包含字体的文本转换为小的光栅图像,以便复制'n'粘贴相同的文本不再起作用(但阅读它仍然有效)?或者,将完整的 PDF 页面转换为一个光栅图像(而不是一组矢量对象),这样 copy'n'paste 不再起作用?
  • 我的目标是从 pdf 中完全删除所有文本(不是位图),其余部分保持原样。

标签: c# pdf itextsharp


【解决方案1】:
  1. 页面字典的/Contents 并不总是由数组组成。如果内容以流的形式存储,GetAsArray() 显然会返回 null
  2. 假设您使用GetAsStream() 并从流中删除所有文本内容,那么XObjects 中可能仍有文本内容。该文本不会从内容流中引用,但 iText 将无法将 XObject 作为“未使用的对象”删除,因为这些对象仍会从页面字典中的 /Resources 中引用。

请阅读ISO-32000-1 以找出您做错了什么。

【讨论】:

  • GetAsStream() 确实返回了一些东西。但是如果我从流中删除所有内容,整个页面都是空白的,图像也会被删除。如何仅从流中删除文本?谢谢
  • 需要解析PDF语法,保留所有图形状态算子,保留所有图形状态算子。对于每个“Do”运算符,您需要检查您是在处理 Form XObject 还是 Image XObject。您必须保留所有 Image XObject,并检查所有 Form XObject(再次丢弃文本,并保留图形状态和图像)。如果你雇人来做这件事,请指望支付 2 到 3 天的工作时间。
  • 抱歉,我没有雇人为我做这件事。我更新了我的问题,为什么要删除所有文本。
  • 我已阅读您的要求。您应该从学习 ISO-32000-1 开始(需要几个星期)。然后你应该编写一个 PDF 语法解析器来创建 2 个不同的 PDF:一个包含文本,一个包含图像。然后用图像对 PDF 做任何需要的魔法。最后将PDF与文本叠加在PDF与图像上。如果您对 iText 一无所知,则需要几周时间。结果可能不是你所期望的。矢量图像通常比光栅图像占用更少的空间。
  • 如果不是那么特别,你为什么不开始编码 ;-)
【解决方案2】:

既然你已经更新了你的问题,并透露了预期措施的动机,让我告诉你真相:

  • 这些措施绝不会减小 PDF 的大小。

  • 相反,它们会导致文件大量增加:

    1. 先删除文本+字体可能会导致大小略有缩小,是的。

    2. 然后将页面的剩余部分转换为位图肯定会大大增加尺寸(或者您同意非常低的图像质量,也许?)。

    3. 最后再次“粘贴”文本将再次增加文件大小(很可能与您在第一步中保存的数量相同)。

这根本不是一个好计划。

如果您提供(指向)一个典型的 PDF 示例文件,我可能会想出一个 Ghostscript(以及其他工具)命令行,它可以开箱即用并更有效地缩小 PDF 大小。

【讨论】:

  • 很抱歉,我不能分享 pdf,但我可以告诉你。所有 pdf 的大小都是 A4。它们通常包含很多非常详细的矢量图像,占用数 MB,而作为位图,它们可以是 100kb。我对文件大小进行了研究,发现差异很大。
【解决方案3】:

要删除 PDF 中的所有文本,最简单的解决方案是使用 ghostcript

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

【讨论】:

    猜你喜欢
    • 2014-08-10
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 2016-04-15
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多