2011-10-04 4 views
7

Non voglio creare nuovo file PDF, che avevo già fatto, ma vuole mostrare e modificare file PDF esistente in iOS tramite il codice ..Come mostrare e modificare i file PDF esistenti in applicazione iOS

È questo possibile o no e, se possibile, di come posso fare questo ...

Aggiornamento

Supponiamo che non ci sarà il testo del documento pdf e vogliamo inserire qualche altro testo in quel file e salvare it..so come farlo programmando?

Si prega di aiutarmi a risolvere questo problema ...

Grazie in anticipo ...

+0

Ho aggiornato la mia risposta – Geoffroy

risposta

0

È possibile utilizzare Quartz2D per manipolare i file PDF, li apre, fare la trasformazione e così via.

Partenza il funzionario documentation

Aggiornamento:

Creare il contesto pdf come spiegato nella documentazione, allora non resta che scrivere il testo:

http://developer.apple.com/library/ios/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_text/dq_text.html#//apple_ref/doc/uid/TP30001066-CH213-TPXREF101

+1

avevo letto la documentazione, ma non so da dove cominciare .. –

+1

si prega di vedere la mia domanda aggiornato –

+1

Non so che ha ritenuto che i tuoi commenti siano 'grandi commenti' ma seriamente, controlla altre domande relative al PDF (ce ne sono così tante su StackOverflow stesso) ... non c'è una risposta diretta per la tua domanda ... – lukya

1

So che la sua troppo in ritardo per questa domanda, tuttavia vorrei aggiungere la mia soluzione.

Sto usando UIGraphicsBeginPDFContextToFile per generare un file PDF. Ho creato una classe chiamata PDFCreator dalla classe base UIViewController, nel senso che ho due funzioni come questo:

- (void) beginContextWithFile:(NSString *)filename 
{ 
    pageSize = CGSizeMake(1024, 1424); 

    UIGraphicsBeginPDFContextToFile(filename, CGRectZero, nil); 

    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil); 

    [self createInitialPart]; 
} 

- (void) endContext 
{ 
    UIGraphicsEndPDFContext(); 
} 

ho creato un oggetto di questa classe nel file app delegato, come manterrà l'oggetto finché l'app non termina (come era il mio requisito).

Inizialmente, chiamo beginContextWithFile: e creerò un file pdf nella directory del documento insieme ai dati che sto aggiungendo tramite una chiamata al metodo createInitialPart.

A un certo punto più tardi ho bisogno di aggiornare quel file, quindi ho un altro metodo chiamato secondPart anche se l'ho chiamato per altri dati da aggiungere a quel file.

Una volta che ho completato la creazione, devo chiamare il endContext della classe PDFCreator, che completerà la generazione di PDF e sì, avrò il file aggiornato.

Questo è po 'difficile e non ho eseguire alcun controllo di memoria se ho avuto l'esigenza, ho trovato la soluzione :)

+0

Vedi nell'esempio, chiama questa funzione 'beginContextWithFile' renderà un file PDF per me ma non lo salverò fino a quando non chiamerò il metodo 'endContext'. Avrei bisogno di dove, stavo chiamando 'beginContextWithFile' in una classe, e dopo alcuni aggiornamenti faccio call al metodo' endContext'. – Hemang

1

ero in grado di fare questo con la creazione di una copia del PDF originale e modificandolo durante il processo di costruzione.

PS: Nella mia soluzione avevo bisogno di modificare le informazioni sul documento del nuovo PDF, quindi ho usato il parametro soggetto per farlo.

In Swift 3

func createPDF(on path: String?, from templateURL: URL?, with subject: String?) { 
    guard let newPDFPath = path, 
     let pdfURL = templateURL else { return } 

    let options = [(kCGPDFContextSubject as String): subject ?? ""] as CFDictionary 

    UIGraphicsBeginPDFContextToFile(newPDFPath, .zero, options as? [AnyHashable : Any]) 

    let templateDocument = CGPDFDocument(pdfURL as CFURL) 
    let pageCount = templateDocument?.numberOfPages ?? 0 

    for i in 1...pageCount { 

     //get bounds of template page 
     if let templatePage = templateDocument?.page(at: i) { 
      let templatePageBounds = templatePage.getBoxRect(.cropBox) 

      //create empty page with corresponding bounds in new document 
      UIGraphicsBeginPDFPageWithInfo(templatePageBounds, nil) 
      let context = UIGraphicsGetCurrentContext() 

      //flip context due to different origins 
      context?.translateBy(x: 0.0, y: templatePageBounds.height) 
      context?.scaleBy(x: 1.0, y: -1.0) 

      //copy content of template page on the corresponding page in new file 
      context?.drawPDFPage(templatePage) 

      //flip context back 
      context?.translateBy(x: 0.0, y: templatePageBounds.height) 
      context?.scaleBy(x: 1.0, y: -1.0) 


      // -->>>> Do your change here <<<<-- 
      /* Here you can do any drawings */ 

     } 
    } 
    UIGraphicsEndPDFContext() 
} 
+0

Questo dovrebbe segnare come miglior risposta. Mi hai appena salvato la vita. Posso farti una domanda: utilizzo una visualizzazione Web per visualizzare il PDF, quando l'utente tocca una posizione su quel pdf, quindi crea un segno su quella posizione. So che posso usare la funzione di cui sopra per creare una nuova base PDF sul modello, mi chiedo solo come posso ottenere la posizione – user3783161

+0

Grazie mille. Ho provato a rispondere alla tua domanda [QUI] (https://stackoverflow.com/a/45701477/6282606). – Enrique

Problemi correlati