簡體   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