it-swarm.com.de

Wie konvertiere ich ein PDF zu Graustufen von der Kommandozeile vermeiden, gerastert zu werden?

Ich versuche, dieses PDF in Graustufen umzuwandeln: https://dl.dropboxusercontent.com/u/10351891/page-27.pdf

Ghostscript (v 9.10) mit pdfwrite Device schlägt fehl mit der Meldung "Der Farbraum kann nicht in Grau konvertiert werden, die Strategie wird auf LeaveColorUnchanged zurückgesetzt." Botschaft.

Ich kann es über eine zwischengeschaltete ps-Datei (mit gs, pdftops (v 0.24.3) oder pdf2ps) konvertieren, aber diese Konvertierung rastert das gesamte PDF. Ich habe viele andere Dinge ausprobiert: Normalisieren Sie das PDF mit qpdf (v 5.0.1) oder pdftk (v 1.44), transformieren Sie es in eine svg-Datei und zurück in ein PDF über Inkscape (v 0.48.4) ... nichts scheint zu funktionieren.

Die einzige Lösung, die ich gefunden habe (die für mich in der Produktionsumgebung nicht geeignet ist), besteht darin, die Vorschau auf meinem Mac zu verwenden und einen Quarz-Grauton-Filter manuell oder mit einem Automator-Skript anzuwenden.

Hat jemand einen anderen Weg gefunden, dies zu tun? Oder ist es möglich, PDF zu normalisieren oder das Problem zu beheben, um die Ghostscript-Meldung "Konvertieren des Farbraums nicht möglich ..." zu verhindern oder den Farbraum auf andere Weise zu erzwingen?

Vielen Dank!

15
Panda
gs \
   -sDEVICE=pdfwrite \
   -sProcessColorModel=DeviceGray \
   -sColorConversionStrategy=Gray \
   -dOverrideICC \
   -o out.pdf \
   -f page-27.pdf

Dieser Befehl konvertiert Ihre Datei in Graustufen (GS 9.10).

30
user2846289

Ein bisschen spät am Tag, aber die beste Antwort funktioniert bei mir nicht mit einer anderen Datei. Das zugrunde liegende Problem scheint alter Code in Ghostscript zu sein, für den es eine neuere Version gibt, die standardmäßig nicht aktiviert ist. Mehr dazu hier: http://bugs.ghostscript.com/show_bug.cgi?id=694608

Die Seite oben enthält auch einen Befehl, der für mich funktioniert:

gs \
  -sDEVICE=pdfwrite \
  -dProcessColorModel=/DeviceGray \
  -dColorConversionStrategy=/Gray \
  -dPDFUseOldCMS=false \
  -o out.pdf \
  -f in.pdf
7
Reuben Thomas

Verwenden Sie den neuesten Code (noch nicht veröffentlicht) und legen Sie ColorConversionStrategy = Gray fest

3
KenS

sehr spät, aber der folgende Befehl sollte funktionieren:

convert -colorspace GRAY input.pdf input_gray.pdf
2
Phyast10

Wenn Sie in die Datei einsteigen, werden Sie feststellen, dass die meisten Farben durch einen RGB-ICC-basierten Farbraum bestimmt werden (suchen Sie nach 8 0 R, um alle Verweise auf diesen Farbraum zu finden). Vielleicht beklagt sich gs darüber?

Wer weiß.

Der Nachteil ist, dass das Konvertieren einer Seite von einem Farbraum in einen anderen ohne Auswirkungen auf den Inhalt nicht unerheblich ist, da Sie die Seite rendern und alle Änderungen an der aktuellen Farbe/Farbraum abfangen und ein Äquivalent im Zielbereich einsetzen müssen sowie alle Bild-XObjects im falschen Farbraum konvertieren, was die Dekodierung und erneute Kodierung der Bilddaten im Zielbereich sowie alle Form-XObjects erfordert. Dies ist eine Aufgabe, die dem Konvertieren der übergeordneten Seite ähnelt form XObjects (Ich glaube, Ihr Dokument hat 4) enthält auch Ressourcen und einen Inhaltsstrom von Seitenmarkierungsoperatoren (die möglicherweise mehr XObjects enthalten).

Es ist sicherlich machbar, aber der Prozess ist fast dasselbe wie das Rendern, jedoch mit einem ziemlich speziellen Code.

2
plinth

In Linux:

Installieren Sie pdftk

apt-get install pdftk

Nachdem Sie pdftk installiert haben, speichern Sie das Skript mit dem folgenden Code als 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). 

erteilen Sie der Datei Ausführungsberechtigungen 

chmod +x greypdf.sh

Und führe es so aus:

./greypdf.sh input.pdf

Es wird eine Datei input-gray.pdf am selben Ort wie die ursprüngliche Datei erstellt

1
Salvi Pascual

Du kannst etwas verwenden, was ich erschaffen habe. Sie haben die Möglichkeit, die bestimmten Seitenzahlen auszuwählen, die Sie in Graustufen konvertieren möchten. Praktisch, wenn Sie nicht das gesamte PDF in Graustufen erstellen möchten. https://github.com/shoaibkhan94/PdfGrayscaler

0
Shoaib Khan