Some test text!

Discord Logo

Chat with us

PDFTron is now Apryse, learn more here.

PDF packages (Portfolios) in Obj-C

More languages

More languages
Java (Android)
C# (.NET Core)
JS (Node.js)
C# (UWP)
C# (Xamarin)

Sample Obj-C code to use PDFTron SDK for creating, extracting, and manipulating PDF packages (also known as PDF portfolios). Learn more about our Obj-C PDF Library and PDF Parsing & Content Extraction Library.

Get Started Samples Download

To run this sample, get started with a free trial of Apryse SDK.

// Copyright (c) 2001-2021 by PDFTron Systems Inc. All Rights Reserved.
// Consult legal.txt regarding legal and license information.

#import <OBJC/PDFNetOBJC.h>
#import <Foundation/Foundation.h>

/// This sample illustrates how to create, extract, and manipulate PDF Portfolios
/// (a.k.a. PDF Packages) using PDFNet SDK.

void AddPackage(PTPDFDoc *doc, NSString *file, NSString* desc) 
    PTNameTree *files = [PTNameTree Create: [doc GetSDFDoc] name: @"EmbeddedFiles"];
    PTFileSpec *fs = [PTFileSpec Create: [doc GetSDFDoc] path: file embed: true];
    [files Put: [file dataUsingEncoding: NSUTF8StringEncoding] key_sz:(int)file.length value: [fs GetSDFObj]];
    [fs SetDesc: desc];

    PTObj * collection = [[doc GetRoot] FindObj: @"Collection"];
    if (!collection) collection = [[doc GetRoot] PutDict: @"Collection"];

    // You could here manipulate any entry in the Collection dictionary. 
    // For example, the following line sets the tile mode for initial view mode
    // Please refer to section '2.3.5 Collections' in PDF Reference for details.
    [collection PutName: @"View" name: @"T"];

void AddCoverPage(PTPDFDoc *doc) 
    // Here we dynamically generate cover page (please see ElementBuilder 
    // sample for more extensive coverage of PDF creation API).
    PTPDFRect * rect = [[PTPDFRect alloc] init];
    [rect Set: 0 y1: 0 x2: 200 y2: 200];
    PTPage *page = [doc PageCreate: rect];

    PTElementBuilder *b = [[PTElementBuilder alloc] init];
    PTElementWriter *w = [[PTElementWriter alloc] init];
    [w WriterBeginWithPage: page placement: e_ptoverlay page_coord_sys: YES compress: YES resources: NULL];
    PTFont *font = [PTFont Create: [doc GetSDFDoc] type: e_pthelvetica embed: NO];
    [w WriteElement: [b CreateTextBeginWithFont: font font_sz: 12]];
    PTElement *e = [b CreateTextRun: @"My PDF Collection"];
    PTMatrix2D *mtx = [[PTMatrix2D alloc] initWithA: 1 b: 0 c: 0 d: 1 h: 50 v: 96];
    [e SetTextMatrixWithMatrix2D: mtx];
    [[e GetGState] SetFillColorSpace: [PTColorSpace CreateDeviceRGB]];
    [[e GetGState] SetFillColorWithColorPt: [[PTColorPt alloc] initWithX: 1 y: 0 z: 0 w: 0]];
    [w WriteElement: e];
    [w WriteElement: [b CreateTextEnd]];
    [w End];
    [doc PagePushBack: page];

    // Alternatively we could import a PDF page from a template PDF document
    // (for an example please see PDFPage sample project).
    // ...

int main(int argc, char *argv[])
    @autoreleasepool {
        int ret = 0;
        [PTPDFNet Initialize: 0];

        // Create a PDF Package.
            PTPDFDoc *doc = [[PTPDFDoc alloc] init];
            AddPackage(doc, @"../../TestFiles/numbered.pdf", @"My File 1");
            AddPackage(doc, @"../../TestFiles/newsletter.pdf", @"My Newsletter...");
            AddPackage(doc, @"../../TestFiles/peppers.jpg", @"An image");
            [doc SaveToFile: @"../../TestFiles/Output/package.pdf" flags: e_ptlinearized];
        @catch(NSException *e)
            NSLog(@"%@", e.reason);
            ret = 1;
    // Extract parts from a PDF Package.
            PTPDFDoc *doc = [[PTPDFDoc alloc] initWithFilepath: @"../../TestFiles/Output/package.pdf"];
            [doc InitSecurityHandler];

            PTNameTree *files = [PTNameTree Find: [doc GetSDFDoc] name: @"EmbeddedFiles"];
            if([files IsValid]) 
                // Traverse the list of embedded files.
                PTDictIterator *i = [files GetIterator];
                int counter = 0;
                for (; [i HasNext]; [i Next], ++counter) 
                    NSString *entry_name = [[i Key] GetAsPDFText];
                    NSLog(@"Part: %@", entry_name);
                    PTFileSpec *file_spec = [[PTFileSpec alloc] initWithF: [i Value]];
                    PTFilter *stm = [file_spec GetFileData];
                    if (stm) 
                        NSString *str = [NSString stringWithFormat: @"../../TestFiles/Output/extract_%d.%@", counter, [entry_name pathExtension]];
                        [stm WriteToFile: str append: NO];

        @catch(NSException *e)
            NSLog(@"%@", e.reason);
            ret = 1;
        [PTPDFNet Terminate: 0];        
        return ret;