2011-10-04 13 views
7

no quiero crear nuevo archivo PDF, que ya había hecho pero que quieren mostrar y editar el archivo PDF existente en iOS a través de código ..Cómo mostrar y editar archivos PDF existentes en la aplicación de ios

¿Este posible o no y si es posible que cómo puedo hacer esto ...

actualización

Supongamos que habrá texto del documento PDF y queremos introducir un texto diferente en ese archivo y guardar it..so ¿Cómo hacer esto por programación?

Por favor, ayudarme a solucionar este problema ...

Gracias por adelantado ...

+0

He actualizado mi respuesta – Geoffroy

Respuesta

0

Usted puede utilizar Quartz2D para manipular su PDF, abrirlos, realizar la transformación y así sucesivamente.

Salida el funcionario documentation

Actualización:

Cree su contexto pdf como se explica en la documentación, a continuación, sólo tiene que escribir el texto:

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

+1

había leído la documentación, pero no saben por dónde empezar .. –

+1

consulte mi pregunta actualizado –

+1

que no sé que sintieron que sus comentarios son 'grandes comentarios' pero en serio, consulte otras preguntas relacionadas con PDF (hay tantas en StackOverflow en sí) ... no hay una respuesta directa para su pregunta ... – lukya

1

Sé que es demasiado tarde para esta pregunta, sin embargo, me gustaría agregar mi solución.

Estoy usando UIGraphicsBeginPDFContextToFile para generar un archivo PDF. He creado una clase llamada PDFCreator de clase base UIViewController, en el que tengo dos funciones: como este

- (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(); 
} 

que he creado un objeto de esta clase en el archivo de aplicación delegado, ya que retendrá el objeto hasta que la aplicación finalice (como era mi requisito).

Inicialmente, llamo al beginContextWithFile: y creará un archivo pdf en el directorio del documento junto con los datos que estoy agregando a través de una llamada al método createInitialPart.

En algún punto posterior necesito actualizar ese archivo, entonces tengo otro método llamado secondPart aunque lo llamé para que añada más datos a ese archivo.

Una vez que llene he terminado con la creación, tengo que llamar al endContext de la clase , que completará la generación de PDF y sí, tendré el archivo actualizado.

Esto es poco complicado y yo no realiza ninguna comprobación de memoria aunque no tenía el requisito, he encontrado la solución :)

+0

Ver en el ejemplo, llamar a esta función 'beginContextWithFile' hará un archivo PDF para mí pero no lo guardará hasta que no llame al método 'endContext'. Exigiría el requisito donde, estaba llamando 'beginContextWithFile' en una clase, y después de algunas actualizaciones llamo al método' endContext'. – Hemang

1

yo era capaz de hacer esto mediante la creación de una copia del PDF original y modificándolo durante el proceso de construcción.

PD: En mi solución necesité editar la información del documento del nuevo PDF, así que usé el parámetro sujeto para hacer esto.

En 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

Esto debería marcar como la mejor respuesta. Usted acaba de salvar mi vida. ¿Puedo hacerle una pregunta? Uso una vista web para mostrar PDF, cuando el usuario toca una posición en ese pdf, luego crea una marca en esa posición. Sé que puedo usar la función anterior para crear una nueva base de PDF en la plantilla, solo me pregunto cómo puedo obtener el puesto – user3783161

+0

Muchas gracias. He intentado responder su pregunta [AQUÍ] (https://stackoverflow.com/a/45701477/6282606). – Enrique

Cuestiones relacionadas