Как я могу удалить все изображения из PDF?

Я хочу удалить все изображения из файла PDF.

Макеты страниц не должны меняться. Все изображения должны быть заменены пустым пространством.

  • Как этого можно добиться с помощью Ghostscript и соответствующего кода PostScript?

2 ответа

Решение

Между тем последние версии Ghostscript имеют гораздо более приятный и простой в использовании метод удаления всех изображений из PDF. Параметр для добавления в командную строку -dFILTERIMAGE

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

Более того, вы также можете удалить весь текст или все элементы векторного рисования из PDF, указав -dFILTERTEXT или же -dFILTERVECTOR,

Конечно, вы также можете комбинировать любую комбинацию этих -dFILTER* параметры, которые вы хотите, чтобы достичь требуемого результата. (Объединение всех трех, конечно, приведет к "пустым" страницам.)

Вот снимок экрана с примером страницы PDF, которая содержит все 3 типа контента, упомянутых выше:


Снимок экрана оригинальной страницы PDF, содержащей элементы "image", "vector" и "text".
Снимок экрана оригинальной страницы 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 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

Следующее изображение иллюстрирует результаты:


Верхний ряд слева: весь текст удален; все "изображения" удалены; все "векторы" удалены. Нижний ряд слева: сохранен только "текст"; сохраняются только "изображения"; сохранились только "векторы".
Верхний ряд слева: весь текст удален; все


Я сам формулирую ответ, но реальный код предоставлен chrisl, разработчиком Ghostscript.

Я использовал его оригинальный код 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, и он работал. На следующих двух снимках экрана показана страница 750 входных и выходных PDF-файлов:

Если вам интересно, почему что-то, похожее на изображение, все еще находится на выходной странице: это на самом деле не растровое изображение, а "шаблон" в исходном файле, и поэтому оно не удаляется.

Другие вопросы по тегам