检查PDF是彩色还是灰度或黑白

时间:2014-09-02 13:19:38

标签: pdf colors

有哪些方法可以检查PDF文件是彩色还是灰度还是黑/白?

3 个答案:

答案 0 :(得分:2)

传统的做法是使用预检工具,例如callas软件的工具(注意:我与该公司有关联)。但是,如果PDF的这个方面是你想要检查的唯一方面,那可能会有点矫枉过正。

我认为第二种可能的方法是使用可以将PDF转换为图像然后分析图像的工具(转换为CMYK图像 - 然后查看C,M或Y通道上是否有任何内容)在那个生成的图像中。)

答案 1 :(得分:2)

您可以使用Ghostscript的inkcov设备获取有关每个PDF页面的颜色信息。以下是我的示例PDF( cmyk.pdf )的示例命令及其输出:

gs -o - -sDEVICE=inkcov cmyk.pdf

   GPL Ghostscript 9.10 (2013-08-30)
   Processing pages 1 through 5.

   Page 1
    0.00000  0.00000  0.00000  0.02231 CMYK OK
   Page 2
    0.02360  0.02360  0.02360  0.02360 CMYK OK
   Page 3
    0.02525  0.02525  0.02525  0.00000 CMYK OK
   Page 4
    0.00000  0.00000  0.00000  0.01983 CMYK OK
   Page 5
    0.13274  0.13274  0.13274  0.03355 CMYK OK

如果添加-q参数,结果为:

gs -q -o - -sDEVICE=inkcov cmyk.pdf

    0.00000  0.00000  0.00000  0.02231 CMYK OK
    0.02360  0.02360  0.02360  0.02360 CMYK OK
    0.02525  0.02525  0.02525  0.00000 CMYK OK
    0.00000  0.00000  0.00000  0.01983 CMYK OK
    0.13274  0.13274  0.13274  0.03355 CMYK OK

如何解释这些数字?

  1. 每列代表一种颜色,从左到右:青色( C ),洋红色( M ),黄色( Y )和黑色( K )。
  2. 0.00000表示使用的零颜色 值1.00000表示100%覆盖纸张的相应颜色。 第2页上每种墨水颜色的0.02360值表示:每种颜色占整页的2.36%(包括黑色)。
  3. 您可以看到 第1页 的值:Cyan,Magenta和Yellow的值0.00000相同,但0.022310.02360黑色。这意味着:第1页仅使用黑色墨水,2.231%的页面区域被黑色墨水覆盖。

    选择 第2页 :此处,每种4种墨水的值均为0.02525。每种墨水占整页的2.36%。

    另请参阅 第3页 的值:0.00000表示C,M和Y以及inkcov表示黑色。所以这个页面根本不使用黑色墨水,而是使用相同颜色的墨水覆盖整个页面的2.525%的相同大小的区域。

    :结果类似于第1页。

    Page 5 :看看自己......

    <强>注意事项:

    1. inkcov设备始终打印CMYK值,而不打印RGB值。原因是它在分析页面的颜色覆盖率之前将所有RGB色调转换为CMYK。这当然会引入一些不准确之处(在您依赖此工具之前必须考虑到这一点)。
    2. 您需要使用Ghostscript 9.05或更高版本(如果您使用的是MS Windows:v9.07或更高版本)。以前的版本没有cmyk.pdf设备。
    3. 您肯定会遇到PDF页面,这些页面在PDF查看器中或在纸张上打印时似乎不包含颜色,只有灰色阴影。这是因为可以使用等量的不同颜色来组成灰色阴影。

    4. 更新

      以下图片粗略地再现了上述cmyk.pdf的5个PDF页面。这应该可以让您在PDF查看器中看到它们的外观。它应该更容易理解上面引用的墨水覆盖的不同值如何加起来:

      Image representing the 5 pages of <code>cmyk.pdf</code>

      以下是我最初用于创建上述gs \ -o cmyk.pdf \ -sDEVICE=pdfwrite \ -g5950x2105 \ -c "/F1 {100 100 moveto /Helvetica findfont 42 scalefont setfont} def" \ -c "F1 (100% 'pure' black) show showpage" \ -c "F1 .5 .5 .5 setrgbcolor (50% 'rich' rgbgray) show showpage" \ -c "F1 .5 .5 .5 0 setcmykcolor (50% 'rich' cmykgray) show showpage" \ -c "F1 .5 setgray (50% 'pure' gray) show showpage" \ -c " 1 0 0 0 setcmykcolor 100 130 64 64 rectfill" \ -c " 0 1 0 0 setcmykcolor 200 130 64 64 rectfill" \ -c " 0 0 1 0 setcmykcolor 300 130 64 64 rectfill" \ -c " 0 0 0 1 setcmykcolor 400 130 64 64 rectfill" \ -c " 0 1 1 0 setcmykcolor 100 30 64 64 rectfill" \ -c " 1 0 1 0 setcmykcolor 200 30 64 64 rectfill" \ -c " 1 1 0 0 setcmykcolor 300 30 64 64 rectfill" \ -c " 1 1 1 0 setcmykcolor 400 30 64 64 rectfill showpage" 的Ghostscript命令:

      {{1}}

答案 2 :(得分:1)

Amyn,

这是来自LEADTOOLS支持的穆罕默德。我注意到您在我们的LEADTOOLS支持论坛上发布了类似的问题。我已经在那里发布了一个回复,这里有一个稍微修改过的回复:

/ *********** /

如果PDF页面仅包含白色背景上的黑色文本,则使用默认设置加载它将在文本边缘周围生成灰色阴影,以便更好地平滑显示,如附图所示。

如果您希望将此黑色文本光栅化为纯黑色而不使用灰色阴影,请在使用LEADTOOLS v18加载之前更改设置,如下所示:

  1. 将加载PDF选项的UsePdfEngine属性设置为true,如下所示:

    RasterCodecs.Options.Pdf.Load.UsePdfEngine = true;

  2. 将加载PDF选项的TextAlpha属性设置为1,如下所示:

    RasterCodecs.Options.Pdf.Load.TextAlpha = 1;

  3. 使用每像素的默认位(24位)加载PDF文件:

    RasterCodecs.Load(&#34; BlackTextWhiteBackground.pdf&#34);

  4. 使用ColorCountCommand Class函数计算文件中的唯一颜色。如果颜色数量大于2,则图像不会是黑白。如果它包含非黑色文本或其他彩色图像或图形对象,则可能发生这种情况:

    ColorCountCommand MyCommand = new ColorCountCommand(); MyCommand.Run(_viewer.Image);

  5. 确保&#34; Leadtools.PdfEngine.dll&#34;放在项目的输出文件夹中(EXE旁边)。

    / ****************************************** / Black text rendered with gray shades

    编辑以回答有关检测灰页的评论:

    可以判断页面是彩色还是纯粹的灰色阴影。 在加载为24位并计算颜色后添加以下代码:

    if (MyCommand.ColorCount > 2 && MyCommand.ColorCount <= 256) //could be gray
    {
       ColorResolutionCommand colorRes = new ColorResolutionCommand(ColorResolutionCommandMode.InPlace, 8, 
          RasterByteOrder.Bgr,RasterDitheringMethod.None, ColorResolutionCommandPaletteFlags.Optimized, null);
       colorRes.Run(_viewer.Image);
       if(_viewer.Image.GrayscaleMode == RasterGrayscaleMode.None)
          MessageBox.Show("image is NOT grayscale");
       else
          MessageBox.Show("image is grayscale, its mode is: " + _viewer.Image.GrayscaleMode);
    }