从PDF文件中删除所有文本

时间:2014-06-20 07:44:21

标签: pdf-generation ghostscript

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

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

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

3 个答案:

答案 0 :(得分:8)

自从我之前的回答以来,开发工作一直在继续,现在有了一个新的选项可供选择。

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

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

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

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

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页面的屏幕截图,其中原始包含所有三个元素,而结果页面看起来不同。

包含"图像","矢量&和"文字"元件。
Screenshot of original PDF page containing "image", "vector" and "text" elements.

运行以下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

下图说明了结果:

左上角:所有"文字"删除;所有"图像"删除;所有"载体"除去。从左开始底行,:仅限"文字"保持;只有"图像"保持;只有"载体"保持
Top row, from left: all "text" removed; all "images" removed; all "vectors" removed. Bottom row, from left: only "text" kept; only "images" kept; only "vectors" kept.

答案 1 :(得分:6)

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

  1. 将压缩的PDF转换为具有(几乎)所有PDF对象的PDF文件。内容和流使用 QPDF

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

  3. 在PDF对象流中搜索TJTj字符串(用于显示文本的PDF运算符)的所有出现,并将其更改为JT和{{1}分别为字符串(未定义,无意义的PDF运算符)。将文件另存为jT

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

  5. 请注意,edited.pdf仍会显示在大多数PDF查看器中,但文本将丢失。但是,通过恢复原始的TJ / Tj操作符,可以很容易地再次恢复文本。


    更新/纠错

    我的坏!我原来的答案包含了一个错误的错字。我在应该使用 edited.pdf 的地方使用了 tj 。很抱歉可能造成的任何混淆。

    更新2

    澄清"对象流" 是什么......在"标准化"由上面给出的 Tj 命令创建的表单,带有流的对象通常如下所示(其中qpdf是整数):

    NNN

    &#34;图像流&#34; 具有基本相同的结构。但关键:值对通常包含以下4个条目,按任何顺序排列(其中 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 NNN 是给出宽度和高度的整数值图像的像素):

    MMM

答案 2 :(得分:1)

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

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

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