我正在尝试更改 pdf 文件的图像对象的颜色空间,但第一个问题是我无法在 pdf 元数据中找到 ICC 颜色配置文件。
我在元数据中拥有的只是一个包含 2 个组件的数组:
ColorSpace :
Name value: ICCBased
Stream value (null)
当我将 Stream 解析为字典时:
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(page); CGPDFOperatorTableRef
operatorTable = CGPDFOperatorTableCreate();
CGPDFOperatorTableSetCallback(operatorTable, "Do", &op_Do);
CGPDFScannerRef contentStreamScanner =
CGPDFScannerCreate(contentStream, operatorTable, NULL);
CGPDFScannerScan(contentStreamScanner);
……
然后在回调上:
静态无效op_Do(CGPDFScannerRef s,无效*信息){
CGPDFObjectRef imageObject = CGPDFContentStreamGetResource(cs, "XObject", imageLabel);
CGPDFStreamRef xObjectStream;
if (CGPDFObjectGetValue(imageObject, kCGPDFObjectTypeStream, &xObjectStream)) { CGPDFDictionaryRef xObjectDictionary = CGPDFStreamGetDictionary(xObjectStream); const char *subtype; CGPDFDictionaryGetName(xObjectDictionary, "Subtype", &subtype); if (strcmp(subtype, "Image") == 0) { NSString *imageID = [NSString stringWithCString: imageLabel encoding: NSASCIIStringEncoding]; CGPDFDictionaryApplyFunction(xObjectDictionary, ListDictionaryObjects, NULL);
if (CGPDFDictionaryGetName(xObjectDictionary, "ColorSpace", &colorSpaceName)){
fprintf(stdout,"Color Space Name %s\n", colorSpaceName);
}别的{
//Getting Color space array CGPDFArrayRef objectArray; CGPDFDictionaryGetArray(xObjectDictionary, "ColorSpace", &objectArray); //getting each array position CGPDFStreamRef colorsSpaceStream; CGPDFArrayGetName(objectArray, 0, &colorSpaceName); fprintf(stdout,"Color Space Name %s\n", colorSpaceName); CGPDFArrayGetStream(objectArray, 1, &colorsSpaceStream); CGPDFDictionaryRef dictionary = CGPDFStreamGetDictionary(colorsSpaceStream); CGPDFDictionaryApplyFunction(dictionary, ListDictionaryObjectsLow, NULL);
}
...
最后在 ListDictionaryObjects 函数中,我遍历字典对象:
void ListDictionaryObjects (const char *key, CGPDFObjectRef object, void *info) { fprintf(stdout, "%s :\n", key);
CGPDFObjectType type = CGPDFObjectGetType(object); switch (type) { case kCGPDFObjectTypeDictionary: { CGPDFDictionaryRef objectDictionary; if (CGPDFObjectGetValue(object, kCGPDFObjectTypeDictionary, &objectDictionary)) { fprintf(stdout," Dictionary value with: %zd elements\n", CGPDFDictionaryGetCount(objectDictionary)); CGPDFDictionaryApplyFunction(objectDictionary, ListDictionaryObjectsLow, NULL); } } break; case kCGPDFObjectTypeInteger: { CGPDFInteger objectInteger; if (CGPDFObjectGetValue(object, kCGPDFObjectTypeInteger, &objectInteger)) { fprintf(stdout," integer value: %ld \n", (long int)objectInteger); } } break; case kCGPDFObjectTypeReal:{ CGPDFReal objectReal; if (CGPDFObjectGetValue(object, kCGPDFObjectTypeReal, &objectReal)){ fprintf(stdout," real value: %5.2f\n", objectReal); } } ...