iosxcodepdfmetadata

iOS: Sample Code or Examples for CGPDFContextAddDocumentMetadata


I need to embed some custom meta data to a PDF file using the Apple's Objective C SDK. Is there any working sample code available that does that?

What I need is very basic. Open an existing pdf and add some meta data and then save it.

Example of information stored will be like.... a customer's name, contact number, items ordered.

I saw that this "CGPDFContextAddDocumentMetadata" supports metadata but I don't know how the meta data look like and how is it used passed to this function.

Any help will be greatly appreciated...:)


Solution

  • Metadata is metadata (of course, it is recommended by Adobe that you use XMP XML). So long as you create a valid CFDataRef and pass it into arg two, you're pretty much good to go with anything. For example, here's how to pass the string "Hello World" into a PDF's metadata:

    void MakeAPDF()
    {
    
        CGRect mediaRect = CGRectMake(0, 0, 400, 600);
        // use your own rect instead
    
        CFMutableDataRef result = CFDataCreateMutable(kCFAllocatorDefault, 0);
        CGDataConsumerRef PDFDataConsumer = CGDataConsumerCreateWithCFData(result);
    
        // mark the PDF as coming from your program
        CFMutableDictionaryRef auxInfo = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, NULL, NULL);
        CFDictionaryAddValue(auxInfo, kCGPDFContextCreator, CFSTR("Your Programs Name"));
        CFDictionaryRef auxillaryInformation = CFDictionaryCreateCopy(kCFAllocatorDefault, auxInfo);
        CFRelease(auxInfo);
    
        // create a context to draw into
        CGContextRef graphicContext = CGPDFContextCreate(PDFDataConsumer, &mediaRect, auxillaryInformation);
        CFRelease(auxillaryInformation);
        CGDataConsumerRelease(PDFDataConsumer);
    
        // actually make the call to embed your String
        NSString* str= @"Hello World";
        NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
        CFDataRef cfdata = CFDataCreate(NULL, [data bytes], [data length]);
    
        CGPDFContextAddDocumentMetadata(graphicContext, cfdata);
    
        CGContextBeginPage(graphicContext, &mediaRect);
        // do your drawing, like this grey rectangle
        CGContextSetGrayFillColor(graphicContext, 0.5, 0.5);
        CGContextAddRect(graphicContext, mediaRect);
        CGContextFillPath(graphicContext);
        // end your drawing
    
        CGContextEndPage(graphicContext);
        CGContextFlush(graphicContext);
        CGPDFContextClose(graphicContext);    
    }
    

    An XMP file might look like this:

    <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
    <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.1-c041">
    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
    <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
      <dc:format>application/pdf</dc:format>
      <dc:title>
        <rdf:Alt>
          <rdf:li />
        </rdf:Alt>
      </dc:title>
      <dc:description>
        <rdf:Alt>
          <rdf:li />
        </rdf:Alt>
      </dc:description>
      <dc:creator>
        <rdf:Seq>
          <rdf:li />
        </rdf:Seq>
      </dc:creator>
    </rdf:Description>
    <rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
      <pdf:Keywords />
      <pdf:Producer />
    </rdf:Description>
    <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/">
      <xmp:CreatorTool />
      <xmp:CreateDate>2011-02-10T11:41:05+02:00</xmp:CreateDate>
      <xmp:ModifyDate>2011-02-10T11:41:06+02:00</xmp:ModifyDate>
    </rdf:Description></rdf:RDF>
    </x:xmpmeta>
    <?xpacket end="w"?>