2012-06-04 22 views
14

Soy consciente de tomar la captura de pantalla de UIWebView y convertirla a PDF, pero necesito generar un pdf adecuado (texto como texto y no captura de pantalla). Save2PDF es una aplicación que crea un PDF apropiado. ¿Alguien tiene una idea de cómo lo hacen?Conversión de HTML a PDF en iOS?

+0

quizás esto podría ayudar: http://stackoverflow.com/questions/5443166/how-to-convert-uiview-to-pdf-within-ios – CarlJ

+0

Gracias meccan pero parece ser solo un enfoque de captura de pantalla. Soy consciente de libharu pero también es un proceso largo. – Salil

+7

Es ** psicótico ** que esta pregunta se cerró. * "es probable que esta pregunta solicite debate, argumentos, encuestas o discusiones extensas" * ... ¿cómo se aplica esto aquí? Preguntas como "lo que es mejor, los Stones o los Beatles" o "¡Es mejor Mac o PC!" ... solicite debate, argumento, etc. Esta es una pregunta directa de ingeniería técnica. "Cómo convertir html a pdf, en iOS" ... ¿qué podría ser más claro? Extraño. – Fattie

Respuesta

-1

El punto de esta pregunta era toda texto como texto y no la captura de pantalla

La respuesta siguiente muestra cómo hacer una captura de pantalla de mapa de bits, en un recipiente pdf ...

#import <QuartzCore/CALayer.h> 

- (NSString *)pdfPath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"tmp.pdf"]; 
    return writableDBPath; 
} 

- (NSDictionary *)pdfContextDictionary { 
    NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:@"J. P. Author", kCGPDFContextAuthor, 
        @"My Cool App", kCGPDFContextCreator, 
        @"This is the Output", kCGPDFContextTitle, 
        nil]; 
    return d; 
} 

- (void)printToPDF { 
    NSString *path = [self pdfPath]; 
    UIView *displayView = self.view; 
    CGRect pageRect = displayView.bounds; 
    if (UIGraphicsBeginPDFContextToFile(path, pageRect, [self pdfContextDictionary]) == NO) { 
    return; // error 
    } 
    UIGraphicsBeginPDFPage(); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CALayer *layer = displayView.layer; 
    [layer renderInContext:context]; 
    UIGraphicsEndPDFContext(); 
    NSLog(@"[%@ %@] %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), path); 
} 
+1

Gracias, pero a mí me parece tomar una captura de pantalla de la vista. ¿El texto se representará como texto en lugar de imagen utilizando este método? – Salil

+3

En mi experiencia, '-renderInContext:' solo genera mapas de bits basados ​​en ráster para subcapas cuando se procesa en un contexto PDF, convirtiendo elementos vectoriales como texto en gráficos ráster pixelados. –

+1

¡Gracias a todos por la ayuda! ¡Encontré la solución usando este hilo http://stackoverflow.com/questions/4356436/generating-a-pdf-using-the-new-printing-stuff-in-ios-4-2 que funciona perfecto para mí! Lo siento porque mis búsquedas anteriores no me mostraron ese hilo. – Salil

29

creé una clase basada en cada buen consejo que encontré alrededor. 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 
{ 
    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

Este código funciona bien, pero tengo entendido que las instrucciones '[render setValue: ..]' usan métodos no documentados, y el App Store rechazará este código. – brainjam

+0

No. '-setValue: forKey:' no es parte de una API privada. Lo he estado usando solo en propiedades de solo lectura y Apple aprobó mis aplicaciones. – akashivskyy

+0

hola Tengo un requisito que tengo que cargar un archivo html y ese archivo html tendrá campos de texto, etiquetas, botones de casilla de verificación, etc. Tengo que obtener los datos que el usuario ingresará y luego tengo que convertirlos a PDF con el usuario ingrese datos. –