从PDF文件中删除所有文本

Pri*_*ome 8 pdf-generation ghostscript

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

我可以用Ghostscript实现这个目标,还是需要研究不同的工具?

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

Kur*_*fle 11

自从我之前的回答以来,开发工作仍在继续,现在有了一个新的选项,这证明了一个新的答案.

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

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

gs -o no-more-texts.pdf -sDEVICE=pdfwrite -dFILTERTEXT   input.pdf
Run Code Online (Sandbox Code Playgroud)

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

gs -o no-more-texts.pdf -sDEVICE=pdfwrite -dFILTERIMAGE  input.pdf
Run Code Online (Sandbox Code Playgroud)

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

gs -o no-more-texts.pdf -sDEVICE=pdfwrite -dFILTERVECTOR input.pdf
Run Code Online (Sandbox Code Playgroud)

当然,您还可以组合以上两个参数中的任何一个(组合所有三个参数将创建空白页面.

以下是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

下图说明了结果:


从左到右的顶行:删除所有"文本"; 删除所有"图像"; 删除所有"向量".左下方,左起:只保留"文字"; 只保留"图像"; 只保留"矢量".
从左到右的顶行:删除所有



Kur*_*fle 6

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

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

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

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

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

请注意,edited.pdf仍会在大多数PDF查看器中显示,但文本将丢失.但是,通过恢复原始TJ/Tj运算符,可以轻松地再次恢复文本.


更新/修正

我的错!我原来的答案包含了一个错误的错字.我曾经tjTj应该使用的地方使用过.很抱歉可能产生的任何混淆.

更新2

澄清"对象流"是什么......在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
Run Code Online (Sandbox Code Playgroud)

"图像流"具有基本相同的结构.但关键:值对通常包含以下4个条目,以任何顺序排列(其中NNNMMM是整数值,给出图像的宽度和高度,以像素为单位):

/Type /XObject
/Subtype /Image
/Width NNN
/Height MMM
Run Code Online (Sandbox Code Playgroud)


Ken*_*enS 1

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

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

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