首页 > 解决方案 > 在 PDF 文档中找不到 ColorSpace 对象的位置

问题描述

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

我在哪里可以找到诸如 ColorSpaces 和嵌入图像之类的可见对象(打开文档时可见)的确切位置?

我正在使用 ' pdfclow ' 库从 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 颜色)

截屏

截屏

标签: c#pdfboxpdfclownlab-color-space

解决方案


我想识别 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.StatePDF Clown 为您执行此操作的颜色和转换的数据)。

  • 该代码仅查看分离颜色空间。

    如果您也对其他色彩空间感兴趣,那么您已经概括了这一点。

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

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


推荐阅读