我想在PDF中标识 ColorSpace 对象,并获取它们在页面中的位置(坐标,颜色空间的宽度和高度)。我尝试遍历BaseDataObject
中的Contents.ContentContext.Resources.ColorSpaces
,可以识别文件中的 Pantone颜色空间(如屏幕截图所示),但是找不到有关位置的信息(x,y,w和h)。
在哪里可以找到ColorSpaces和嵌入式图像等可见对象(在打开文档时可见)的确切位置?
我正在使用“ pdfclown ”库从PDF中提取有关ColorSpaces的信息。任何输入都会有所帮助。预先感谢。
ContentScanner cs = new ContentScanner(page);
System.Collections.Generic.List<org.pdfclown.documents.contents.colorSpaces.ColorSpace> list = cs.Contents.ContentContext.Resources.ColorSpaces.Values.ToList();
for (int i = 0; i < list.Count; i++)
{
org.pdfclown.objects.PdfArray array = (org.pdfclown.objects.PdfArray)list[i].BaseDataObject;
foreach (org.pdfclown.objects.PdfObject s in array)
{
//print colorspace and its x,y,w,h
}
}
PDF Document (具有CMYK和Pantone颜色)
答案 0 :(得分:1)
我想在PDF中标识 ColorSpace 对象,并获取它们在页面中的位置(坐标,颜色空间的宽度和高度)。
我认为您是说这里的正方形:
当心,这些是 不是 PDF ColorSpace 对象,它们是许多简单(矩形)的路径,充满了不同的颜色,并带有一些在他们身上画的文字。
PDF ColorSpace 不是彩色区域的特定渲染,它们是抽象颜色规范:
颜色可以用多种颜色系统或 颜色空间 中的任何一种来描述。一些颜色空间与设备颜色表示(灰度,RGB,CMYK)有关,其他颜色空间与人类的视觉感知(基于CIE)有关。某些特殊功能也被建模为颜色空间:图案,颜色映射,分色以及高保真和多色调颜色。
(ISO 32000-1,第8.6节“颜色空间”)
寻找具有座标,宽度和高度的东西时,因此,您正在寻找使用这些抽象色彩空间的绘图指令,而不是 plain颜色空间。
我尝试遍历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会为您完成此操作)。
代码仅查看分离颜色空间。
如果您也对其他颜色空间感兴趣,请对此进行概括。
该代码仅理解非常具体的琐碎路径:仅由定义矩形的一条指令生成的路径。
对于通用解决方案,您必须支持任意路径。