如何从PDF中删除所有图像?

时间:2015-04-15 17:52:37

标签: pdf ghostscript postscript

我想删除PDF文件中的所有图片。

页面布局不应更改。所有图像都应该用空格替换。

  • 如何借助Ghostscript和相应的PostScript代码实现这一目标?

2 个答案:

答案 0 :(得分:12)

同时,最新的Ghostscript版本有一个更好,更容易使用的方法从PDF中删除所有图像。要添加到命令行的参数是-dFILTERIMAGE

 gs -o noimages.pdf -sDEVICE=pdfwrite -dFILTERIMAGE input.pdf

更好的是,您还可以通过指定-dFILTERTEXT-dFILTERVECTOR从PDF中删除所有文字或所有矢量绘图元素。

当然,您还可以组合所需的这些-dFILTER*参数的任意组合,以获得所需的结果。 (结合所有这三个当然会导致"空"页面。)

以下是示例PDF页面的屏幕截图,其中包含上述所有3种类型的内容:

包含"图像","矢量&和"文字"元件。
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 onlyTXT.pdf -sDEVICE=pdfwrite -dFILTERVECTOR -dFILTERIMAGE input.pdf 
 gs -o onlyIMG.pdf -sDEVICE=pdfwrite -dFILTERVECTOR -dFILTERTEXT  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 :(得分:8)

我自己提出了答案,但实际的代码是由{Ghostscript开发人员Chris Liddell提供的。

我使用了原始的PostScript代码并剥离了其他功能。 仅保留删除光栅图像的功能。 其他图形页面对象 - 文本部分,图案和矢量对象 - 应保持不变。

复制以下代码并将其另存为remove-images.ps

%!PS

% Run as:
%
%      gs ..... -dFILTERIMAGE -dDELAYBIND -dWRITESYSTEMDICT \
%                 ..... remove-images.ps <your-input-file>
%
% derived from Chris Liddell's original 'filter-obs.ps' script
% Adapted by @pdfkungfoo (on Twitter)

currentglobal true setglobal

32 dict begin

/debugprint     { systemdict /DUMPDEBUG .knownget { {print flush} if} 
                {pop} ifelse } bind def

/pushnulldevice {
  systemdict exch .knownget not
  {
    //false
  } if

  {
    gsave
    matrix currentmatrix
    nulldevice
    setmatrix
  } if
} bind def

/popnulldevice {
  systemdict exch .knownget not
  {
    //false
  } if
  {
    % this is hacky - some operators clear the current point
    % i.e.
    { currentpoint } stopped
    { grestore }
    { grestore moveto} ifelse
  } if
} bind def

/sgd {systemdict exch get def} bind def

systemdict begin

/_image /image sgd
/_imagemask /imagemask sgd
/_colorimage /colorimage sgd

/image {
   (\nIMAGE\n) //debugprint exec /FILTERIMAGE //pushnulldevice exec
  _image
  /FILTERIMAGE //popnulldevice exec
} bind def

/imagemask
{
  (\nIMAGEMASK\n) //debugprint exec
  /FILTERIMAGE //pushnulldevice exec
  _imagemask
  /FILTERIMAGE //popnulldevice exec
} bind def

/colorimage
{
  (\nCOLORIMAGE\n) //debugprint exec
  /FILTERIMAGE //pushnulldevice exec
  _colorimage
  /FILTERIMAGE //popnulldevice exec
} bind def

end
end

.bindnow

setglobal

现在运行此命令:

gs -o no-more-images-in-sample.pdf \
   -sDEVICE=pdfwrite               \
   -dFILTERIMAGE                   \
   -dDELAYBIND                     \
   -dWRITESYSTEMDICT               \
    remove-images.ps               \
    sample.pdf

我使用官方PDF规范测试了代码,并且它有效。 以下两个屏幕截图显示了输入和输出PDF的第750页:

如果你想知道为什么看起来像图像的东西仍在输出页面上: 它不是真正的光栅图像,而是原始文件中的&#39; 模式,因此不会被删除。