Преобразование PDF в черно-белый с помощью Ghostscript

Вопрос или проблема

Аналогично этому вопросу:

Конвертировать PDF в градации серого через командную строку в FLOSS?

У меня есть PDF-документ, и я хочу конвертировать его в чисто черно-белый. Я хочу избавиться от полутона. Чтобы конвертировать в градации серого с помощью ghostscript, я могу использовать эту команду:

gs \
 -sOutputFile=output.PDF \
 -sDEVICE=pdfwrite \
 -sColorConversionStrategy=Gray \
 -dProcessColorModel=/DeviceGray \
 -dCompatibilityLevel=1.4 \
  input.PDF < /dev/null

Что мне нужно изменить, чтобы получить монохром, т.е. только цвета черный и белый и без полутонов?

Последнее предложение действительно только конвертирует в градации серого и работает только если исходный документ использует setrgbcolor. Это не сработало для меня, так как у меня был документ, который использовал setcolor.

Я добился успеха, переопределив setcolor, чтобы всегда устанавливать цвет в 0,0,0:

gs -o <output-file.pdf> -sDEVICE=pdfwrite \
-c "/osetcolor {/setcolor} bind def /setcolor {pop [0 0 0] osetcolor} def" \
-f <input-file.ps>

Прошло 15+ лет с тех пор, как я занимался хакингом PostScript, так что вышеуказанное может быть неуклюжим, неправильным или даже случайным – если вы знаете, как сделать лучше, пожалуйста, подскажите.

Я не уверен, сработает ли следующее предложение… но может быть, стоит попробовать:

  1. Конвертировать PDF в PostScript, используя простую утилиту pdf2ps
  2. Конвертировать этот PostScript обратно в PDF, используя переопределенный оператор /setrgbcolor

Это команды:

Сначала

  pdf2ps color.pdf color.ps

Это даст вам color.ps в качестве вывода.

Второй

gs \
-o bw-from-color.pdf \
-sDEVICE=pdfwrite \
-c "/setrgbcolor{0 mul 3 1 roll 0 mul 3 1 roll 0 mul 3 1 roll 0 mul add add setgray}def" \
-f color.ps

Это не ghostscript, но с imagemagick это достаточно просто:

 convert -monochrome input.pdf output.pdf

Я не смог понять, какой процесс выбора цвета используется в PDF, с которыми я работаю. Поэтому я сначала конвертирую в градации серого PostScript:

gs -o gray.ps -sDEVICE=ps2write -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray -dCompatibilityLevel=1.4 -f colored.pdf

Поскольку PDF, которые я пытаюсь распечатать, могут содержать конфиденциальную информацию, которая ловко «засекречена» установкой цвета в белый, мне нужно использовать некоторую форму порогирования. Вот что я придумал:

gs -o thresholded.pdf -sDEVICE=pdfwrite -c "/osetgray {setgray} bind def /setgray {0.5 lt {0} {1} ifelse osetgray} def" -f gray.ps

Для тех (как я), кто не знаком со стильным программированием PostScript, это переопределяет setgray как:

setgray(value) {
   original_setgray(value < 0.5 ? 0 : 1)
}

Чтобы проверить осуществимость этого подхода, вы можете создать простой файл PostScript, используя enscript:

 printf 'Темный \x00color{0.9 0.9 0.9} Светлый\n' | enscript --escapes --no-header -o colored.ps

Затем продолжите использовать обе команды, как указано выше.

Сгенерированный Ghostscript ps2write файл gray.ps будет содержать строку /G/setgray load def. Это предоставляет /G как псевдоним для /setgray. Где-то позже происходит фактическая компоновка текста (некоторые строки опущены):

(Темный )Tj
0.898 G
( Светлый)Tj

Только при этих обстоятельствах thresholded.pdf будет показывать “Темный” как полностью черный и “Светлый” как полностью белый.

Это выглядит как работающая схема:

1) Конвертировать файл в монохром с помощью gs

gs -sDEVICE=psmono \
  -dNOPAUSE -dBATCH -dSAFER \
  -sOutputFile=combined.ps \
  first.pdf \
  second.ps \
  third.eps [...]

3) Конвертировать файл Postscript обратно в PDF с помощью ps2pdf или gs

(кредит: http://www.linuxjournal.com/content/tech-tip-using-ghostscript-convert-and-combine-files)

для PDF в градациях серого:

С помощью GhostScript

В коде PHP используйте этот скрипт

exec("'gs' '-sOutputFile=outputfilename.pdf' '-sDEVICE=pdfwrite' '-sColorConversionStrategy=Gray' '-dProcessColorModel=/DeviceGray' '-dCompatibilityLevel=1.4'  'inputfilename.pdf'",$output);

полезный url
http://www.linuxjournal.com/content/tech-tip-using-ghostscript-convert-and-combine-files

Просто хотел добавить, что это была полезная запись. Я использовал k2pdfopt для форматирования pdf для использования на kindle. В течение многих лет использовал gImageReader, редактировал pdf с помощью яркости и контрастности и экспортировал в файл изображения. Большая проблема заключалась в том, что мне приходилось вручную щелкать правой кнопкой мыши для каждого изображения pdf, что, мягко говоря, утомительно и требует много tinkering. В любом случае, я с небольшими пробами и ошибками обнаружил, что приведенное выше сообщение было полезно, но определенно добавил бы следующие строки, цветовая схема gray, будучи очень важной и используемой с posterize, кажется, очищает много мусора. Я буду использовать эту полезную команду с pdfarranger, если это будет необходимо, и k2pdfopt!

convert -density 300 -colorspace Gray -posterize 2 -deskew 80% input.pdf output.pdf

Единственное, что я сделал с imagemagick, это изменить файл политики на разрешение записи для использования с pdf. Существует множество документации по этому вопросу – спасибо интернету!

Для чисто черно-белого PDF вам нужно сначала конвертировать его в формат ps, а затем в PDF для постскрипта:

exec(" gs -sDEVICE=psmono  -dNOPAUSE -dBATCH -dSAFER  -sOutputFile=combined.ps  $pdf");

постскрипт в PDF -> черно-белый

exec(" gs -sDEVICE=pdfwrite   -dNOPAUSE -dBATCH -dSAFER  -sOutputFile=file_pdf.pdf  filename.ps");

Мне пришлось немного изменить решение, предложенное Surge (выше), для моего файла:

Шаг 1: Конвертировать coloured.pdf в coloured.ps

gswin64c -dNOPAUSE -dBATCH -sDEVICE=ps2write -sOutputFile=coloured.ps coloured.pdf

Шаг 2: Конвертировать coloured.ps в blackandwhite.pdf

gswin64c ^
-dBATCH -dNOPAUSE -q ^
-sOutputFile=blackandwhite.pdf ^
-sDEVICE=pdfwrite ^
-c "/osetrgbcolor {setrgbcolor} bind def /setrgbcolor {pop pop pop 0 0 0 osetrgbcolor} def" ^
-f coloured.ps

У меня не было успеха с оператором setcolor, как предложил Surge. Поэтому я решил поэкспериментировать с другими операторами, которые могут устанавливать цвет в PostScript, такими как setgray, setrgbcolor, setcmykcolor и т.д.

Что я понимаю, так это то, что код в кавычках, следующий за -c, является postscript. Он говорит о том, чтобы bind оригинальное определение setrgbcolor с новым пользовательским оператором, именуемым osetrgbcolor. Теперь определим новый экземпляр setrgbcolor, который убирает 3 входа, ожидаемые оригинальным setrgbcolor и заменяет их на 0 0 0, т.е. красный=0, зеленый=0, синий=0. Таким образом, 0 0 0 передается оператору osetrgbcolor, ранее определенному как пользовательский.

PS1: Вышеуказанный код был реализован в командной строке Windows.

PS2: Я был полным новичком в программировании Postscript. Я получил старт от ютоубера “John’s Basement” в видео-серии Учебник по Postscript. Я обратился к Справочнику по языку Postscript Adobe, чтобы понять оператор setrgbcolor и операнды, которые он принимает.

ImageMagick может это сделать.

convert -posterize 2 input.pdf output.pdf

Получается хорошо и четко, и размер файла примерно в три раза меньше, чем у цветной оригинала.

Ответ или решение

Конвертирование PDF в черно-белый формат с помощью Ghostscript

Конвертация документов PDF в черно-белый или монохромный формат может быть важной задачей для профессионалов в области ИТ, особенно когда необходимо сохранить информацию на черно-белых принтерах или уменьшить размер файлов. В этой статье мы рассмотрим, как выполнить данную задачу с помощью инструмента Ghostscript, более подробно остановившись на специфических параметрах и особенностях процесса.

Шаг 1: Конвертация PDF в PostScript

Первым шагом в процессе является преобразование PDF-документа в формат PostScript (PS). Это необходимо, поскольку применяемые методы изменения цветов могут быть более гибкими и эффективными в формате PS. Используйте следующую команду для выполнения этой операции:

gs -sDEVICE=ps2write -sOutputFile=output.ps -dNOPAUSE -dBATCH input.pdf

Здесь input.pdf — это ваш исходный файл, а output.ps — имя выходного файла в формате PS.

Шаг 2: Преобразование PS в черно-белый PDF

После успешной конвертации в PS, следующим шагом будет преобразование этого PostScript-файла обратно в PDF с использованием приведения цветов к черно-белому формату. Для этого выполните следующую команду:

gs -sDEVICE=pdfwrite -sOutputFile=output_bw.pdf -dNOPAUSE -dBATCH -c "/osetrgbcolor {setrgbcolor} bind def /setrgbcolor {pop pop pop 0 0 0 osrbgcolor} def" -f output.ps

В данном случае мы переопределяем команду setrgbcolor, что позволяет заменить все цветовые значения на черный. Это достигается путём удаления всех входных значений и подстановки цвета 0, 0, 0, что соответствует черному. output_bw.pdf будет вашим финальным документом в черно-белом формате.

Альтернативные методы

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

convert -monochrome input.pdf output.pdf

ImageMagick может быть удобен благодаря своей простоте использования и возможности быстрого выполнения задач, однако Ghostscript предоставляет более точный контроль над процессом конвертации и результатом.

Примечание о качестве результирующих файлов

Важно понимать, что в зависимости от исходного PDF-документа и выбранных параметров, качество итогового результат может варьироваться. Если ваш исходный файл использует методы управления цветом, которые не поддерживаются или не заметны в операциях setrgbcolor, вы можете столкнуться с неполным или недостаточно качественным преобразованием. В таких случаях рассмотрите возможность применения дополнительных параметров или предварительной настройки входного документа.

Заключение

Преобразование PDF-документа в черно-белый формат с использованием Ghostscript — это мощный инструмент, который, при правильном использовании, может значительно упростить процесс обработки документов. С помощью приведенных выше команд и параметров вы сможете добиться наилучших результатов и сохранить необходимую информацию в нужном формате.

Оцените материал
Добавить комментарий

Капча загружается...