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