SlideShare ist ein Scribd-Unternehmen logo
1 von 43
Downloaden Sie, um offline zu lesen
Gestire i PDF con iOS



 Maurizio Moriconi - @bugman79
 Mobilesoft


giovedì 24 maggio 12
Chi sono: Maurizio Moriconi


           • CTO presso Mobilesoft                       • Co-founder
           • Mobile Developer                            • Main Developer


                         http://www.linkedin.com/in/bugman


                        @bugman79


                         http://www.facebook.com/maurizio.moriconi

    2
giovedì 24 maggio 12
Editoria digitale




    3
giovedì 24 maggio 12
4
giovedì 24 maggio 12
Funzionalità MobilePaper
        • Visualizzazione in portrait e landscape (2 pagine affiancate)
        • Zoom della pagina tramite pinch o con doppio tap
        • Possibilità di passare alle pagine successive o precedenti
        • Visualizzazione delle pagine tramite elenco e/o miniature
        • Visualizzazione dell'indice (capitoli e paragrafi del pdf)
        • Memorizzazione dei segnalibri (preferiti)
        • Scelta della musica di sottofondo
        • Inserimento di note
        • Ricerca di testo all'interno della rivista



        • Disponibile su iOS ed Android

    5
giovedì 24 maggio 12
Editoria su iOS
        • Varie possibilità:

              – App Native
              – Uso di PDF con eventuale aggiunta di
               elementi nativi (multimedia ed interazione)
              – HTML 5




    6
giovedì 24 maggio 12
Il formato Pdf
        • Portable Document Format

        • File basato su un linguaggio di descrizione pagina
        • Sviluppato da Adobe System nel 1993


        • Nel 2007 è diventato standard ISO 32000


        • Ci sono vari sottoformati (PDF/A, PDF/X, PDF/E...)




    7
giovedì 24 maggio 12
PDF/A
        • PDF/A (PDF/Archiving) per l’archiviazione a lungo
          termine (ha 2 sottoformati /A-1a /A-1b)
        • Standard ISO 19005-1:2005 dal 2005
        • Basato sulla vesione 1.4 del formato PDF di Adobe
        • Documenti “auto contenuti”
          – Include i font che utilizza!!
          – Include immagini, colori, altri dati
          – Non ci sono fonti esterne
        • Nel sottoformato PDF/A-2 si basa PDF v. 1.7



    8
giovedì 24 maggio 12
PDF: specifiche
                       http://www.adobe.com/devnet/pdf/
                               pdf_reference.html


          Ultima versione:

          PDF Reference, sixth edition APDF version 1.7

          1310 pagine!!!




    9
giovedì 24 maggio 12
Uso della webview
        • Vantaggi
              – Facile da realizzare
              – Possibilità di usare pdf “online”
              – Funzionamento dei link interni


        • Svantaggi
              – Poca interazione lato utente
              – Scrollview verticale
              – Nessuna paginazione




   10
giovedì 24 maggio 12
Caricare Pdf in una webview


        NSString *pdfPath = [[NSBundle mainBundle] pathForResource:@"file"
                                                            ofType:@"pdf"];

        NSURL *url = [NSURL fileURLWithPath:pdfPath];

        NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];

        [webView loadRequest:urlRequest];




   11
giovedì 24 maggio 12
Show me the code...

   12
giovedì 24 maggio 12
Uso di Quartz
        • Motore di rendering di Darwin
          chiamato “per gli amici” con il
          nome di Core Graphics

        • Quartz 2D:
              – libreria grafica ereditata da QuickDraw
              – usa il formato PDF per il disegno!!!
              – si basa sulla versione 1.4 Adobe PDF


   13
giovedì 24 maggio 12
Classi che ci interessano

        • CGPDFDocument
        • CGPDFPage
        • CGPDFObject

        • CGContext




   14
giovedì 24 maggio 12
Caricamento del Pdf
           #import <QuartzCore/QuartzCore.h>

           NSURL *pdfURL = [[NSBundle mainBundle] URLForResource:@"TestPage.pdf"
           withExtension:nil];

           CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);

           // Prendo la prima pagina
           CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 1);
           CGPDFPageRetain(page);

           // Determino la grandezza del PDF
           CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
           pdfScale = self.imageView.frame.size.width/pageRect.size.width;
           pageRect.size = CGSizeMake(pageRect.size.width*pdfScale,
                                      pageRect.size.height*pdfScale);




   15
giovedì 24 maggio 12
Visualizzazione base
        UIGraphicsBeginImageContext(pageRect.size);

        CGContextRef context = UIGraphicsGetCurrentContext();

        CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
        CGContextFillRect(context,pageRect);

        CGContextSaveGState(context);

        CGContextTranslateCTM(context, 0.0, pageRect.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);

        CGContextScaleCTM(context, pdfScale,pdfScale);!
        CGContextDrawPDFPage(context, page);
        CGContextRestoreGState(context);

        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        [self.imageView setImage:image];

        CGPDFPageRelease(page);
        CGPDFDocumentRelease(pdf);




   16
giovedì 24 maggio 12
Show me the code...

   17
giovedì 24 maggio 12
Scorrimento pagine
        • Uso di scrollview con paginazione

        • Creare una classe per la singola pagina
          ereditando da UIView


        • Pre-caricare più pagine ma...

        • Attenzione alla memoria!
          – Scaricare / Caricare una “finestra” di pagine



   18
giovedì 24 maggio 12
Pdf View
        - (id)initWithFrame:(CGRect)frame andPdfPage:(CGPDFPageRef)page
        {
            self = [super initWithFrame:frame];
            if (self) {
                pagina = page;

                       pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
                       pdfScale = self.frame.size.width/pageRect.size.width;
                       pageRect.size = CGSizeMake(pageRect.size.width*pdfScale,
                                                  pageRect.size.height*pdfScale);
               }
               return self;
        }

        - (void)drawRect:(CGRect)rect {
            CGContextRef context = UIGraphicsGetCurrentContext();

               CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
               CGContextFillRect(context,pageRect);

               CGContextSaveGState(context);
               CGContextTranslateCTM(context, 0.0, pageRect.size.height);
               CGContextScaleCTM(context, 1.0, -1.0);

               CGContextScaleCTM(context, pdfScale,pdfScale);!
               CGContextDrawPDFPage(context, pagina);
               CGContextRestoreGState(context);
        }




   19
giovedì 24 maggio 12
Impostare numero di pagine
        NSURL *pdfURL = [[NSBundle mainBundle]
        URLForResource:@"test.pdf" withExtension:nil];

        pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfURL);

        numberOfPages = CGPDFDocumentGetNumberOfPages(pdf);


        myScrollview.contentSize =
        CGSizeMake( self.myScrollview.frame.size.width * numberOfPages,
        self.myScrollview.frame.size.height);

        myScrollview.pagingEnabled = YES;




   20
giovedì 24 maggio 12
Show me the code...

   21
giovedì 24 maggio 12
Gestire lo Zoom
        • Scrollview con dentro Scrollviews :)

              – Ogni pagina è una scrollview!


        • Utilizzando per lo zoom il delegato:

            - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView




   22
giovedì 24 maggio 12
Zoom con doppio tap
        • Intercettarlo tramite touchesBegan

        • Permettere lo zoom in base a dove si è
          fatto il tap!

        • Tornare a zoom scale = 1 con ulteriore
          doppio tap


   23
giovedì 24 maggio 12
Zoom con doppio tap
        - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
        {
        ! CGPoint punto = [[touches anyObject] locationInView:self];
        !
            CGRect frameToZoom ;

               NSInteger radius = self.frame.size.width / 5;

               frameToZoom = CGRectMake(punto.x-radius, punto.y-radius, radius*2, radius*2);

        !     UITouch *touch   = [touches anyObject];
        !
               if([touch tapCount] == 2)
               {
                   if(self.zoomScale == 1.0)
               ! {
               ! ! [self zoomToRect:frameToZoom animated:YES];
                   }
               ! else
               ! {
               ! ! [self setZoomScale:1.0 animated:YES];
               ! }
               }
        }




   24
giovedì 24 maggio 12
Show me the code...

   25
giovedì 24 maggio 12
il Pdf è vettoriale!!!




   26
giovedì 24 maggio 12
CATiledLayer
        • Presente dentro QuartzCore!

        • Poca documentazione (4 properties, 1 Class Method)


        • Esempio: Applicazione Mappe


        • Ogni view possiede un CALayer
              – CATiledLayer è una sottoclasse di CALayer!


        • Per il disegno usare drawLayer:inContext:




   27
giovedì 24 maggio 12
LevelofDetail e LevelOfDetailBias
        • Level Of Detail il num di livelli di dettaglio per il layer
        • Level Of Detail Bias è il num di livelli magnified di dettaglio per il
          layer
        • Ogni LODB/LOD è una potenza di due o più rispetto al livello di
          dettaglio




   28
giovedì 24 maggio 12
TileSize
        • E’ la grandezza massima di ogni
          singolo tile usato nel layer

        • Di base è 256x256

        • Ci sono problemi con iPad 3 :(



   29
giovedì 24 maggio 12
LevelofDetail e LevelOfDetailBias
        • UIScrollview con zoom
              – minimumZoomScale 0.125f
              – maximumZoomScale 8.0f
              – Zoom di fattore 8


        • Potremmo scegliere LevelOfDetail 7 e LevelOfDetailBias 3
              – 7 configurazioni di level of detail
              – ogni livello è la metà di risoluzione del precedente
              – primi 3 sono a risoluzione “magnified”
              – il 4 è a risoluzione normale
              – gli ultimi 3 sono a risoluzione ridotta




   30
giovedì 24 maggio 12
Level 0   8192×8192

                  Level 1   4096×4096

                  Level 2   2048×2048

                  Level 3   1024×1024

                  Level 4   512×512

                  Level 5   256×256

                  Level 6   128×128




   31
giovedì 24 maggio 12
CATiledLayer
        #import <QuartzCore/QuartzCore.h>

        @implementation QuartzView

        - (id)initWithFrame:(CGRect)frame andPdfPage:(CGPDFPageRef)page
        {
            self = [super initWithFrame:frame];
            if (self) {

                       CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
                       tiledLayer.levelsOfDetail = 7;
        !     !        tiledLayer.levelsOfDetailBias = 3;
        !     !        tiledLayer.tileSize = CGSizeMake(512.0, 512.0);

                       pagina = page;

                       pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
                       pdfScale = self.frame.size.width/pageRect.size.width;
                       pageRect.size = CGSizeMake(pageRect.size.width*pdfScale,
                                                  pageRect.size.height*pdfScale);

               }
               return self;
        }




   32
giovedì 24 maggio 12
CATiledLayer
        + (Class)layerClass
        {
        ! return [CATiledLayer class];
        }

        - (void)drawRect:(CGRect)rect
        {
        }

        -(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context
        {
        ! CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
            CGContextFillRect(context,pageRect);
        !
        ! CGContextSaveGState(context);
        ! CGContextTranslateCTM(context, 0.0, pageRect.size.height);
        ! CGContextScaleCTM(context, 1.0, -1.0);
        !
        ! CGContextScaleCTM(context, pdfScale,pdfScale);!
        ! CGContextDrawPDFPage(context, pagina);
        ! CGContextRestoreGState(context);
        }




   33
giovedì 24 maggio 12
Show me the code...

   34
giovedì 24 maggio 12
Metadati
        • Dalle specifiche sono presenti al capitolo
                                          10.2 Metadata
        • Sono in un formato “particolare”
        • Si possono estrarre con CoreGraphics 8-)
         1 0 obj
         << /Title ( PostScript Language Reference, Third Edition )
         /Author (Adobe Systems Incorporated)
         /Creator (Adobe FrameMaker 5.5.3 for Power Macintosh®) /Producer (Acrobat Distiller
         3.01 for Power Macintosh) /CreationDate (D:19970915110347-08'00')
         /ModDate (D:19990209153925-08'00')
         >> endobj




   35
giovedì 24 maggio 12
Metadati




   36
giovedì 24 maggio 12
Titolo ed autore del pdf
        CGPDFDictionaryRef info = CGPDFDocumentGetInfo(pdf);

        CGPDFStringRef titleStringRef;
        CGPDFDictionaryGetString(info, "Title", &titleStringRef);
        const unsigned char *titleCstring =
        CGPDFStringGetBytePtr(titleStringRef);

        printf("Titolo: %s", titleCstring);

        CGPDFStringRef authorStringRef;
        CGPDFDictionaryGetString(info, "Author", &authorStringRef);
        const unsigned char *authorCstring =
        CGPDFStringGetBytePtr(authorStringRef);

        printf("nAutore: %s", authorCstring);




   37
giovedì 24 maggio 12
Accesso ai dati PDF
        • CGPDFDocument
        • CGPDFDocumentGetCatalog


        • CGPDFPage
        • CGPDFPageGetDictionary

        • CGPDFObjectGetObject, CGPDFDictionaryGetBoolean,
          CGPDFDictionaryGetInteger, CGPDFDictionaryGetString,
          CGPDFDictionaryGetArray...




   38
giovedì 24 maggio 12
Indice
        • Non è sempre presente :)

        • In base alla versione ed al formato
          potrebbe cambiare... (gestire più casi!)

        • Dalle specifiche presente nel capitolo

                       8.2 Document-Level Navigation

   39
giovedì 24 maggio 12
Outline Document




   40
giovedì 24 maggio 12
Outline Item
        • Chiavi:
               – Title
               – Parent / Prev / Next
               – First / Last
               – Count
               – Dest / A / SE


    CGPDFDictionaryRef dict = CGPDFDocumentGetCatalog(pdf);


    CGPDFDictionaryRef ret;

    if(         (CGPDFDictionaryGetDictionary(dict, "Outline", &ret))
          ||    (CGPDFDictionaryGetDictionary(dict, "Outlines", &ret)))

           {

          }


   41
giovedì 24 maggio 12
Show me the code...

   42
giovedì 24 maggio 12
Altre possibilità... che non vedremo :)

        • Links
        • Annotations (cap. 8.4)
        • Thumbnail (cap 8.2.3)
        • Ricerca testuale (estrazione full text)




   43
giovedì 24 maggio 12

Weitere ähnliche Inhalte

Andere mochten auch

Whymca Vodafone Apps
Whymca Vodafone AppsWhymca Vodafone Apps
Whymca Vodafone AppsWhymca
 
Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini Whymca
 
Whymca Riccardo Bosio Servizi Mobile e Applicazioni: la rivoluzione in atto
Whymca Riccardo Bosio Servizi Mobile e Applicazioni: la rivoluzione in atto Whymca Riccardo Bosio Servizi Mobile e Applicazioni: la rivoluzione in atto
Whymca Riccardo Bosio Servizi Mobile e Applicazioni: la rivoluzione in atto Whymca
 
Personal Retreats: The Movement Center
Personal Retreats: The Movement CenterPersonal Retreats: The Movement Center
Personal Retreats: The Movement CenterMichelle Valentino
 
Whymca Dpixel
Whymca DpixelWhymca Dpixel
Whymca DpixelWhymca
 
Crisis Management Portfolio
Crisis Management PortfolioCrisis Management Portfolio
Crisis Management Portfolioguest0486ff
 
Tutto quello che volete sapere sullo sviluppo per Windows 8 e Windows Phone!
Tutto quello che volete sapere sullo sviluppo per Windows 8 e Windows Phone!Tutto quello che volete sapere sullo sviluppo per Windows 8 e Windows Phone!
Tutto quello che volete sapere sullo sviluppo per Windows 8 e Windows Phone!Whymca
 
Android - ishan fernando - android nfc presentation
Android - ishan fernando - android nfc presentationAndroid - ishan fernando - android nfc presentation
Android - ishan fernando - android nfc presentationWhymca
 
Whymca Intro
Whymca IntroWhymca Intro
Whymca IntroWhymca
 
Whymca Filippo Renga Mobile Revolution Quali opportunità dalle applicazioni?
Whymca Filippo Renga Mobile Revolution Quali opportunità dalle applicazioni?Whymca Filippo Renga Mobile Revolution Quali opportunità dalle applicazioni?
Whymca Filippo Renga Mobile Revolution Quali opportunità dalle applicazioni?Whymca
 
SUPERMOMS & SUPERHEROES CHRISTMAS CONCERT 2014 SPONSORSHIP PACKAGE
SUPERMOMS & SUPERHEROES CHRISTMAS CONCERT 2014 SPONSORSHIP PACKAGESUPERMOMS & SUPERHEROES CHRISTMAS CONCERT 2014 SPONSORSHIP PACKAGE
SUPERMOMS & SUPERHEROES CHRISTMAS CONCERT 2014 SPONSORSHIP PACKAGEDerrick Kim
 
Whymca Mobyt Strumenti Open Source Per Infrastrutture Dimobile Messaging
Whymca Mobyt Strumenti Open Source Per Infrastrutture Dimobile MessagingWhymca Mobyt Strumenti Open Source Per Infrastrutture Dimobile Messaging
Whymca Mobyt Strumenti Open Source Per Infrastrutture Dimobile MessagingWhymca
 
Crossdev sdk/tools: devil's deception - Luciano Colosio
Crossdev sdk/tools: devil's deception - Luciano ColosioCrossdev sdk/tools: devil's deception - Luciano Colosio
Crossdev sdk/tools: devil's deception - Luciano ColosioWhymca
 
Physical computing: tutto intorno a te - Andrea Maietta, Paolo Aliverti
Physical computing: tutto intorno a te - Andrea Maietta, Paolo AlivertiPhysical computing: tutto intorno a te - Andrea Maietta, Paolo Aliverti
Physical computing: tutto intorno a te - Andrea Maietta, Paolo AlivertiWhymca
 
Bfw yearend potluck
Bfw yearend potluckBfw yearend potluck
Bfw yearend potluckDerrick Kim
 

Andere mochten auch (16)

Whymca Vodafone Apps
Whymca Vodafone AppsWhymca Vodafone Apps
Whymca Vodafone Apps
 
Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini
 
Whymca Riccardo Bosio Servizi Mobile e Applicazioni: la rivoluzione in atto
Whymca Riccardo Bosio Servizi Mobile e Applicazioni: la rivoluzione in atto Whymca Riccardo Bosio Servizi Mobile e Applicazioni: la rivoluzione in atto
Whymca Riccardo Bosio Servizi Mobile e Applicazioni: la rivoluzione in atto
 
Personal Retreats: The Movement Center
Personal Retreats: The Movement CenterPersonal Retreats: The Movement Center
Personal Retreats: The Movement Center
 
Whymca Dpixel
Whymca DpixelWhymca Dpixel
Whymca Dpixel
 
Crisis Management Portfolio
Crisis Management PortfolioCrisis Management Portfolio
Crisis Management Portfolio
 
Creative R Profile
Creative R ProfileCreative R Profile
Creative R Profile
 
Tutto quello che volete sapere sullo sviluppo per Windows 8 e Windows Phone!
Tutto quello che volete sapere sullo sviluppo per Windows 8 e Windows Phone!Tutto quello che volete sapere sullo sviluppo per Windows 8 e Windows Phone!
Tutto quello che volete sapere sullo sviluppo per Windows 8 e Windows Phone!
 
Android - ishan fernando - android nfc presentation
Android - ishan fernando - android nfc presentationAndroid - ishan fernando - android nfc presentation
Android - ishan fernando - android nfc presentation
 
Whymca Intro
Whymca IntroWhymca Intro
Whymca Intro
 
Whymca Filippo Renga Mobile Revolution Quali opportunità dalle applicazioni?
Whymca Filippo Renga Mobile Revolution Quali opportunità dalle applicazioni?Whymca Filippo Renga Mobile Revolution Quali opportunità dalle applicazioni?
Whymca Filippo Renga Mobile Revolution Quali opportunità dalle applicazioni?
 
SUPERMOMS & SUPERHEROES CHRISTMAS CONCERT 2014 SPONSORSHIP PACKAGE
SUPERMOMS & SUPERHEROES CHRISTMAS CONCERT 2014 SPONSORSHIP PACKAGESUPERMOMS & SUPERHEROES CHRISTMAS CONCERT 2014 SPONSORSHIP PACKAGE
SUPERMOMS & SUPERHEROES CHRISTMAS CONCERT 2014 SPONSORSHIP PACKAGE
 
Whymca Mobyt Strumenti Open Source Per Infrastrutture Dimobile Messaging
Whymca Mobyt Strumenti Open Source Per Infrastrutture Dimobile MessagingWhymca Mobyt Strumenti Open Source Per Infrastrutture Dimobile Messaging
Whymca Mobyt Strumenti Open Source Per Infrastrutture Dimobile Messaging
 
Crossdev sdk/tools: devil's deception - Luciano Colosio
Crossdev sdk/tools: devil's deception - Luciano ColosioCrossdev sdk/tools: devil's deception - Luciano Colosio
Crossdev sdk/tools: devil's deception - Luciano Colosio
 
Physical computing: tutto intorno a te - Andrea Maietta, Paolo Aliverti
Physical computing: tutto intorno a te - Andrea Maietta, Paolo AlivertiPhysical computing: tutto intorno a te - Andrea Maietta, Paolo Aliverti
Physical computing: tutto intorno a te - Andrea Maietta, Paolo Aliverti
 
Bfw yearend potluck
Bfw yearend potluckBfw yearend potluck
Bfw yearend potluck
 

Ähnlich wie Gestire i pdf con IOS - Maurizio Moriconi - WhyMCA

Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...
Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...
Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...Dominopoint - Italian Lotus User Group
 
Slide sessione Drupal Theming & CSS Framework – Drupal Camp Torino 2010
Slide sessione Drupal Theming & CSS Framework – Drupal Camp Torino 2010Slide sessione Drupal Theming & CSS Framework – Drupal Camp Torino 2010
Slide sessione Drupal Theming & CSS Framework – Drupal Camp Torino 2010Domenico Monaco
 
Responsive Web Design
Responsive Web DesignResponsive Web Design
Responsive Web DesignSimone Viani
 
I linguaggi del web - seconda edizione (3° giornata)
I linguaggi del web - seconda edizione (3° giornata)I linguaggi del web - seconda edizione (3° giornata)
I linguaggi del web - seconda edizione (3° giornata)Diego La Monica
 
Drupal Lessons by nois3lab
Drupal Lessons by nois3labDrupal Lessons by nois3lab
Drupal Lessons by nois3labnois3lab
 
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, PiacenzaSviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, PiacenzaMarco Breveglieri
 
Open Day June 17th Creare componenti AngularJS riutilizzabili tra applicazioni
Open Day June 17th Creare componenti AngularJS riutilizzabili tra applicazioniOpen Day June 17th Creare componenti AngularJS riutilizzabili tra applicazioni
Open Day June 17th Creare componenti AngularJS riutilizzabili tra applicazioniVendini-Italy
 
Livin' with Docker - dallo sviluppo alla produzione
Livin' with Docker - dallo sviluppo alla produzioneLivin' with Docker - dallo sviluppo alla produzione
Livin' with Docker - dallo sviluppo alla produzionegiacomos
 
Corso WebApp iOS - Lezione 06: Web Development for iOS Devices
Corso WebApp iOS - Lezione 06:   Web Development for iOS DevicesCorso WebApp iOS - Lezione 06:   Web Development for iOS Devices
Corso WebApp iOS - Lezione 06: Web Development for iOS DevicesAndrea Picchi
 
Introduzione ai Big Data e alla scienza dei dati - Big Data
Introduzione ai Big Data e alla scienza dei dati - Big DataIntroduzione ai Big Data e alla scienza dei dati - Big Data
Introduzione ai Big Data e alla scienza dei dati - Big DataVincenzo Manzoni
 
Prototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsPrototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsCommit University
 
Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019
Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019
Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019Marco Chiesi
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 
Introduzione alla programmazione Android - Android@tulug
Introduzione alla programmazione Android - Android@tulugIntroduzione alla programmazione Android - Android@tulug
Introduzione alla programmazione Android - Android@tulugIvan Gualandri
 
PyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkPyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkTiziano Lattisi
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side JavascriptMatteo Napolitano
 

Ähnlich wie Gestire i pdf con IOS - Maurizio Moriconi - WhyMCA (20)

Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...
Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...
Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...
 
Slide sessione Drupal Theming & CSS Framework – Drupal Camp Torino 2010
Slide sessione Drupal Theming & CSS Framework – Drupal Camp Torino 2010Slide sessione Drupal Theming & CSS Framework – Drupal Camp Torino 2010
Slide sessione Drupal Theming & CSS Framework – Drupal Camp Torino 2010
 
Mobile UI Design
Mobile UI DesignMobile UI Design
Mobile UI Design
 
Responsive Web Design
Responsive Web DesignResponsive Web Design
Responsive Web Design
 
I linguaggi del web - seconda edizione (3° giornata)
I linguaggi del web - seconda edizione (3° giornata)I linguaggi del web - seconda edizione (3° giornata)
I linguaggi del web - seconda edizione (3° giornata)
 
Drupal Lessons by nois3lab
Drupal Lessons by nois3labDrupal Lessons by nois3lab
Drupal Lessons by nois3lab
 
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, PiacenzaSviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
 
Open Day June 17th Creare componenti AngularJS riutilizzabili tra applicazioni
Open Day June 17th Creare componenti AngularJS riutilizzabili tra applicazioniOpen Day June 17th Creare componenti AngularJS riutilizzabili tra applicazioni
Open Day June 17th Creare componenti AngularJS riutilizzabili tra applicazioni
 
Livin' with Docker - dallo sviluppo alla produzione
Livin' with Docker - dallo sviluppo alla produzioneLivin' with Docker - dallo sviluppo alla produzione
Livin' with Docker - dallo sviluppo alla produzione
 
m-v-vm @ UgiAlt.Net
m-v-vm @ UgiAlt.Netm-v-vm @ UgiAlt.Net
m-v-vm @ UgiAlt.Net
 
Corso WebApp iOS - Lezione 06: Web Development for iOS Devices
Corso WebApp iOS - Lezione 06:   Web Development for iOS DevicesCorso WebApp iOS - Lezione 06:   Web Development for iOS Devices
Corso WebApp iOS - Lezione 06: Web Development for iOS Devices
 
DDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continuaDDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continua
 
Introduzione ai Big Data e alla scienza dei dati - Big Data
Introduzione ai Big Data e alla scienza dei dati - Big DataIntroduzione ai Big Data e alla scienza dei dati - Big Data
Introduzione ai Big Data e alla scienza dei dati - Big Data
 
Prototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsPrototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step Functions
 
Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019
Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019
Grunt: automazione per sviluppatori “pigri” - WordCamp Bari 2019
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
Introduzione alla programmazione Android - Android@tulug
Introduzione alla programmazione Android - Android@tulugIntroduzione alla programmazione Android - Android@tulug
Introduzione alla programmazione Android - Android@tulug
 
VS Package @ CD2008
VS Package @ CD2008VS Package @ CD2008
VS Package @ CD2008
 
PyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkPyPaPi Qt Java Framework
PyPaPi Qt Java Framework
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side Javascript
 

Mehr von Whymca

Dalla natura morta allo spime. Riflessioni sparse su futuring, cose e interfacce
Dalla natura morta allo spime. Riflessioni sparse su futuring, cose e interfacceDalla natura morta allo spime. Riflessioni sparse su futuring, cose e interfacce
Dalla natura morta allo spime. Riflessioni sparse su futuring, cose e interfacceWhymca
 
Internet of Things con .Net Micro Framework: un mondo di device interconnessi
Internet of Things con .Net Micro Framework: un mondo di device interconnessiInternet of Things con .Net Micro Framework: un mondo di device interconnessi
Internet of Things con .Net Micro Framework: un mondo di device interconnessiWhymca
 
Windows phone 7 deep dive again and more - roberto freato WhyMCA 2012
Windows phone 7 deep dive again and more - roberto freato WhyMCA 2012Windows phone 7 deep dive again and more - roberto freato WhyMCA 2012
Windows phone 7 deep dive again and more - roberto freato WhyMCA 2012Whymca
 
Wanna go mobile game 3.0 - Andrea trento - WhyMCA
Wanna go mobile game 3.0 - Andrea trento - WhyMCAWanna go mobile game 3.0 - Andrea trento - WhyMCA
Wanna go mobile game 3.0 - Andrea trento - WhyMCAWhymca
 
Dal web a Windows 8: costruire app Metro immersiv - Daniele Bochiccio - whyMCA
Dal web a Windows 8: costruire app Metro immersiv - Daniele Bochiccio - whyMCADal web a Windows 8: costruire app Metro immersiv - Daniele Bochiccio - whyMCA
Dal web a Windows 8: costruire app Metro immersiv - Daniele Bochiccio - whyMCAWhymca
 
SCONTRO TRA UI -AKA- COSA DOVREMMO IMPARARE DA IOS, ANDROID E WP7
SCONTRO TRA UI -AKA- COSA DOVREMMO IMPARARE DA IOS, ANDROID E WP7SCONTRO TRA UI -AKA- COSA DOVREMMO IMPARARE DA IOS, ANDROID E WP7
SCONTRO TRA UI -AKA- COSA DOVREMMO IMPARARE DA IOS, ANDROID E WP7Whymca
 
Beginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCABeginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCAWhymca
 
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...Whymca
 
whymca Andrea Piovani Layar: la nuova frontiera della realtà aumentata
whymca Andrea Piovani Layar: la nuova frontiera della realtà aumentatawhymca Andrea Piovani Layar: la nuova frontiera della realtà aumentata
whymca Andrea Piovani Layar: la nuova frontiera della realtà aumentataWhymca
 
Whymca Peoplesound
Whymca PeoplesoundWhymca Peoplesound
Whymca PeoplesoundWhymca
 

Mehr von Whymca (10)

Dalla natura morta allo spime. Riflessioni sparse su futuring, cose e interfacce
Dalla natura morta allo spime. Riflessioni sparse su futuring, cose e interfacceDalla natura morta allo spime. Riflessioni sparse su futuring, cose e interfacce
Dalla natura morta allo spime. Riflessioni sparse su futuring, cose e interfacce
 
Internet of Things con .Net Micro Framework: un mondo di device interconnessi
Internet of Things con .Net Micro Framework: un mondo di device interconnessiInternet of Things con .Net Micro Framework: un mondo di device interconnessi
Internet of Things con .Net Micro Framework: un mondo di device interconnessi
 
Windows phone 7 deep dive again and more - roberto freato WhyMCA 2012
Windows phone 7 deep dive again and more - roberto freato WhyMCA 2012Windows phone 7 deep dive again and more - roberto freato WhyMCA 2012
Windows phone 7 deep dive again and more - roberto freato WhyMCA 2012
 
Wanna go mobile game 3.0 - Andrea trento - WhyMCA
Wanna go mobile game 3.0 - Andrea trento - WhyMCAWanna go mobile game 3.0 - Andrea trento - WhyMCA
Wanna go mobile game 3.0 - Andrea trento - WhyMCA
 
Dal web a Windows 8: costruire app Metro immersiv - Daniele Bochiccio - whyMCA
Dal web a Windows 8: costruire app Metro immersiv - Daniele Bochiccio - whyMCADal web a Windows 8: costruire app Metro immersiv - Daniele Bochiccio - whyMCA
Dal web a Windows 8: costruire app Metro immersiv - Daniele Bochiccio - whyMCA
 
SCONTRO TRA UI -AKA- COSA DOVREMMO IMPARARE DA IOS, ANDROID E WP7
SCONTRO TRA UI -AKA- COSA DOVREMMO IMPARARE DA IOS, ANDROID E WP7SCONTRO TRA UI -AKA- COSA DOVREMMO IMPARARE DA IOS, ANDROID E WP7
SCONTRO TRA UI -AKA- COSA DOVREMMO IMPARARE DA IOS, ANDROID E WP7
 
Beginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCABeginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCA
 
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...
 
whymca Andrea Piovani Layar: la nuova frontiera della realtà aumentata
whymca Andrea Piovani Layar: la nuova frontiera della realtà aumentatawhymca Andrea Piovani Layar: la nuova frontiera della realtà aumentata
whymca Andrea Piovani Layar: la nuova frontiera della realtà aumentata
 
Whymca Peoplesound
Whymca PeoplesoundWhymca Peoplesound
Whymca Peoplesound
 

Gestire i pdf con IOS - Maurizio Moriconi - WhyMCA

  • 1. Gestire i PDF con iOS Maurizio Moriconi - @bugman79 Mobilesoft giovedì 24 maggio 12
  • 2. Chi sono: Maurizio Moriconi • CTO presso Mobilesoft • Co-founder • Mobile Developer • Main Developer http://www.linkedin.com/in/bugman @bugman79 http://www.facebook.com/maurizio.moriconi 2 giovedì 24 maggio 12
  • 3. Editoria digitale 3 giovedì 24 maggio 12
  • 5. Funzionalità MobilePaper • Visualizzazione in portrait e landscape (2 pagine affiancate) • Zoom della pagina tramite pinch o con doppio tap • Possibilità di passare alle pagine successive o precedenti • Visualizzazione delle pagine tramite elenco e/o miniature • Visualizzazione dell'indice (capitoli e paragrafi del pdf) • Memorizzazione dei segnalibri (preferiti) • Scelta della musica di sottofondo • Inserimento di note • Ricerca di testo all'interno della rivista • Disponibile su iOS ed Android 5 giovedì 24 maggio 12
  • 6. Editoria su iOS • Varie possibilità: – App Native – Uso di PDF con eventuale aggiunta di elementi nativi (multimedia ed interazione) – HTML 5 6 giovedì 24 maggio 12
  • 7. Il formato Pdf • Portable Document Format • File basato su un linguaggio di descrizione pagina • Sviluppato da Adobe System nel 1993 • Nel 2007 è diventato standard ISO 32000 • Ci sono vari sottoformati (PDF/A, PDF/X, PDF/E...) 7 giovedì 24 maggio 12
  • 8. PDF/A • PDF/A (PDF/Archiving) per l’archiviazione a lungo termine (ha 2 sottoformati /A-1a /A-1b) • Standard ISO 19005-1:2005 dal 2005 • Basato sulla vesione 1.4 del formato PDF di Adobe • Documenti “auto contenuti” – Include i font che utilizza!! – Include immagini, colori, altri dati – Non ci sono fonti esterne • Nel sottoformato PDF/A-2 si basa PDF v. 1.7 8 giovedì 24 maggio 12
  • 9. PDF: specifiche http://www.adobe.com/devnet/pdf/ pdf_reference.html Ultima versione: PDF Reference, sixth edition APDF version 1.7 1310 pagine!!! 9 giovedì 24 maggio 12
  • 10. Uso della webview • Vantaggi – Facile da realizzare – Possibilità di usare pdf “online” – Funzionamento dei link interni • Svantaggi – Poca interazione lato utente – Scrollview verticale – Nessuna paginazione 10 giovedì 24 maggio 12
  • 11. Caricare Pdf in una webview NSString *pdfPath = [[NSBundle mainBundle] pathForResource:@"file" ofType:@"pdf"]; NSURL *url = [NSURL fileURLWithPath:pdfPath]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; [webView loadRequest:urlRequest]; 11 giovedì 24 maggio 12
  • 12. Show me the code... 12 giovedì 24 maggio 12
  • 13. Uso di Quartz • Motore di rendering di Darwin chiamato “per gli amici” con il nome di Core Graphics • Quartz 2D: – libreria grafica ereditata da QuickDraw – usa il formato PDF per il disegno!!! – si basa sulla versione 1.4 Adobe PDF 13 giovedì 24 maggio 12
  • 14. Classi che ci interessano • CGPDFDocument • CGPDFPage • CGPDFObject • CGContext 14 giovedì 24 maggio 12
  • 15. Caricamento del Pdf #import <QuartzCore/QuartzCore.h> NSURL *pdfURL = [[NSBundle mainBundle] URLForResource:@"TestPage.pdf" withExtension:nil]; CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); // Prendo la prima pagina CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 1); CGPDFPageRetain(page); // Determino la grandezza del PDF CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); pdfScale = self.imageView.frame.size.width/pageRect.size.width; pageRect.size = CGSizeMake(pageRect.size.width*pdfScale, pageRect.size.height*pdfScale); 15 giovedì 24 maggio 12
  • 16. Visualizzazione base UIGraphicsBeginImageContext(pageRect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0); CGContextFillRect(context,pageRect); CGContextSaveGState(context); CGContextTranslateCTM(context, 0.0, pageRect.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextScaleCTM(context, pdfScale,pdfScale);! CGContextDrawPDFPage(context, page); CGContextRestoreGState(context); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); [self.imageView setImage:image]; CGPDFPageRelease(page); CGPDFDocumentRelease(pdf); 16 giovedì 24 maggio 12
  • 17. Show me the code... 17 giovedì 24 maggio 12
  • 18. Scorrimento pagine • Uso di scrollview con paginazione • Creare una classe per la singola pagina ereditando da UIView • Pre-caricare più pagine ma... • Attenzione alla memoria! – Scaricare / Caricare una “finestra” di pagine 18 giovedì 24 maggio 12
  • 19. Pdf View - (id)initWithFrame:(CGRect)frame andPdfPage:(CGPDFPageRef)page { self = [super initWithFrame:frame]; if (self) { pagina = page; pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); pdfScale = self.frame.size.width/pageRect.size.width; pageRect.size = CGSizeMake(pageRect.size.width*pdfScale, pageRect.size.height*pdfScale); } return self; } - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0); CGContextFillRect(context,pageRect); CGContextSaveGState(context); CGContextTranslateCTM(context, 0.0, pageRect.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextScaleCTM(context, pdfScale,pdfScale);! CGContextDrawPDFPage(context, pagina); CGContextRestoreGState(context); } 19 giovedì 24 maggio 12
  • 20. Impostare numero di pagine NSURL *pdfURL = [[NSBundle mainBundle] URLForResource:@"test.pdf" withExtension:nil]; pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfURL); numberOfPages = CGPDFDocumentGetNumberOfPages(pdf); myScrollview.contentSize = CGSizeMake( self.myScrollview.frame.size.width * numberOfPages, self.myScrollview.frame.size.height); myScrollview.pagingEnabled = YES; 20 giovedì 24 maggio 12
  • 21. Show me the code... 21 giovedì 24 maggio 12
  • 22. Gestire lo Zoom • Scrollview con dentro Scrollviews :) – Ogni pagina è una scrollview! • Utilizzando per lo zoom il delegato: - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 22 giovedì 24 maggio 12
  • 23. Zoom con doppio tap • Intercettarlo tramite touchesBegan • Permettere lo zoom in base a dove si è fatto il tap! • Tornare a zoom scale = 1 con ulteriore doppio tap 23 giovedì 24 maggio 12
  • 24. Zoom con doppio tap - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { ! CGPoint punto = [[touches anyObject] locationInView:self]; ! CGRect frameToZoom ; NSInteger radius = self.frame.size.width / 5; frameToZoom = CGRectMake(punto.x-radius, punto.y-radius, radius*2, radius*2); ! UITouch *touch = [touches anyObject]; ! if([touch tapCount] == 2) { if(self.zoomScale == 1.0) ! { ! ! [self zoomToRect:frameToZoom animated:YES]; } ! else ! { ! ! [self setZoomScale:1.0 animated:YES]; ! } } } 24 giovedì 24 maggio 12
  • 25. Show me the code... 25 giovedì 24 maggio 12
  • 26. il Pdf è vettoriale!!! 26 giovedì 24 maggio 12
  • 27. CATiledLayer • Presente dentro QuartzCore! • Poca documentazione (4 properties, 1 Class Method) • Esempio: Applicazione Mappe • Ogni view possiede un CALayer – CATiledLayer è una sottoclasse di CALayer! • Per il disegno usare drawLayer:inContext: 27 giovedì 24 maggio 12
  • 28. LevelofDetail e LevelOfDetailBias • Level Of Detail il num di livelli di dettaglio per il layer • Level Of Detail Bias è il num di livelli magnified di dettaglio per il layer • Ogni LODB/LOD è una potenza di due o più rispetto al livello di dettaglio 28 giovedì 24 maggio 12
  • 29. TileSize • E’ la grandezza massima di ogni singolo tile usato nel layer • Di base è 256x256 • Ci sono problemi con iPad 3 :( 29 giovedì 24 maggio 12
  • 30. LevelofDetail e LevelOfDetailBias • UIScrollview con zoom – minimumZoomScale 0.125f – maximumZoomScale 8.0f – Zoom di fattore 8 • Potremmo scegliere LevelOfDetail 7 e LevelOfDetailBias 3 – 7 configurazioni di level of detail – ogni livello è la metà di risoluzione del precedente – primi 3 sono a risoluzione “magnified” – il 4 è a risoluzione normale – gli ultimi 3 sono a risoluzione ridotta 30 giovedì 24 maggio 12
  • 31. Level 0 8192×8192 Level 1 4096×4096 Level 2 2048×2048 Level 3 1024×1024 Level 4 512×512 Level 5 256×256 Level 6 128×128 31 giovedì 24 maggio 12
  • 32. CATiledLayer #import <QuartzCore/QuartzCore.h> @implementation QuartzView - (id)initWithFrame:(CGRect)frame andPdfPage:(CGPDFPageRef)page { self = [super initWithFrame:frame]; if (self) { CATiledLayer *tiledLayer = (CATiledLayer *)[self layer]; tiledLayer.levelsOfDetail = 7; ! ! tiledLayer.levelsOfDetailBias = 3; ! ! tiledLayer.tileSize = CGSizeMake(512.0, 512.0); pagina = page; pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); pdfScale = self.frame.size.width/pageRect.size.width; pageRect.size = CGSizeMake(pageRect.size.width*pdfScale, pageRect.size.height*pdfScale); } return self; } 32 giovedì 24 maggio 12
  • 33. CATiledLayer + (Class)layerClass { ! return [CATiledLayer class]; } - (void)drawRect:(CGRect)rect { } -(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context { ! CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0); CGContextFillRect(context,pageRect); ! ! CGContextSaveGState(context); ! CGContextTranslateCTM(context, 0.0, pageRect.size.height); ! CGContextScaleCTM(context, 1.0, -1.0); ! ! CGContextScaleCTM(context, pdfScale,pdfScale);! ! CGContextDrawPDFPage(context, pagina); ! CGContextRestoreGState(context); } 33 giovedì 24 maggio 12
  • 34. Show me the code... 34 giovedì 24 maggio 12
  • 35. Metadati • Dalle specifiche sono presenti al capitolo 10.2 Metadata • Sono in un formato “particolare” • Si possono estrarre con CoreGraphics 8-) 1 0 obj << /Title ( PostScript Language Reference, Third Edition ) /Author (Adobe Systems Incorporated) /Creator (Adobe FrameMaker 5.5.3 for Power Macintosh®) /Producer (Acrobat Distiller 3.01 for Power Macintosh) /CreationDate (D:19970915110347-08'00') /ModDate (D:19990209153925-08'00') >> endobj 35 giovedì 24 maggio 12
  • 36. Metadati 36 giovedì 24 maggio 12
  • 37. Titolo ed autore del pdf CGPDFDictionaryRef info = CGPDFDocumentGetInfo(pdf); CGPDFStringRef titleStringRef; CGPDFDictionaryGetString(info, "Title", &titleStringRef); const unsigned char *titleCstring = CGPDFStringGetBytePtr(titleStringRef); printf("Titolo: %s", titleCstring); CGPDFStringRef authorStringRef; CGPDFDictionaryGetString(info, "Author", &authorStringRef); const unsigned char *authorCstring = CGPDFStringGetBytePtr(authorStringRef); printf("nAutore: %s", authorCstring); 37 giovedì 24 maggio 12
  • 38. Accesso ai dati PDF • CGPDFDocument • CGPDFDocumentGetCatalog • CGPDFPage • CGPDFPageGetDictionary • CGPDFObjectGetObject, CGPDFDictionaryGetBoolean, CGPDFDictionaryGetInteger, CGPDFDictionaryGetString, CGPDFDictionaryGetArray... 38 giovedì 24 maggio 12
  • 39. Indice • Non è sempre presente :) • In base alla versione ed al formato potrebbe cambiare... (gestire più casi!) • Dalle specifiche presente nel capitolo 8.2 Document-Level Navigation 39 giovedì 24 maggio 12
  • 40. Outline Document 40 giovedì 24 maggio 12
  • 41. Outline Item • Chiavi: – Title – Parent / Prev / Next – First / Last – Count – Dest / A / SE CGPDFDictionaryRef dict = CGPDFDocumentGetCatalog(pdf); CGPDFDictionaryRef ret; if( (CGPDFDictionaryGetDictionary(dict, "Outline", &ret)) || (CGPDFDictionaryGetDictionary(dict, "Outlines", &ret))) { } 41 giovedì 24 maggio 12
  • 42. Show me the code... 42 giovedì 24 maggio 12
  • 43. Altre possibilità... che non vedremo :) • Links • Annotations (cap. 8.4) • Thumbnail (cap 8.2.3) • Ricerca testuale (estrazione full text) 43 giovedì 24 maggio 12