原始答案
不幸的是,您没有显示您的代码。但是您的屏幕截图看起来就像您只查看了Resources页面的ColorSpace部分。这在很多方面是不够的:
首先,色彩空间资源通过名称从内容流中引用(参见屏幕截图上的内容条目),以选择用于描边或填充的色彩空间。但是有一些预定义的名称不需要在资源中描述,参见。CS运营商的文档:
设置用于描边操作的当前颜色空间。操作数名称应为名称对象。如果颜色空间是可以通过名称指定且没有附加参数(DeviceGray、DeviceRGB、DeviceCMYK和Pattern的某些情况),则可以直接指定名称。否则,它应该是在当前资源字典的ColorSpace子字典中定义的名称。
(ISO 32000-1,表 74 – 颜色操作符)
因此,要检查是否使用了DeviceGray、DeviceRGB或DeviceCMYK,您必须使用这些名称扫描内容流以进行颜色空间选择操作( CS或cs )。
此外,甚至还有快捷的颜色选择操作,可以设置这些颜色空间中的任何一个并立即在其中选择一种颜色(g、G、rg、RG、k、K),您还必须为其扫描内容流。
例如,在您的页面内容流中,您可以找到:
0.3 0 1 0 k
和
0.9 g
以及这些运算符的其他多次出现。因此,至少DeviceGray和DeviceCMYK正在使用中(除了您找到的资源)。
此外,并非您在色彩空间资源字典中找到的所有色彩空间都必须在内容中实际使用。因此,在扫描上述内容以使用未声明的命名空间时,您还必须扫描已声明的命名空间以确保它们实际被使用。
您还必须查看内容流中使用的其他资源:
位图图像(具有子类型值为 Image 的 XObjects ),例如Im1具有ColorSpace DeviceCMYK和Im5具有ColorSpace DeviceRGB。
同样,您必须确保位图实际用于您的内容流中。
请注意,JPEG2000 位图可能会以自己的格式带来自己的色彩空间定义!
阴影,PDF 中的所有阴影都有ColorSpace DeviceCMYK。再次确保它们被实际使用。
表单 XObjects 和 Patterns 有自己的内容流和资源。不要忘记深入研究它们的结构。但是,在您的情况下,没有。
Type 3 Fonts 字形是通过内容流和资源定义的,它们也可能有自己的色彩空间。您的文件中没有使用任何内容。
透明组也可能有一个颜色空间设置,其中指定了组作为一个整体的颜色空间,当它作为一个对象被绘制到其背景上时。
...
也许我忘记了 1 或 20 个其他地方来寻找相关的色彩空间设置......
但是,对于您的文件,上面提到的位置已经表明,除了您的ColorSpace资源之外,您的 PDF 中还使用了DeviceGray、DeviceRGB和DeviceCMYK 。
关于评论
由于您同时提供了代码并且此代码使用 PDF Clown,所以我也会在这里使用它。你可以用 PDF Box 做同样的事情。
扫描内容流
A如何通过 ContentStream 扫描(检查 'Contents' 的BaseDataObject,它是这样的 ' [0] {cm [1, 0, 0, 1, 0, 0]}, 1 {gs [GS11]}'
使用 PDF Clown,您通常使用ContentScanner
. 在您的代码中,您已经有一个ContentScanner cs
. 因此,只需ScanForColorspaceUsage(cs)
在您的循环中调用,ScanForColorspaceUsage
定义如下:
void ScanForColorspaceUsage(ContentScanner cs)
{
while (cs.MoveNext())
{
ContentObject content = cs.Current;
if (content is CompositeObject)
{
ScanForColorspaceUsage(cs.ChildLevel);
}
else if (content is SetFillColorSpace _cs)
{
Console.WriteLine("Used as fill color space: {0}", _cs.Name);
}
else if (content is SetDeviceCMYKFillColor _k)
{
Console.WriteLine("Used as fill color space: DeviceCMYK");
}
else if (content is SetDeviceGrayFillColor _g)
{
Console.WriteLine("Used as fill color space: DeviceGray");
}
else if (content is SetDeviceRGBFillColor _rg)
{
Console.WriteLine("Used as fill color space: DeviceRGB");
}
else if (content is SetStrokeColorSpace _CS)
{
Console.WriteLine("Used as stroke color space: {0}", _CS.Name);
}
else if (content is SetDeviceCMYKStrokeColor _K)
{
Console.WriteLine("Used as stroke color space: DeviceCMYK");
}
else if (content is SetDeviceGrayStrokeColor _G)
{
Console.WriteLine("Used as stroke color space: DeviceGray");
}
else if (content is SetDeviceRGBStrokeColor _RG)
{
Console.WriteLine("Used as stroke color space: DeviceRGB");
}
}
}
所有色彩空间
B无论是否使用色彩空间,当我在 CorelDraw 中检查时,我想显示 pdf 和上述文档中可用的所有色彩空间,它显示为 cmyk 大约 30-35 个色彩空间(在色彩空间水平数组的第二行)
浏览您的文档,无论何时使用 CMYK 颜色,它都是通过DeviceCMYK颜色空间使用的,没有特殊的ICCBased空间。因此,您的 PDF 中只使用了一个 CMYK 颜色空间。
我没有 CorelDraw,所以我不知道它到底向您展示了什么。还是您的意思是单个 CMYK 颜色?
深入了解
C我在哪里可以更深入地了解这些事情以便更好地理解?
如果这些东西是指这一切在 PDF 中是如何表示的,那么 PDF 规范可能是一个很好的参考。最新的 ISO 32000-2 只能通过金钱获得,例如从 ISO 商店购买,但较旧的 ISO 32000-1 也由 Adobe 共享,以PDF32000_2008.pdf的形式下载。