[英]Unable find location of ColorSpace objects in PDF document
我想在PDF中標識ColorSpace對象,並獲取它們在頁面中的位置(坐標,顏色空間的寬度和高度)。 我嘗試遍歷Contents.ContentContext.Resources.ColorSpaces
的BaseDataObject
,我可以在文件中標識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.