0

PDF ファイルの画像オブジェクトの色空間を変更しようとしていますが、最初の問題は、PDF メタデータ内に ICC カラー プロファイルが見つからないことです。

メタデータにあるのは、2 つのコンポーネントを持つ 1 つの配列だけです。

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);

....

そして、コールバックで:

static 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 *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

特定の色空間のすべてのオブジェクトに新しいカラープロファイルを(つまり、オブジェクトの値を変更せずに)割り当てるには、ColorSyncユーティリティを使用してクォーツフィルターを作成します。

「 MacOSX上のColorSync」に関する2005年のMacDeveloperLibraryのテクニカルノートには次のように記載されています。

クォーツフィルターは現在、さまざまなMacOSXシステムで構築されたユーティリティおよびアプリケーションを介してのみ使用できます。ただし、新しいAPIセットが間もなく登場します。

しかし、Appleの開発者向けドキュメントには、QuartzFiltersに関する他の言及は見つかりませんでした。

私はこれがひどく役に立たないことを知っています、しかし多分それはあなたに見るべきであったというヒントを与えるでしょう。

編集:「MacOS X 10.6.3でPDFを保存するときにQuartzフィルターを適用する」については、この回答を参照してください。

于 2012-11-30T10:38:01.727 に答える
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 に答える
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 に答える