[让ImageMagick的identify
很难将PDF识别为CMYK感到很麻烦。
基本上,假设我要使用test.tex
构建此文件pdflatex
:
\documentclass[a4paper,12pt]{article}
%% https://tex.stackexchange.com/questions/13071
\pdfcompresslevel=0
%% http://compgroups.net/comp.text.tex/Making-a-cmyk-PDF
%% ln -s /usr/share/color/icc/sRGB.icm .
% \immediate\pdfobj stream attr{/N 4} file{sRGB.icm}
% \pdfcatalog{%
% /OutputIntents [ <<
% /Type /OutputIntent
% /S/GTS_PDFA1
% /DestOutputProfile \the\pdflastobj\space 0 R
% /OutputConditionIdentifier (sRGB IEC61966-2.1)
% /Info(sRGB IEC61966-2.1)
% >> ]
% }
%% http://latex-my.blogspot.com/2010/02/cmyk-output-for-commercial-printing.html
%% https://tex.stackexchange.com/questions/9961
\usepackage[cmyk]{xcolor}
\begin{document}
Some text here...
\end{document}
[如果我随后尝试识别生成的test.pdf
文件,则无论我尝试了什么选项(至少根据源中的链接),我都会将其获取为RGB-但是,其中的颜色将是另存为CMYK;对于上面的源:
$ grep -ia 'cmyk\|rgb\| k' test.pdf
0 0 0 1 k 0 0 0 1 K
0 0 0 1 k 0 0 0 1 K
0 0 0 1 k 0 0 0 1 K
0 0 0 1 k 0 0 0 1 K
FontDirectory/CMR12 known{/CMR12 findfont dup/UniqueID known{dup
/PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.11-2.2 (TeX Live 2010) kpathsea version 6.0.0)
$ identify -verbose 'test.pdf[0]'
...
Type: Palette
Endianess: Undefined
Colorspace: RGB
Depth: 16/8-bit
Channel depth:
red: 8-bit
green: 8-bit
blue: 8-bit
Channel statistics:
Red:
...
Green:
...
Blue:
...
Histogram:
5: (12593,11565,11822) #31312D2D2E2E rgb(49,45,46)
4: (16448,15420,15677) #40403C3C3D3D rgb(64,60,61)
9: (20303,19275,19532) #4F4F4B4B4C4C rgb(79,75,76)
25: (23901,23130,23387) #5D5D5A5A5B5B rgb(93,90,91)
...
如果我也取消对\immediate\pdfobj stream ...
的评论,也会发生同样的情况部分;但是,如果文档中只有一种颜色(黑色),我看不到identify
的RGB值直方图在哪里(尽管可以说,它们都接近于灰色)?
所以请不要介意,尽管我最好尝试使用ghostscript
将test.pdf
转换为新的pdf,identify
会将其识别为CMYK,但即使这样也没有运气:
$ gs -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -sOutputFile=test-gs.pdf -dUseCIEColor -sProcessColorModel=DeviceRGB -dProcessColorModel=/DeviceCMYK -sColorConversionStrategy=/CMYK test.pdf
GPL Ghostscript 9.01 (2011-02-07)
Copyright (C) 2010 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
$ identify -verbose 'test-gs.pdf[0]'
...
Type: Grayscale
Base type: Grayscale
Endianess: Undefined
Colorspace: RGB
Depth: 16/8-bit
...
因此identify
唯一被视为变化的是Type: Grayscale
(来自先前的Type: Palette
);但否则仍然会看到RGB颜色空间!
此外,请注意identify
是能够正确报告CMYK pdf-有关使用CMYK poster example: fitting pdf page size to (bitmap) image size? #17843 - TeX - LaTeX - Stack Exchange和convert
生成此类PDF文件的命令行示例,请参见gs
。实际上,我们可以执行:
convert test.pdf -depth 8 -colorspace cmyk -alpha Off test-c.pdf
...并且此will的PDF结果为identify
作为CMYK-但是,该PDF也将被光栅化(默认为72 dpi)。
编辑:我刚刚发现,如果我在OpenOffice中创建一个.odp演示文稿,然后将其导出为PDF;该PDF默认为RGB,但是以下命令(来自ghostscript Examples | Production Monkeys):
# Color PDF to CMYK:
gs -dSAFER -dBATCH -dNOPAUSE -dNOCACHE -sDEVICE=pdfwrite \
-sColorConversionStrategy=CMYK -dProcessColorModel=/DeviceCMYK \
-sOutputFile=output.pdf input.pdf
...实际上将产生CMYK pdf,由identify
报告(尽管在所有四个通道上,黑色都将丰富而不是纯色);但是,当幻灯片具有添加的图像时(显然,这是触发颜色转换的图像!!),此命令将仅适用[[only!有趣的是,我无法从pdflatex
PDF中获得相同的效果。
所以我想我的问题可以通过两种方式提出:
identify
中被识别(因此将建立正确的CMYK颜色直方图)identify
的命令行Linux工具,即使在test.pdf
中的原始pdflatex
中,它也可以正确识别CMYK颜色的使用(identify
应该是一些参考:
例如是否指定为“ 0 0 01 setcmykcolor”?或者更确切地说是“ 0 0 0 setrgbcolor”?在后一种情况下,如果DeviceRGB为重新映射到基于CIE的颜色空间以获得RGB图像颜色托管。
gs \
-o test-cmyk.pdf \
-sDEVICE=pdfwrite \
-sProcessColorModel=DeviceCMYK \
-sColorConversionStrategy=CMYK \
-sColorConversionStrategyForImages=CMYK \
test.pdf
更新如果颜色转换无法按需工作,并且您看到类似
“无法将颜色空间转换为灰度,将策略恢复为LeaveColorUnchanged”的消息,然后...
和的较新版本。您的源PDF可能使用嵌入的您的Ghostscript可能是
- 9.x版本系列
ICC颜色配置文件 在这种情况下,在命令行中添加
-dOverrideICC
并查看它是否根据需要更改结果。
更新2为了避免图像中出现JPEG artifacts appearing(以前没有),请添加:
-dEncodeColorImages=false
进入命令行。(对于几乎所有的GS
PDF-> PDF
处理都是正确的,不仅限于这种情况。因为默认情况下,GS会在被要求生成PDF输出时创建具有全新构造的对象和新文件结构的全新文件-它不会简单地重用先前的对象,因为像pdftk
这样的更“笨拙”的PDF处理器{pdftk
还有其他优点,请不要误解我的说法!}。GS默认情况下应用JPEG压缩-查看当前Ps2pdf documentation并搜索“ ColorImageFilter”以了解更多详细信息...)