Как я могу удалить все изображения из 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".
Выполнение следующих 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-файлов:
Если вам интересно, почему что-то, похожее на изображение, все еще находится на выходной странице: это на самом деле не растровое изображение, а "шаблон" в исходном файле, и поэтому оно не удаляется.