Удалить/удалить все изображения из PDF с помощью Ghostscript или ImageMagick

Я хочу удалить / удалить все изображения в PDF-файле, оставив только текст / шрифт в PDF-файле с помощью любого возможного инструмента командной строки.

Я пытался использовать -dGraphicsAlphaBits=1 в команде Ghostscript, но изображения присутствуют, но похожи на большой пиксель.


person codin    schedule 19.12.2013    source источник
comment
По сути, вы не можете этого сделать, вам нужно будет изменить устройство pdfwrite, чтобы сбрасывать изображения.   -  person KenS    schedule 19.12.2013
comment
@kenS, хорошо, конечно, я посмотрю на это.   -  person codin    schedule 19.12.2013
comment
См. также этот вопрос.   -  person Greg Sadetsky    schedule 04.09.2018


Ответы (4)


Нет, насколько мне известно, невозможно удалить все изображения в PDF-файле с помощью инструмента командной строки.

Какова цель вашего запроса в любом случае? Сохранить на размер файла? Удалить информацию, содержащуюся в изображениях? Или ...?

Обходной путь

К чему бы вы ни стремились, вот команда, которая понижает разрешение всех изображений до разрешения 2 ppi (Обновление: 1 ppi не работает). Который достигает сразу двух целей:

  • уменьшить размер файла
  • сделать все изображения в основном непонятными

Вот как это сделать выборочно, только для изображений на странице 33 original.pdf:

gs                               \
  -o images-uncomprehendable.pdf \
  -sDEVICE=pdfwrite              \
  -dDownsampleColorImages=true   \
  -dDownsampleGrayImages=true    \
  -dDownsampleMonoImages=true    \
  -dColorImageResolution=2       \
  -dGrayImageResolution=2        \
  -dMonoImageResolution=2        \
  -dFirstPage=33                 \
  -dLastPage=33                  \
   original.pdf

Если вы хотите сделать это для всех изображений на всех страницах, просто пропустите параметры -dFirstPage и -dLastPage.

Если вы хотите удалить всю информацию о цвете из изображений, преобразуйте их в оттенки серого с помощью той же команды (ищите другие ответы на Stackoverflow, где обсуждаются подробности).


Обновление: изначально я предлагал использовать разрешение 1 PPI. Кажется, это не работает с Ghostscript. Я сейчас тестировал с 2 PPI. Это работает.


Обновление 2. См. также следующий (новый) вопрос с ответом:

Он предоставляет пример кода PostScript, который полностью удаляет все (растровые) изображения из PDF, оставляя остальную часть макета страницы без изменений.

Это также отражает расширенные новые возможности Ghostscript, которые теперь могут выборочно удалять либо весь текст, либо все растровые изображения, либо все векторные объекты из PDF, либо любую комбинацию этих трех типов.

person Kurt Pfeifle    schedule 19.12.2013
comment
Большое спасибо @Kurt, я действительно хотел, чтобы вы ответили на мой вопрос, так как вы, кажется, единственный эксперт в обработке PDF-файлов. На самом деле моя конечная цель — сгенерировать два изображения, одно из которых содержит слой изображения, а другое — только текстовый слой. Удаление фона — это всего лишь попытка достичь конечной цели. - person codin; 19.12.2013
comment
Но на самом деле это возможно с помощью инструмента командной строки, например. грамм. через cpdf. И может быть много причин, почему это делается - например, я могу назвать вам свою причину, поэтому я искал это - мне нужно подготовиться к экзамену, но файлы изображений бесполезны после того, как они уже известны, поэтому я просто сначала сосредоточьтесь на тексте; а затем, в качестве второго шага, из этого текста сделайте заметки о том, что стоит запомнить, а что нет. Я также могу придумать множество других возможных причин, но я думаю, что в stackoverflow лучше не спрашивать, ПОЧЕМУ, а просто предоставить решение, которое работает. - person shevy; 12.03.2017
comment
@shevy: Пожалуйста, обратите внимание на следующие факты: (1) ОП специально запросил решение Ghostscript или ImageMagick. (2) Мой ответ дал именно то, о чем просили. Я предоставил его после того, как Джон Уитингтон указал на cpdf (его собственный самодельный инструмент, который превосходен!), потому что cpdf не является общедоступным, так как Ghostscript (3) cpdf является платным инструментом. Несмотря на то, что существует бесплатная версия (версия сообщества), ее можно использовать только в некоммерческих целях. (4) Я не спрашивал о вашей причине - я спросил ОП, потому что это может быть полезно знать в... - person Kurt Pfeifle; 12.03.2017
comment
@shevy: (/продолжение) ... чтобы соответствующим образом сформировать ответ. Например, если основной целью этого вопроса было минимизировать размер файла, то могут быть другие (дополнительные) методы, кроме простого удаления изображений... (5) StackOverflow [...] лучше всего [.. .] просто предоставьте решение, которое работает. Спасибо за подсказку, приятель. Я бы никогда не подумал об этом. С нетерпением ждем всех ВАШИХ решений, которые работают! (6) И в любом случае спасибо за ваш отрицательный голос. - person Kurt Pfeifle; 12.03.2017

Вы можете использовать черновой вариант cpdf:

cpdf -draft in.pdf -o out.pdf

Это должно работать в большинстве ситуаций, но отправьте отчет об ошибке, если это вам не подходит.

Раскрытие информации: я являюсь автором cpdf.

person johnwhitington    schedule 20.12.2013
comment
Спасибо, это хорошо работает, оно успешно удаляет все изображения из pdf. Затем я попытался удалить шрифты из pdf с помощью команды cpdf -remove-fonts in.pdf -o out.pdf, но он оставил поврежденные шрифты / черные пятна. Рассмотрю это. - person codin; 20.12.2013
comment
Я попробовал ту же технику, и все изображения были удалены, но текст можно выбрать, но он не виден. Есть идеи, как с этим бороться? - person whereswalden; 19.03.2015

Прошло время, и разработка Ghostscript продвинулась...

Последние выпуски имеют следующие новые параметры командной строки. Их можно добавить в командную строку:

  1. -dFILTERIMAGE: производит вывод, в котором удаляются все растровые рисунки.

  2. -dFILTERTEXT: производит вывод, в котором все текстовые элементы удалены.

  3. -dFILTERVECTOR: в результате удаляются все векторные рисунки.

Любые два из этих вариантов можно комбинировать.

Пример команды:

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

Более подробную информацию (включая некоторые иллюстративные скриншоты) можно найти в моем ответе на "Как удалить все изображения из PDF?".

person Kurt Pfeifle    schedule 16.06.2016
comment
Замечательно! Действительно спасибо. Это спасает мне жизнь. - person Lisbeth; 17.04.2021

Для разделения изображений и текста на разные слои, к сожалению, недоступно бесплатное программное обеспечение с открытым исходным кодом. Тоже не бесплатный как в пиве...

Эта задача может быть решена только с помощью различных платных программных решений. Поскольку вы не исключили это в своем вопросе, но попросили 'любой возможный инструмент командной строки', я расскажу вам о своем любимом:

Доступна версия для использования CLI (которая включает в себя мощный SDK, позволяющий выполнять множество низкоуровневых манипуляций с PDF), и она поддерживается на всех основных платформах ОС, включая Linux.

callas предлагает вам полнофункциональную бесплатную тестовую лицензию, которая включена для (I поверьте) 14 дней.

person Kurt Pfeifle    schedule 19.12.2013
comment
Я тоже понимаю, что может быть не возможно найти легкий путь. Но я добился частичного успеха в создании фонового изображения только с помощью imageMagick. я только что использовал -blur 0x0, и он сгенерировал только фоновое изображение. Я понимаю, что это неправильный способ, и результаты могут отличаться в разных PDF-файлах. я просто пытаюсь, если мне удастся отменить эффект, чтобы текст оставался в следующий раз. Я обязательно попробую «каллы», это пробная версия на 7 дней. Я мог бы в конечном итоге купить его, если он работает так, как ожидалось, и если он не слишком тяжел для кармана. - person codin; 20.12.2013
comment
ImageMagick обрабатывает только растровые изображения. Поскольку он принимает PDF в качестве входных данных... нет, он не принимает сам PDF, он вызывает Ghostscript в качестве своего делегата, чтобы сначала преобразовать страницы в серию изображений; для вывода PDF он снова заключает растровое изображение в тонкую оболочку PDF. Когда данные проходят через ImageMagick, у вас остаются только растровые данные. Точно так же, как после того, как вы превратите стейк в фарш: пути назад к исходному стейку уже нет. Я могу точно сказать вам, что нет возможности использовать ImageMagick для разделения текста и изображений, находящихся на одной и той же странице PDF, на отдельные слои... - person Kurt Pfeifle; 20.12.2013
comment
@codin: теперь я не уверен, что у нас одинаковое понимание «слоев» для PDF. В спецификации PDF слои также называются Дополнительные группы содержимого (OCG). Вы имеете в виду это? - person Kurt Pfeifle; 20.12.2013
comment
@codin: Можете ли вы предоставить образец PDF (с одной или несколькими несколькими страницами), в котором вы хотите разделить изображения и текст на разные слои? - person Kurt Pfeifle; 20.12.2013
comment
@codin: я серьезно сомневаюсь, что ImageMagick -blur 0x0 превратит PDF-страницу со смешанным текстом и изображением в файл, в котором вы видите только пиксели изображения, а не текст.... - person Kurt Pfeifle; 20.12.2013
comment
Только что закончил установку GS и imageMagick на своем домашнем компьютере, я попробовал convert -blur 0x0 in.pdf out.png в том же pdf-файле, но изображение не выводится только здесь. выглядит как ошибка на моем рабочем компьютере. - person codin; 20.12.2013
comment
@codin: даже если это сработает, это никуда не приведет, потому что у вас будет изображение и текст в одном выходном файле. При этом, в зависимости от вашей версии IM, вам может понадобиться использовать другой порядок аргументов командной строки: convert in.pdf -blur 0x0 out.png. - person Kurt Pfeifle; 21.12.2013