我想识别 PDF 中的ColorSpace对象并在页面中获取它们的位置(颜色空间的坐标、宽度和高度)。
我假设您的意思是这里的正方形:

请注意,这些不是PDF ColorSpace对象,它们是许多简单的(矩形)路径,其中填充了不同的颜色并在其上绘制了一些文本。
PDF ColorSpace不是彩色区域的特定渲染,它们是抽象的颜色规范:
颜色可以用多种颜色系统或颜色空间中的任何一种来描述。一些颜色空间与设备颜色表示(灰度、RGB、CMYK)有关,另一些与人类视觉感知有关(基于 CIE)。某些特殊功能也被建模为色彩空间:图案、色彩映射、分色以及高保真和多色调色彩。
(ISO 32000-1,第 8.6 节“色彩空间”)
因此,当您寻找具有坐标、宽度和高度的东西时,您正在寻找使用这些抽象色彩空间的绘图指令,而不是普通色彩空间。
我尝试遍历 Contents.ContentContext.Resources.ColorSpaces 中的 BaseDataObject,我可以识别文件中的Pantone 颜色空间(如屏幕截图所示),但无法找到有关对象位置(x、y、w 和 h)的信息.
通过查看,您将获得所有可用于当前上下文但不是实际用途cs.Contents.ContentContext.Resources.ColorSpaces
的特殊色彩空间的枚举。要获得实际用法,您必须遍历,即您必须检查当前上下文中的指令,例如:ContentScanner cs
SeparationColorSpace space = null;
double X = 0, Y = 0, Width = 0, Height = 0;
void ScanForSpecialColorspaceUsage(ContentScanner cs)
{
cs.MoveFirst();
while (cs.MoveNext())
{
ContentObject content = cs.Current;
if (content is CompositeObject)
{
ScanForSpecialColorspaceUsage(cs.ChildLevel);
}
else if (content is SetFillColorSpace _cs)
{
ColorSpace _space = cs.Contents.ContentContext.Resources.ColorSpaces[_cs.Name];
space = _space as SeparationColorSpace;
}
else if (content is SetDeviceCMYKFillColor || content is SetDeviceGrayFillColor || content is SetDeviceRGBFillColor)
{
space = null;
}
else if (content is DrawRectangle _dr)
{
if (space != null)
{
X = _dr.X;
Y = _dr.Y;
Width = _dr.Width;
Height = _dr.Height;
}
}
else if (content is PaintPath _pp)
{
if (space != null && _pp.Filled && (X != 0 || Y != 0 || Width != 0 || Height != 0))
{
String name = ((PdfName)((PdfArray)space.BaseDataObject)[1]).ToString();
Console.WriteLine("Filling rectangle at {0}, {1} with size {2}x{3} using {4}", X, Y, Width, Height, name);
}
X = 0;
Y = 0;
Width = 0;
Height = 0;
}
}
}
注意:这只是一个概念验证,尽可能简化,以便在您的 PDF 中仍然可以为上面屏幕截图中的正方形工作。
对于一般解决方案,您将不得不大大扩展它:
该代码仅检查给定的内容扫描器,即仅检查已为其初始化的内容流,在您的情况下为页面内容流。
从这样的上下文流可以引用其他内容流,例如表单XObject。为了在一个通用文档中捕捉所有有趣的色彩空间的使用,你也必须递归地检查这些依赖的内容流。
该代码忽略了当前的转换矩阵。
可以通过指令改变当前的变换矩阵,使按照指令完成的所有绘图都根据仿射变换改变它们的坐标。要在通用文档中正确获取所有坐标和尺寸,您必须将当前变换矩阵应用于它们。
该代码忽略了保存图形状态/恢复图形状态指令。
当前图形状态(包括填充颜色和当前变换矩阵)可以存储在堆栈中并从中恢复。要在通用文档中正确获取颜色、坐标和尺寸,您必须跟踪保存和恢复的图形状态(或使用来自cs.State
PDF Clown 为您执行此操作的颜色和转换的数据)。
该代码仅查看分离颜色空间。
如果您也对其他色彩空间感兴趣,那么您已经概括了这一点。
该代码只理解非常具体的、琐碎的路径:仅由定义矩形的单个指令生成的路径。
对于通用解决方案,您必须支持任意路径。