Как преобразовать PDF в оттенки серого из командной строки, чтобы избежать растеризации?
Я пытаюсь преобразовать в оттенки серого этот PDF: https://dl.dropboxusercontent.com/u/10351891/page-27.pdf
Ghostscript (v 9.10) с pdfwrite Устройство завершается с ошибкой "Невозможно преобразовать цветовое пространство в серый, возвращая стратегию в LeaveColorUnchanged". сообщение.
Я могу конвертировать его через промежуточный файл ps (используя gs, pdftops (v 0.24.3) или pdf2ps), но это преобразование растрирует весь PDF. Я пробовал много других вещей: нормализовать PDF, используя qpdf (v 5.0.1) или pdftk (v 1.44), преобразовать его в файл svg и обратно в PDF через Inkscape (v 0.48.4)... ничего не кажется работать.
Единственное решение, которое я нашел (которое мне не подходит в производственной среде), - это использовать Preview на моем Mac и применить фильтр Quartz Grey Tone вручную или с помощью скрипта Automator.
Кто-нибудь найдет другой рабочий способ сделать это? Или можно нормализовать PDF-файл или устранить проблему, чтобы предотвратить появление сообщения Ghostscript "Невозможно преобразовать цветовое пространство..." или заставить цветовое пространство другим способом?
Спасибо!
9 ответов
gs \
-sDEVICE=pdfwrite \
-sProcessColorModel=DeviceGray \
-sColorConversionStrategy=Gray \
-dOverrideICC \
-o out.pdf \
-f page-27.pdf
Эта команда преобразует ваш файл в оттенки серого (GS 9.10).
Немного поздно днем, но главный ответ не работает для меня с другим файлом. Основной проблемой является старый код в Ghostscript, для которого существует более поздняя версия, которая не включена по умолчанию. Подробнее об этом здесь: http://bugs.ghostscript.com/show_bug.cgi?id=694608
Страница выше также дает команду, которая работает для меня:
gs -sDEVICE=pdfwrite -dProcessColorModel=/DeviceGray -dColorConversionStrategy=/Gray -dPDFUseOldCMS=false -o out.pdf -f in.pdf
Используйте самый последний код (еще не выпущенный) и установите ColorConversionStrategy=Grey
В Linux:
Установить pdftk
apt-get install pdftk
После того, как вы установили pdftk, сохраните скрипт как graypdf.sh со следующим кодом
# convert pdf to grayscale, preserving metadata
# "AFAIK graphicx has no feature for manipulating colorspaces. " http://groups.google.com/group/latexusersgroup/browse_thread/thread/5ebbc3ff9978af05
# "> Is there an easy (or just standard) way with pdflatex to do a > conversion from color to grayscale when a PDF file is generated? No." ... "If you want to convert a multipage document then you better have pdftops from the xpdf suite installed because Ghostscript's pdf to ps doesn't produce nice Postscript." http://osdir.com/ml/tex.pdftex/2008-05/msg00006.html
# "Converting a color EPS to grayscale" - http://en.wikibooks.org/wiki/LaTeX/Importing_Graphics
# "\usepackage[monochrome]{color} .. I don't know of a neat automatic conversion to monochrome (there might be such a thing) although there was something in Tugboat a while back about mapping colors on the fly. I would probably make monochrome versions of the pictures, and name them consistently. Then conditionally load each one" http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2005-08/msg01864.html
# "Here comes optional.sty. By adding \usepackage{optional} ... \opt{color}{\includegraphics[width=0.4\textwidth]{intro/benzoCompounds_color}} \opt{grayscale}{\includegraphics[width=0.4\textwidth]{intro/benzoCompounds}} " - http://chem-bla-ics.blogspot.com/2008/01/my-phd-thesis-in-color-and-grayscale.html
# with gs:
# http://handyfloss.net/2008.09/making-a-pdf-grayscale-with-ghostscript/
# note - this strips metadata! so:
# http://etutorials.org/Linux+systems/pdf+hacks/Chapter+5.+Manipulating+PDF+Files/Hack+64+Get+and+Set+PDF+Metadata/
COLORFILENAME=$1
OVERWRITE=$2
FNAME=${COLORFILENAME%.pdf}
# NOTE: pdftk does not work with logical page numbers / pagination;
# gs kills it as well;
# so check for existence of 'pdfmarks' file in calling dir;
# if there, use it to correct gs logical pagination
# for example, see
# http://askubuntu.com/questions/32048/renumber-pages-of-a-pdf/65894#65894
PDFMARKS=
if [ -e pdfmarks ] ; then
PDFMARKS="pdfmarks"
echo "$PDFMARKS exists, using..."
# convert to gray pdf - this strips metadata!
gs -sOutputFile=$FNAME-gs-gray.pdf -sDEVICE=pdfwrite \
-sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray \
-dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH "$COLORFILENAME" "$PDFMARKS"
else # not really needed ?!
gs -sOutputFile=$FNAME-gs-gray.pdf -sDEVICE=pdfwrite \
-sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray \
-dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH "$COLORFILENAME"
fi
# dump metadata from original color pdf
## pdftk $COLORFILENAME dump_data output $FNAME.data.txt
# also: pdfinfo -meta $COLORFILENAME
# grep to avoid BookmarkTitle/Level/PageNumber:
pdftk $COLORFILENAME dump_data output | grep 'Info\|Pdf' > $FNAME.data.txt
# "pdftk can take a plain-text file of these same key/value pairs and update a PDF's Info dictionary to match. Currently, it does not update the PDF's XMP stream."
pdftk $FNAME-gs-gray.pdf update_info $FNAME.data.txt output $FNAME-gray.pdf
# (http://wiki.creativecommons.org/XMP_Implementations : Exempi ... allows reading/writing XMP metadata for various file formats, including PDF ... )
# clean up
rm $FNAME-gs-gray.pdf
rm $FNAME.data.txt
if [ "$OVERWRITE" == "y" ] ; then
echo "Overwriting $COLORFILENAME..."
mv $FNAME-gray.pdf $COLORFILENAME
fi
# BUT NOTE:
# Mixing TEX & PostScript : The GEX Model - http://www.tug.org/TUGboat/Articles/tb21-3/tb68kost.pdf
# VTEX is a (commercial) extended version of TEX, sold by MicroPress, Inc. Free versions of VTEX have recently been made available, that work under OS/2 and Linux. This paper describes GEX, a fast fully-integrated PostScript interpreter which functions as part of the VTEX code-generator. Unless specified otherwise, this article describes the functionality in the free- ware version of the VTEX compiler, as available on CTAN sites in systems/vtex.
# GEX is a graphics counterpart to TEX. .. Since GEX may exercise subtle influence on TEX (load fonts, or change TEX registers), GEX is op- tional in VTEX implementations: the default oper- ation of the program is with GEX off; it is enabled by a command-line switch.
# \includegraphics[width=1.3in, colorspace=grayscale 256]{macaw.jpg}
# http://mail.tug.org/texlive/Contents/live/texmf-dist/doc/generic/FAQ-en/html/FAQ-TeXsystems.html
# A free version of the commercial VTeX extended TeX system is available for use under Linux, which among other things specialises in direct production of PDF from (La)TeX input. Sadly, it���s no longer supported, and the ready-built images are made for use with a rather ancient Linux kernel.
# NOTE: another way to capture metadata; if converting via ghostscript:
# http://compgroups.net/comp.text.pdf/How-to-specify-metadata-using-Ghostscript
# first:
# grep -a 'Keywo' orig.pdf
# /Author(xxx)/Title(ttt)/Subject()/Creator(LaTeX)/Producer(pdfTeX-1.40.12)/Keywords(kkkk)
# then - copy this data in a file prologue.ini:
#/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
#[/Author(xxx)
#/Title(ttt)
#/Subject()
#/Creator(LaTeX with hyperref package + gs w/ prologue)
#/Producer(pdfTeX-1.40.12)
#/Keywords(kkkk)
#/DOCINFO pdfmark
#
# finally, call gs on the orig file,
# asking to process pdfmarks in prologue.ini:
# gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \
# -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -dDOPDFMARKS \
# -sOutputFile=out.pdf in.pdf prologue.ini
# then the metadata will be in output too (which is stripped otherwise;
# note bookmarks are preserved, however).
дать файлу разрешения на исключение
chmod +x greypdf.sh
И выполните это так:
./greypdf.sh input.pdf
Он создаст файл input-grey.pdf в том же месте, что и исходный файл.
Очень поздний ответ, но должна работать следующая команда:
convert -colorspace GRAY input.pdf input_gray.pdf
Если вы взломаете файл, вы обнаружите, что большинство цветов определяется с помощью цветового пространства на основе RGB ICC (ищите 8 0 R
найти все ссылки на это цветовое пространство). Может быть, Г.С. жалуется на это?
Кто знает.
Вывод заключается в том, что преобразование страницы из одного цветового пространства в другое без влияния на содержимое является нетривиальным, поскольку вам необходимо иметь возможность визуализировать страницу и отследить все изменения в текущем цветовом / цветовом пространстве и заменить эквивалент в целевом пространстве. а также преобразовать все объекты XObject изображения в неправильное цветовое пространство, что потребует декодирования данных изображения и перекодирования его в целевом пространстве, а также все объекты XObject формы, что будет задачей, аналогичной попытке преобразовать родительскую страницу, поскольку Форма XObjects (я думаю, что ваш документ имеет 4) также содержит ресурсы и поток контента операторов маркировки страницы (которые могут включать в себя больше XObjects).
Это, конечно, выполнимо, но процесс почти такой же, как рендеринг, но с некоторым довольно специализированным кодом.
gs -dQUIET -dBATCH -dNOPAUSE -r150 -sDEVICE=pdfwrite -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -sOutputFile=output.pdf input.pdf
Вы можете использовать то, что я создал. Это дает вам возможность выбрать конкретные номера страниц, которые вы хотите преобразовать в оттенки серого. Удобно, если вы не хотите использовать оттенки серого для всего PDF. https://github.com/shoaibkhan94/PdfGrayscaler.
Используйте для изменения цветового пространства PDF-файлов.
mutool recolor -c gray -o output.pdf input.pdf
Допустимое цветовое пространство:gray
(по умолчанию),rgb
иcmyk
.
mutool recolor
является частью пакета MuPDF , начиная с версии 1.22.1 .