如何使用postscript将CMYK图像插入PDF

时间:2015-05-20 14:40:11

标签: pdf ghostscript postscript cmyk

我刚开始学习postscript,我已经开始创建PDF(应该是CMYK)并插入图像。

然而,我已经搜索并搜索了互联网并尽可能多地下载了Postscript手册,而没有一个简单的例子(如果我错过了任何一个,请纠正我)。

所以,我的问题是我有一个CMYK图像,我希望它嵌入我的PDF中。然而,当我使用基于RGB图像的简单示例插入它时,图片变为负面(我已经改变了我认为适合CMYK图像的内容)

以下是我用作pdf创作的内容。

    %!
/Times-Roman findfont 14 scalefont setfont 
<< /PageSize [419.528 595.276] >> setpagedevice 
% MM to Units 
% [ W x H ] 
/DeviceCMYK setcolorspace 
% Page 1 

%
% Set the Original to be the top left
%
0 595.276 translate 
1 -1 scale 
gsave 
%
% Save this state before moving x y specifically for images
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Image 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 % set the X and Y of the mask here
-8.5039 140.21007874 translate  %Top Left Coordinates of mask

/box {
   newpath
   moveto

   436.535433071 0 rlineto % width of the mask
   0 463.569448819 rlineto % height of the mask  %Top Left Coordinates
   -436.535433071 0 rlineto

   closepath
} def

0 0 box                % Set up our box
  clip                     % Clip to the box

% DO NOT reset the document to original position 
% as we want the translate to be relative to the clipped box
%
%grestore  * Do not use here
%gsave * Do not use here
%

%% Images when flipped to draw correctly are scaled UPWARDS 
%% so you need to move the x,y position to the bottom left

-1.44 621.714330709 translate % Bottom Left Cordinates

% unset the mirror or the image will be flipped!
1 -1 scale 

% scale the image
438.000944882 657.119055118 scale  %%% Need to work out size and width into Units

1825                   % number of columns per row  %width of the image %%%% IN PIXELS!
2738                   % number of rows %height of the images %%%% IN PIXELS!

8                    % bits per color channel (1, 2, 4, or 8)
[1825 0 0 -2738 0 2738]       % transform array... maps unit square to pixel
(cmyk_image.jpg) (r) file /DCTDecode filter % opens the file and filters the image data
false                 % pull channels from separate sources
4
colorimage

%%%%%
% End of Image 1
%%%%%

showpage

我已经尝试过查看viewjpeg.ps,但我希望将图像插入到PS中,而不是通过命令行插入。

非常感谢

编辑:有问题的图片:)(由于它的大小和cmyk颜色空间,它是通过湿转移)

cmyk_image.jpg

再次编辑:

我使用字典(基于你的帖子KenS Simple Image Dictionary)再次调整了代码。

    << /PageSize [419.528 595.276] >> setpagedevice 
0 595.276 translate 
1 -1 scale 

-1.44 621.714330709 translate % Bottom Left Cordinates

% unset the mirror or the image will be flipped!
1 -1 scale 

% scale the image
438.000944882 657.119055118 scale  %%% Need to work out size and width into Units

/OneComponentString (cmyk_image.jpg) (r) file /DCTDecode filter  def

/OneComponentImage1
{
<<
/ImageType 1
/Width 1825
/Height 2738
/ImageMatrix [1825 0 0 -2738 0 2738]
/BitsPerComponent 8
/DataSource OneComponentString
>>
} bind def

gsave

/DeviceCMYK setcolorspace
OneComponentImage1 image
grestore
showpage

然而它仍然是负面的(我已经明确地从字典中省略了/ Decode [0 1],因为这引发了以下错误:

    Error: /rangecheck in --image--
Operand stack:
   --dict:7/7(L)--
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1951   1   3   %oparray_pop   1950   1   3   %oparray_pop   1934   1   3   %oparray_pop   1820   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   1847   1   3   %oparray_pop
Dictionary stack:
   --dict:1183/1684(ro)(G)--   --dict:0/20(G)--   --dict:80/200(L)--
Current allocation mode is local
Last OS error: Invalid argument

所以,我认为我越来越近了。有人可以解释Decode选项以及为什么在使用CMYK图像时会出现错误吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

您实际上还没有说过您正在使用哪些手册,因此难以向其他人推荐。

我要注意的第一件事是你正在使用colorimage,你可能想要停止这样做并使用图像操作符的字典形式,这样更灵活。如果您想尝试一些具有字典形式的其他图像类型,它将更有用。 colorimage运算符基本上是1级和2级PostScript之间的讨厌的黑客攻击。

viewjpeg.ps能否正确处理JPEG文件?如果是这样,那么你可以将它用作模板(注意viewjpeg.ps使用图像操作符的字典形式)。

顺便说一句,如果您打算使用JPEG作为图像数据源,则需要注意pdfwrite设置,如果您不改变ColorImageFilter,则pdfwrite会对您的图像应用JPEG压缩。 JPEG压缩以前经过JPEG压缩的数据会导致明显的质量损失。

就反转而言,我猜想从JPEG图像返回的样本相对于PostScript CMYK颜色模型(0 = 0%着色剂,255 = 100%着色剂)简单地反转。显然,我无法看到jpeg文件。

答案 1 :(得分:0)

感谢KenS,我能够以300 DPI的速度获得CYMK图像。

    << /PageSize [419.528 595.276] >> setpagedevice 
    % [ W x H ] 
    /DeviceCMYK setcolorspace 
    % Page 1 

    %
    % Set the Original to be the top left
    %
    0 595.276 translate 
    1 -1 scale 
    gsave 


    %% Images when flipped to draw correctly are scaled UPWARDS 
%% so you need to move the x,y position to the bottom left

-1.44 621.714330709 translate % Bottom Left Cordinates

% unset the mirror or the image will be flipped!
1 -1 scale 

% scale the image
438.000944882 657.119055118 scale  %%% Need to work out size and width into Units


/Image1File (cmyk_image.jpg) (r) file /DCTDecode filter  def

/Image1
{
<<
  /ImageType 1
  /Width 1825
  /Height 2738
  /ImageMatrix [1825 0 0 -2738 0 2738]
  /BitsPerComponent 8
  /Decode [1 0 1 0 1 0 1 0] % can either be 1 0 or 0 1
  /DataSource Image1File
>>
} bind def

/DeviceCMYK setcolorspace
Image1 image

% Reset to previous X and Y ( line 13 )
grestore 
gsave

showpage 

然后我从命令行执行此操作。

gs -o output.pdf -sDEVICE=pdfwrite -dColorConversionStrategy=/LeaveColorUnchanged -dEncodeColorImages=false -dEncodeGrayImages=false -dEncodeMonoImages=false input.ps