//--------------------------------------------------------------------------------------- // Copyright (c) 2001-2012 by PDFTron Systems Inc. All Rights Reserved. // Consult legal.txt regarding legal and license information. //--------------------------------------------------------------------------------------- #import #import // This sample illustrates how to use basic SDF API (also known as Cos) to edit an // existing document. int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int ret = 0; [PDFNet Initialize: 0]; @try { NSLog(@"Opening the test file..."); // Here we create a SDF/Cos document directly from PDF file. In case you have // PDFDoc you can always access SDF/Cos document using PDFDoc.GetSDFDoc() method. SDFDoc *doc = [[SDFDoc alloc] initWithFilepath: @"../../TestFiles/fish.pdf"]; [doc InitSecurityHandler]; NSLog(@"Modifying info dictionary, adding custom properties, embedding a stream..."); Obj *trailer = [doc GetTrailer]; // Get the trailer // Now we will change PDF document information properties using SDF API // Get the Info dictionary. DictIterator *itr = [trailer Find: @"Info"]; Obj *info = [[[Obj alloc] init] autorelease]; if ([itr HasNext]) { info = [itr Value]; // Modify 'Producer' entry. [info PutString: @"Producer" value: @"PDFTron PDFNet"]; // Read title entry (if it is present) itr = [info Find: @"Author"]; if ([itr HasNext]) { NSString *oldstr = [[itr Value] GetAsPDFText]; [info PutText: @"Author" value: [oldstr stringByAppendingString: @"- Modified"]]; } else { [info PutString: @"Author" value: @"Me, myself, and I"]; } } else { // Info dict is missing. info = [trailer PutDict: @"Info"]; [info PutString: @"Producer" value: @"PDFTron PDFNet"]; [info PutString: @"Title" value: @"My document"]; } // Create a custom inline dictionary within Info dictionary Obj *custom_dict = [info PutDict: @"My Direct Dict"]; [custom_dict PutNumber: @"My Number" value: 100]; // Add some key/value pairs [custom_dict PutArray: @"My Array"]; // Create a custom indirect array within Info dictionary Obj *custom_array = [doc CreateIndirectArray]; [info Put: @"My Indirect Array" obj: custom_array]; // Add some entries // Create indirect link to root [custom_array PushBack: [[trailer Get: @"Root"] Value]]; // Embed a custom stream (file mystream.txt). StdFile *embed_file = [[[StdFile alloc] initWithFilename: @"../../TestFiles/my_stream.txt" open_mode: e_read_mode buf_sz: 1024] autorelease]; FilterReader *mystm = [[[FilterReader alloc] initWithFilter: embed_file] autorelease]; [custom_array PushBack: [doc CreateIndirectStream: mystm]]; // Save the changes. NSLog(@"Saving modified test file..."); [doc SaveSDFDocToFile: @"../../TestFiles/Output/sdftest_out.pdf" flags:0 header: @"%PDF-1.4"]; NSLog(@"Test completed."); } @catch (NSException *e) { NSLog(@"%@", [e reason]); ret = 1; } [pool release]; return ret; }