【问题标题】:Remove all text from PDF file从 PDF 文件中删除所有文本
【发布时间】:2014-08-10 22:05:32
【问题描述】:

我正在使用 Ghostscript 将源 PDF 文件转换为 PNG 图像数组。在将 PDF 页面转换为 PNG 图像之前,我需要从 PDF 中提取(删除)所有文本,以便转换后的页面图像包含所有其他元素,不包括文本。

我可以使用 Ghostscript 实现这一点,还是需要研究不同的工具?

我也对可以读取-保存我的源 PDF 删除所有文本的工具感兴趣。

【问题讨论】:

    标签: pdf-generation ghostscript


    【解决方案1】:

    自从我上一个回答以来,开发一直在继续,现在有一个新选项可用,这证明了一个新答案的合理性。

    最新版本的 Ghostscript 支持 3 个新参数,允许您从 PDF 中删除所有 TEXT、所有 IMAGE 或所有 VECTOR 元素。

    要从输入 PDF 中删除所有 TEXT 元素,请运行

    gs -o no-more-texts.pdf -sDEVICE=pdfwrite -dFILTERTEXT   input.pdf
    

    要从输入 PDF 中删除所有光栅 IMAGE 元素,请运行

    gs -o no-more-texts.pdf -sDEVICE=pdfwrite -dFILTERIMAGE  input.pdf
    

    要从输入 PDF 中删除所有 VECTOR 元素,请运行

    gs -o no-more-texts.pdf -sDEVICE=pdfwrite -dFILTERVECTOR input.pdf
    

    当然,您也可以结合以上两个参数中的任何一个(结合所有三个将创建空页面。

    这是一个 PDF 页面的屏幕截图,其中原始页面包含所有三个元素,而生成的页面看起来不同。


    原始 PDF 页面的屏幕截图包含“图像”、“矢量”和“文本”元素。


    运行以下 6 条命令将创建剩余内容的所有 6 种可能变体:

    gs -o noIMG.pdf -sDEVICE=pdfwrite -dFILTERIMAGE input.pdf gs -o noTXT.pdf -sDEVICE=pdfwrite -dFILTERTEXT input.pdf gs -o noVCT.pdf -sDEVICE=pdfwrite -dFILTERVECTOR input.pdf gs -o onlyIMG.pdf -sDEVICE=pdfwrite -dFILTERVECTOR -dFILTERTEXT input.pdf gs -o onlyTXT.pdf -sDEVICE=pdfwrite -dFILTERVECTOR -dFILTERIMAGE input.pdf gs -o onlyVCT.pdf -sDEVICE=pdfwrite -dFILTERIMAGE -dFILTERTEXT input.pdf

    下图说明了结果:


    顶行,从左到右:所有“文本”被删除;删除所有“图像”;删除了所有“向量”。 底行,左起:只保留“文本”;只保留“图像”;只保留“向量”。


    【讨论】:

      【解决方案2】:

      您可以在没有 Ghostscript 的情况下实现您想要的,只需使用文本编辑器即可。

      1. 将压缩后的 PDF 转换为将(几乎)所有 PDF 对象的内容和流扩展为可读形式的文件使用QPDF

         qpdf --qdf --object-streams=disable input.pdf editable.pdf
        
      2. 使用文本编辑器打开您的新 editable.pdf 文件(该编辑器还可以优雅地处理 PDF 中任何剩余的二进制 blob,例如字体或 ICC 资源)。

      3. 搜索所有出现的TJTj 字符串(用于显示文本的PDF 运算符)在PDF 对象流中 并分别用JTjT 字符串替换它们(未定义的、无意义的 PDF 运算符)。将文件另存为edited.pdf

      4. 现在根据需要将您的 edited.pdf 转换为您的 PNG 图像。

      请注意,edited.pdf仍会显示在大多数 PDF 查看器中,但 文本将按预期丢失。但是,很容易再次恢复文本,方法是恢复原来的 TJ/Tj 运算符,从而逆转任何手动修改。


      在上面给出的qpdf命令创建的“规范化”形式中,带有流的对象通常看起来像这样(其中NNN是一个整数) :

      NNN 0 obj
      <<
         % Here are the key:value pairs of the object dictionary
         /Key1 somevalue1
         /Key2 somevalue2
         % ... (more key:value pairs)
      >>
      stream
      % Here is the content of the object stream
      endstream
      endobj
      

      “图像流”具有基本相同的结构。但是键:值对通常包含以下四个条目,顺序不限(其中 NNNMMM 是整数值,给出图像的宽度和高度像素):

      /Type /XObject
      /Subtype /Image
      /Width NNN
      /Height MMM
      

      更新/更正

      我的错!我的原始答案包含重复的错字。我在应该使用 Tj 的地方使用了 tj。对于可能造成的任何混乱,我们深表歉意。

      【讨论】:

      • 实际上 - 这仅适用于一个文件,而在其他文件上产生乱码输出。将TJs 更改为JTs(或任何组合)在这些文件上也有相同的结果——输出有时会出现乱码。我最终做的是找到所有出现的 \nBT\n\nET\n 并删除它们之间的所有内容。
      • @eithedog:如果我不能看文件本身,我就无法分析为什么你会遇到你观察到的行为。唯一(从我的脑海中)可能产生影响的是 '" 运算符:它们也习惯于 "显示文本”,类似于 TjTJ(但有一些额外的变化,例如自动移动到下一行,或设置字距)。
      • 我理解并感谢您的帮助。可能是tj 可以在图像流中实际遇到,这就是为什么更改它们会使输出的 pdf 出现乱码?正如我所提到的 - 最后我刚刚删除了 BTET 之间的所有内容,这似乎可以解决问题。我假设这是具有所有转换的解码文本流 - 因为它也包含 tjs - 例如:Td[(C)7(arr)3(ot C)7(ak)8(e......Ł2)]TJ,但这也是:Tm (DRINKS)Tj
      • @eithedog: “可能是 tj 可以在图像流中实际遇到,这就是为什么......”。是的。请注意更改 TJTj 字符串的位置:仅在 “PDF 对象流” 内部(正如我在回答中所说),永远不会在所有 PDF 文件中全局(它可能与图像流匹配)...
      【解决方案3】:

      显然这不是标准要求,但最近在 IRC 的#Ghostscript 论坛上进行了讨论。该频道已记录,您可以在此处找到讨论:

      http://ghostscript.com/irclogs/2014/05/21.html

      我们最初建议在 pdf_ops.ps 中将初始文本渲染模式更改为 3,但这对文件没有影响,因为它使用的是 type 3 字体。所以我们建议改为在同一个文件中更改 TJ 和 Tj 的定义。查看日志中的 15:37 左右。

      【讨论】:

      • 在 pdf_ops.ps 中,更改 /TJ 和 /Tj 的定义,在每种情况下将 'Show' 替换为 'pop'。根据您的操作系统和 Ghostscript 的构建方式,您可能需要重新构建 Ghostscript,或者通过在命令行上放置 -I 来包含包含修改文件的目录
      • 如果我已经在 OS X 上安装了 GS,我可以这样做吗?我在硬盘上找不到pdf_ops.ps。我现在还下载了 GS 源代码并找到了这个文件和 /TJ、\Tj 定义。我想当我改变这些时我需要重建它?在执行这些 /TJ、/Tj 更改后,我需要运行什么命令才能从 PDF 文件中删除文本?
      • Ghostscript 可以通过多种方式构建...如果您使用 COMPILE_INITS=1 构建,那么支持文件将构建到可执行文件中。如果您使用 COMPILE_INITS=0 构建,那么它们在磁盘上。在任何一种情况下,您都可以使用 -I 开关(包含)告诉 Ghostscript 在目录或目录列表中查找文件first。因此,您可以将修改后的 gs/Resource/Init 放在某处,更改 pdf_ops.ps 然后告诉 GS 使用该目录。然后,您使用 pdfwrite 设备制作 new PDF 文件(它保留原始文件不变),因为文本操作符是无操作的,新文件没有文本。
      • 糟糕,由于您正在渲染为 PNG,只需使用您已经在使用的任何命令行,同样,因为 TJ 和 Tj 运算符是无操作的,文本不会被渲染。跨度>
      • 好的,谢谢,希望我能完成这项工作!我自己从未构建过 GS,我只是使用 OS X 安装程序将其安装到系统上。我将尝试使用 -l 开关指向修改后的资源文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 2016-04-15
      相关资源
      最近更新 更多