首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在PDF文档中找到ColorSpace对象的位置

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

Stack Overflow用户
提问于 2019-05-09 13:57:25
回答 1查看 324关注 0票数 0

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

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

我正在使用‘ PDF ’库从PDF中提取关于ColorSpaces的信息。任何投入都是有帮助的。提前谢谢。

代码语言:javascript
复制
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颜色)

屏幕截图

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,即必须检查当前上下文中的指令,例如:

代码语言:javascript
复制
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__,这仅仅是一个尽可能简化的,仍然可以在上面屏幕截图中的中工作。

对于一般的解决方案,您必须对此进行相当大的扩展:

  • 代码只检查给定的内容扫描器,即只检查已初始化的内容流,在您的示例中,只检查页面内容流。 可以从这样的上下文流引用其他内容流,例如表单XObject。要捕获通用文档中感兴趣的颜色空间的所有用法,您还必须递归地检查这些依赖的内容流。
  • 代码忽略当前转换矩阵。 通过指令可以改变当前的变换矩阵,使所有的图纸都按照仿射变换来改变它们的坐标。要使通用文档中的所有坐标和维度都正确,您必须将当前的转换矩阵应用于它们。
  • 代码忽略了保存-图形-状态/恢复-图形-状态指令。 当前图形状态(包括填充颜色和当前转换矩阵)可以存储在堆栈上并从堆栈中恢复。要在通用文档中获取颜色、坐标和尺寸,您必须跟踪保存和还原的图形状态(或者使用cs.State中的数据进行颜色和转换,而PDF则是这样做的)。
  • 代码只查看分离颜色空间。 如果您对其他颜色空间也感兴趣,则可以概括这一点。
  • 代码只理解非常具体的、琐碎的路径:只有由一条定义矩形的指令生成的路径。 对于一般的解决方案,您必须支持任意路径。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56061097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档