InitSecurityHandler(); echo nl2br("Modifying info dictionary, adding custom properties, embedding a stream...\n"); $trailer = $doc->GetTrailer(); // Get the trailer // Now we will change PDF document information properties using SDF API // Get the Info dictionary. $itr = $trailer->Find("Info"); if ($itr->HasNext()) { $info = $itr->Value(); // Modify 'Producer' entry. $info->PutString("Producer", "PDFTron PDFNet"); // Read title entry (if it is present) $itr = $info->Find("Author"); if ($itr->HasNext()) { // Modify 'Producer' entry $itr->Value()->PutString("Producer", "PDFTron PDFNet"); // Read title entry (if it is present) $itr = $info->Find("Author"); if ($itr->HasNext()) { $oldstr = $itr->Value()->GetAsPDFTest(); $info->PutText("Author",$oldstr."- Modified"); } else { $info->PutString("Author", "Me, myself, and I"); } } else { $info->PutString("Author", "Me, myself, and I"); } } else { // Info dict is missing. $info = $trailer->PutDict("Info"); $info->PutString("Producer", "PDFTron PDFNet"); $info->PutString("Title", "My document"); } // Create a custom inline dictionary within Info dictionary $custom_dict = $info->PutDict("My Direct Dict"); $custom_dict->PutNumber("My Number", 100); // Add some key/value pairs $custom_dict->PutArray("My Array"); // Create a custom indirect array within Info dictionary $custom_array = $doc->CreateIndirectArray(); $info->Put("My Indirect Array", $custom_array); // Add some entries // Create indirect link to root $custom_array->PushBack($trailer->Get("Root")->Value()); // Embed a custom stream (file mystream.txt). $embed_file = new StdFile($input_path."my_stream.txt", StdFile::e_read_mode ); $mystm = new FilterReader($embed_file); $custom_array->PushBack( $doc->CreateIndirectStream($mystm) ); // Save the changes. echo nl2br("Saving modified test file...\n"); $doc->Save($output_path."sdftest_out.pdf", 0, "%PDF-1.4"); $doc->Close(); echo nl2br("Test completed.\n"); ?>