2015-04-15 2 views
5

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

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

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

Так кто-The-ад, что он лучше downvoted этот вопрос? По какой причине?!? Не стесняйтесь, но, пожалуйста, дайте комментарий и скажите мне, почему? –

ответ

5

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

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

Даже лучше, вы также можете удалить весь текст или все векторный рисунок элементы из PDF путем указания -dFILTERTEXT или -dFILTERVECTOR.

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

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


Скриншот оригинала 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 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.


+0

Можем ли мы удалить определенные векторы? Если да, то как идентифицировать разные векторы в самом PDF-файле. Я тестировал это, и он работает, но он также удаляет некоторые векторы, которые я не хочу. –

+0

@JayChakra: Нет, вы не можете удалить определенные векторы. (Однако вы можете ограничить удаление всех векторов на определенную страницу или диапазон страниц, а затем снова вставить эти страницы в исходный документ PDF.) –

+0

Ваши изображения не выглядят упорядоченными так, как вы ввели приведенные выше команды. «Фильтрация» X здесь означает не включать X в выход, правильно? – Geremia

6

Я расклеивание Ответа на этом вопрос сам, но фактический код с любезным Chris Liddell, 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:

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

+0

FWIW Я надеюсь получить версию кода Криса, встроенную в GS, в будущем выпуске. Таким образом, это будет возможно на всех устройствах без дополнительной работы. Не задерживайте дыхание, хотя .... – KenS

+0

@KenS: После того, как я обнаружил ссылку на код Криса в журналах IRC 2 часа назад, я надеялся, что он включит его вместе с другими * .ps-файлами в GS '/lib/'subdir. На что вы позволили мне надеяться, еще лучше :) –

+0

Мы не будем включать PostScript как таковой, нет. Я работаю над некоторыми внутренними вещами, которые будут работать со всеми переводчиками. С другой стороны, я работаю над этим уже почти год. – KenS

Смежные вопросы