2012-04-12 18 views
8

Tengo una página html larga y quería convertirla en un archivo PDF de varias páginas.iOS - Creación de PDF de varias páginas a partir de contenido HTML

He seguido las instrucciones provistas en apple y here - how to make multi page PDF para un contenido de cadena dado.

Pero el formato del NSString (con algunos datos similares) es difícil que crear una página html. He creado este html y lo visualizo en UIWebView.

Ahora quiero crear un PDF a partir de este HTML en un Multi página archivo PDF.

El código que estoy usando puede crear un único PDF.

 
- (void)createPDFfromUIView:(UIWebView *)aView saveToDocumentsWithFileName:(NSString*)aFilename 
{ 
    // Creates a mutable data object for updating with binary data, like a byte array 
    NSMutableData *pdfData = [NSMutableData data]; 

    // Points the pdf converter to the mutable data object and to the UIView to be converted 
    UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil); 
    UIGraphicsBeginPDFPage(); 
    CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 


    // draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData 

    [aView.layer renderInContext:pdfContext]; 

    // remove PDF rendering context 
    UIGraphicsEndPDFContext(); 

    // Retrieves the document directories from the iOS device 
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

    NSString* documentDirectory = [documentDirectories objectAtIndex:0]; 
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename]; 

    // instructs the mutable data object to write its context to a file on disk 
    [pdfData writeToFile:documentDirectoryFilename atomically:YES]; 
    NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename); 
} 

¿Alguien puede ayudar?

Respuesta

14

Creé una clase basada en cada buen consejo que encontré. He estado cavando mucho y espero que mi clase ofrezca un buen comienzo para cualquiera que intente crear un PDF de varias páginas directamente de alguna fuente HTML.

Encontrará todo el código aquí con algunos ejemplos de código básica: https://github.com/iclems/iOS-htmltopdf

que tenía justo el mismo problema que usted y mis requisitos eran: - PDF completo (texto real, sin mapa de bits) - inteligente varias páginas (en comparación con cortar una vista web de altura completa cada X píxeles ...)

Por lo tanto, la solución que uso es bastante buena ya que recurre a las mismas herramientas que usa iOS para dividir páginas para impresión.

Me explico, tengo que instalar un UIPrintPageRenderer basado en el formateador vista web de impresión (primer consejo):

UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init]; 

[render addPrintFormatter:webView.viewPrintFormatter startingAtPageAtIndex:0]; 

CGRect printableRect = CGRectMake(self.pageMargins.left, 
           self.pageMargins.top, 
           self.pageSize.width - self.pageMargins.left - self.pageMargins.right, 
           self.pageSize.height - self.pageMargins.top - self.pageMargins.bottom); 

CGRect paperRect = CGRectMake(0, 0, self.pageSize.width, self.pageSize.height); 

[render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"]; 
[render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"]; 

NSData *pdfData = [render printToPDF]; 

[pdfData writeToFile: self.PDFpath atomically: YES]; 

Mientras tanto, he creado una categoría en UIPrintPageRenderer para apoyar:

-(NSData*) printToPDF 
{ 
    [self doNotRasterizeSubviews:self.view]; 

    NSMutableData *pdfData = [NSMutableData data]; 

    UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil); 

    [self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)]; 

    CGRect bounds = UIGraphicsGetPDFContextBounds(); 

    for (int i = 0 ; i < self.numberOfPages ; i++) 
    { 
     UIGraphicsBeginPDFPage(); 

     [self drawPageAtIndex: i inRect: bounds]; 
    } 

    UIGraphicsEndPDFContext(); 

    return pdfData; 
} 
+0

Wehrung eres el hombre. Acabo de echar un vistazo a la aplicación de muestra y es todo lo que estaba buscando. Pero mi requisito se modificó e hizo algo más. Pero esto es asombroso. Podría usar esto en el futuro. Gracias por el esfuerzo y especialmente por explicar cosas. – Viraj

+0

El problema con este marco es que no capturará ningún dato en ningún cuadro de texto, por ejemplo. Todos estarán en blanco. – GuybrushThreepwood

+0

Funciona genial! Hombre maravilloso !!! – Rudi

Cuestiones relacionadas