我希望在PDF中标识ColorSpace对象,并在页面中获取它们的位置(坐标、宽度和颜色空间的高度)。我尝试遍历BaseDataObject in Contents.ContentContext.Resources.ColorSpaces,我可以在文件中识别Pantone颜色空间(如屏幕快照所示),但无法找到关于对象的位置(x、y、w和h)的信息。
在哪里可以找到可见对象的确切位置(打开文档时可见),如ColorSpaces和嵌入式图像?
我正在使用‘ PDF ’库从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文件 (有CMYK和Pantone颜色)

发布于 2019-05-23 15:55:16
我希望在PDF中标识ColorSpace对象,并在页面中获取它们的位置(坐标、宽度和颜色空间的高度)。
我猜你是说这里的广场:

请注意,这些不是 PDF ColorSpace对象,它们是一些简单的(矩形)路径,其中填充了不同的颜色,并在其上绘制了一些文本。
ColorSpaces不是彩色区域的特定渲染,它们是抽象的颜色规范。
颜色可以描述在任何一个不同的颜色系统,或颜色空间。一些颜色空间与设备颜色表示(灰度、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;
}
}
}注意:proof-of-concept__,这仅仅是一个尽可能简化的,仍然可以在上面屏幕截图中的中工作。
对于一般的解决方案,您必须对此进行相当大的扩展:
cs.State中的数据进行颜色和转换,而PDF则是这样做的)。https://stackoverflow.com/questions/56061097
复制相似问题