Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在PDF文档中找不到ColorSpace对象的位置_C#_Pdfbox_Pdfclown_Lab Color Space - Fatal编程技术网

C# 在PDF文档中找不到ColorSpace对象的位置

C# 在PDF文档中找不到ColorSpace对象的位置,c#,pdfbox,pdfclown,lab-color-space,C#,Pdfbox,Pdfclown,Lab Color Space,我想识别PDF中的颜色空间对象,并获取它们在页面中的位置(颜色空间的坐标、宽度和高度)。我尝试在Contents.ContentContext.Resources.colorspace中遍历BaseDataObject,我可以识别文件中的Pantone colorspace(如屏幕截图所示),但无法找到有关对象的位置(x、y、w和h)的信息 在哪里可以找到可见对象(打开文档时可见)的确切位置,如颜色空间和嵌入图像 我正在使用“pdfclown”库从PDF中提取有关颜色空间的信息。任何输入都会有帮

我想识别PDF中的颜色空间对象,并获取它们在页面中的位置(颜色空间的坐标、宽度和高度)。我尝试在
Contents.ContentContext.Resources.colorspace
中遍历
BaseDataObject
,我可以识别文件中的Pantone colorspace(如屏幕截图所示),但无法找到有关对象的位置(x、y、w和h)的信息

在哪里可以找到可见对象(打开文档时可见)的确切位置,如颜色空间和嵌入图像

我正在使用“pdfclown”库从PDF中提取有关颜色空间的信息。任何输入都会有帮助。提前谢谢

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
            }
    }
ContentScanner cs=新的ContentScanner(第页);
System.Collections.Generic.List List=cs.Contents.ContentContext.Resources.colorspace.Values.ToList();
for(int i=0;i
(有CMYK和Pantone颜色)

我想识别PDF中的颜色空间对象,并获取它们在页面中的位置(颜色空间的坐标、宽度和高度)

我想你指的是这里的正方形:

注意,这些是而不是PDFColorSpace对象,它们是一些简单的(矩形)路径,填充了不同的颜色,并绘制了一些文本

PDF颜色空间不是彩色区域的特定渲染,它们是抽象的颜色规范:

颜色可以在各种颜色系统或颜色空间中描述。一些颜色空间与设备颜色表示(灰度、RGB、CMYK)相关,另一些与人类视觉感知(基于CIE)相关。某些特殊功能也被建模为颜色空间:图案、颜色映射、分隔、高保真度和多色调

(ISO 32000-1,第8.6节“颜色空间”)

因此,当您查找具有坐标、宽度和高度的对象时,您正在查找使用这些抽象颜色空间的绘图说明,而不是普通颜色空间

我尝试遍历Contents.ContentContext.Resources.colorspace中的BaseDataObject,我可以识别文件中的Pantone colorspace(如屏幕截图所示),但无法找到有关对象的位置(x、y、w和h)的信息

通过查看
cs.Contents.ContentContext.Resources.colorspace
,您可以获得当前上下文中可用的所有特殊颜色空间的枚举,但不包括实际使用情况。要获得实际用法,您必须遍历
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小丑为您完成此操作)

  • 代码只查看分隔颜色空间

    如果你对其他颜色空间也感兴趣,你可以对其进行推广

  • 代码只理解非常具体的、琐碎的路径:仅由定义矩形的单个指令生成的路径

    对于通用解决方案,您必须支持任意路径


A从中检索
ColorSpace
列表的
cs
是什么?B你说“像颜色空间这样的可见对象”,但PDF中定义的颜色空间本身不是可见对象。因此,请解释你的确切意思。你问“色彩空间、嵌入图像和附件e.t.C”的位置,但附件与前两个完全不同,所以你的“e.t.C”可能意味着任何东西。因此,请解释你的确切意思。你的PDF文档链接已经失效。好的,链接现在可以工作了。现在请按上述要求澄清。此外,你说你想“识别PDF中的颜色空间对象并突出显示它们”;识别颜色空间没有问题,但是突出显示它们是什么意思?嗨@mkl,
cs
ContentScanner
对象(
ContentScanner cs=new ContentScanner(page);
)。B我指的是色彩空间,