我试图改变一个pdf文件的图像对象的颜色空间,但是第一个问题是我无法在pdf元数据中找到ICC颜色配置文件。
我在元数据中所拥有的只是一个包含两个组件的数组:
ColorSpace :
Name value: ICCBased
Stream value (null) 当我把“流”解析成字典时:
Color Space Name ICCBased
Filter :
Name value: FlateDecode
Length :
integer value: 389757
N :
integer value: 4
Range :
ARRAY with value:
integer value: 0
integer value: 1
integer value: 0
integer value: 1
integer value: 0
integer value: 1
integer value: 0
integer value: 1 但是,我无法在元数据中找到在图像颜色空间上使用的ICC配置文件数据,您可以通过acrobat看到该数据:

顺便说一句,如果您对如何使用coreGraphics获取元数据表单pdf文件感兴趣,我在这里放了一些代码:
..。 CGPDFDocumentRef pdfDocument = CGPDFDocumentCreateWithURL(pdfURL); CGPDFPageRef page = CGPDFDocumentGetPage(pdfDocument,pageNumber); CGPDFContentStreamRef contentStream = CGPDFContentStreamCreateWithPage(页);CGPDFOperatorTableRef operatorTable = CGPDFOperatorTableCreate(); CGPDFOperatorTableSetCallback(operatorTable,Do,&op_Do); CGPDFScannerRef contentStreamScanner = CGPDFScannerCreate(contentStream,operatorTable,NULL); CGPDFScannerScan(contentStreamScanner);
然后在回调上:
静态void op_Do(CGPDFScannerRef s,void *info) { CGPDFObjectRef imageObject = CGPDFContentStreamGetResource(cs,"XObject",imageLabel); CGPDFStreamRef xObjectStream; if (CGPDFObjectGetValue(imageObject,kCGPDFObjectTypeStream,&xObjectStream)) { CGPDFDictionaryRef xObjectDictionary = CGPDFStreamGetDictionary(xObjectStream);const char *子类型;CGPDFDictionaryGetName(xObjectDictionary,"Subtype",&subtype);if (strcmp(子类型,“图像”) == 0) { NSString *imageID = NSString stringWithCString: imageLabel编码: NSASCIIStringEncoding;CGPDFDictionaryGetName ListDictionaryObjects,NULL); if (CGPDFDictionaryGetName(xObjectDictionary,"ColorSpace",&colorSpaceName)){ fprintf(stdout,“颜色空间名称%s\n",colorSpaceName); }否则{ //获取颜色空间数组CGPDFArrayRef objectArray;CGPDFDictionaryGetArray(xObjectDictionary,"ColorSpace",&objectArray);//获取每个数组位置CGPDFStreamRef colorsSpaceStream;CGPDFArrayGetName(objectArray,0,& Color space );fprintf(stdout,“颜色空间名称%s\n",colorSpaceName);CGPDFArrayGetStream(objectArray,1,&colorsSpaceStream);CGPDFDictionaryRef字典= CGPDFStreamGetDictionary(colorsSpaceStream);CGPDFDictionaryApplyFunction(字典,ListDictionaryObjectsLow,NULL); } ..。
最后,在ListDictionaryObjects函数中,我将遍历字典对象:
void ListDictionaryObjects (const *key,CGPDFObjectRef对象,void *info) { fprintf(stdout,"%s :\n",key); CGPDFDictionaryApplyFunction(objectDictionary,类型=CGPDFObjectGetType(对象);开关(类型){ case kCGPDFObjectTypeDictionary:{ CGPDFDictionaryRef objectDictionary;if (CGPDFObjectGetValue(object,kCGPDFObjectTypeDictionary,&objectDictionary){ fprintf(stdout,“Dictionary with:%zd元素\n”,CGPDFDictionaryGetCount(objectDictionary));if (CGPDFObjectGetValue(object,kCGPDFObjectTypeInteger,&objectInteger)) { fprintf(stdout,“整型值:%ld \n",(long int)objectInteger);} break;} kCGPDFObjectTypeReal:{ CGPDFReal objectReal;if (CGPDFObjectGetValue(object,kCGPDFObjectTypeReal,&objectReal)){ fprintf(stdout,”实值:%5.2f\n",objectReal);}.
发布于 2012-11-30 10:38:01
为特定颜色空间的所有对象分配一个新的颜色配置文件(即在不改变对象中的值的情况下)可以通过创建带有ColorSync实用程序的Quartz过滤器来完成。
2005年Mac库中关于"Mac上的ColorSync“的技术说明指出:
石英过滤器目前只能通过各种Mac系统构建的实用程序和应用程序获得.然而,一套新的API将即将推出。
但在苹果的开发者文档中,我找不到任何其他提到Quartz过滤器的地方。
我知道这不是很有帮助,但也许它给了你一个提示,让你看看。
发布于 2012-11-29 23:13:37
您所看到的在PDF规范中有描述:2008.pdf
查找8.6.5.5节,其中定义了基于ICC的颜色空间,您要查找的数据包含在您粘贴到消息顶部的流中。它不容易识别,因为它已经被Flate编码(ZIP编码)。
问题是你到底想做什么?如果您只想丢弃这个基于ICC的颜色空间并创建一个新的颜色空间,您不需要找到这些数据,只需创建一个新的颜色空间对象并使图像引用到您的新对象。
要更改现有的ICC配置文件(这通常是个坏主意),您必须解压缩流数据,调整要调整的内容并重新压缩它。
发布于 2012-12-03 08:00:22
这些步骤如下:
1-使用ColorSync实用工具创建Quartz过滤器并将其保存为.qfilter文件。
2-使用此代码将此筛选器应用于您的pdf文件:
PDFDocument *pdf = [[PDFDocument alloc]initWithURL:[NSURL fileURLWithPath:@"_pdfURL_"]];
NSDictionary *dict = [[NSDictionary alloc]initWithObjectsAndKeys:[QuartzFilter quartzFilterWithURL:[NSURL fileURLWithPath:@"_myFilter.qfilter_"]], @"QuartzFilter", nil];
[pdf writeToFile:@"_pdfFilePath_" withOptions:dict];https://stackoverflow.com/questions/13628349
复制相似问题