繁体   English   中英

无法在PDF文档中找到ColorSpace对象的位置

[英]Unable find location of ColorSpace objects in PDF document

我想在PDF中标识ColorSpace对象,并获取它们在页面中的位置(坐标,颜色空间的宽度和高度)。 我尝试遍历Contents.ContentContext.Resources.ColorSpacesBaseDataObject ,我可以在文件中标识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文档 (具有CMYK和Pantone颜色)

截图

截图

我想在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。 为了捕获通用文档中有趣的色彩空间的所有用法,您还必须递归检查此类相关的内容流。

  • 该代码将忽略当前的转换矩阵。

    可以通过一条指令更改当前变换矩阵,以使所有按照以下指令绘制的图形的坐标都根据仿射变换而变化。 为了正确获取通用文档中的所有坐标和尺寸,必须将当前的变换矩阵应用于它们。

  • 该代码将忽略save-graphics-state / restore-graphics-state指令。

    当前图形状态(包括填充颜色和当前变换矩阵)可以存储在堆栈中并从堆栈中恢复。 要在常规文档中正确获取颜色,坐标和尺寸,您必须跟踪保存和恢复的图形状态(或使用cs.State数据进行颜色和转换,而PDF Clown会为您完成此操作)。

  • 该代码仅查看“ 分离”色彩空间。

    如果您也对其他颜色空间感兴趣,则可以将其概括化。

  • 该代码仅了解非常具体的琐碎路径:仅由定义矩形的一条指令生成的路径。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM