0

我正在尝试更改 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);
        }
    } ...
4

3 回答 3

1

PDF 规范中描述了您所看到的内容:http: //www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf

查找定义基于 ICC 的颜色空间的第 8.6.5.5 节 - 您正在查找的数据包含在您粘贴在消息顶部的流中。它不容易辨认,因为它已经过 Flate 编码(ZIP 编码)。

问题是你到底想完成什么?如果你只是想丢弃这个基于ICC的色彩空间并创建一个新的,你不需要找到这个数据,只需创建一个新的色彩空间对象并让图像引用你的新对象。

要更改现有的 ICC 配置文件(这通常是个坏主意),您必须解压缩流数据,调整要调整的内容并再次重新压缩。

于 2012-11-29T23:13:37.130 回答
1

可以通过使用 ColorSync Utility 创建 Quartz Filter 来为特定颜色空间的所有对象分配新的颜色配置文件(即不改变对象中的值)。

2005 年 Mac 开发人员库中关于“ Mac OS X 上的 ColorSync ”的技术说明指出:

Quartz 过滤器目前只能通过各种 Mac OS X 系统构建的实用程序和应用程序使用。然而,一组新的 API 即将推出。

但我在 Apple 的开发人员文档中找不到任何其他提及 Quartz Filters 的内容。

我知道这不是很有帮助,但也许它会给你一个提示。

编辑:请参阅“在 Mac OS X 10.6.3 下保存 PDF 时应用 Quartz 过滤器”的答案

于 2012-11-30T10:38:01.727 回答
0

这些是遵循的步骤:

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];
于 2012-12-03T08:00:22.297 回答