2010-03-16 16 views
16

Esiste un modo per ottenere il contenuto di un UIWebView e convertirlo in un file PDF o PNG? Mi piacerebbe ottenere un output simile a quello disponibile sul Mac selezionando il pulsante PDF quando si stampa da Safari, ad esempio. Presumo che questo non sia possibile/integrato, ma spero di essere sorpreso e di trovare un modo per ottenere il contenuto da una webview in un file.Ottieni un PDF/PNG come output da UIWebView o UIView

Grazie!

risposta

21

È possibile utilizzare la categoria sulla UIView per creare un file PDF:

#import <QuartzCore/QuartzCore.h> 

@implementation UIView(PDFWritingAdditions) 

- (void)renderInPDFFile:(NSString*)path 
{ 
    CGRect mediaBox = self.bounds; 
    CGContextRef ctx = CGPDFContextCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path], &mediaBox, NULL); 

    CGPDFContextBeginPage(ctx, NULL); 
    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -mediaBox.size.height); 
    [self.layer renderInContext:ctx]; 
    CGPDFContextEndPage(ctx); 
    CFRelease(ctx); 
} 

@end 

Cattive notizie: UIWebView non crea forme belle e il testo in PDF, ma si rende come immagine nel PDF.

+0

Grazie per il post. Tuttavia, sto riscontrando un problema in cui CGPDFContextCreateWithURL non crea correttamente il contesto. Ho provato diversi URL e non sembra cambiare nulla. Qualche idea? – mjdth

+0

Si è verificato un errore nel modo in cui è stato creato CFURLRef. Ho risolto il problema e dovrebbe funzionare ora per gli URL dei file corretti. –

+0

Rendering UILabels con questo metodo sembra rasterizzare il testo. Se vuoi che il tuo testo rimanga vettorizzato, disegnali direttamente nel livello come descritto qui http://stackoverflow.com/questions/2209734/add-text-to-calayer –

5

Creazione di un immagine da una vista web è semplice:

UIImage* image = nil; 

UIGraphicsBeginImageContext(offscreenWebView_.frame.size); 
{ 
    [offscreenWebView_.layer renderInContext: UIGraphicsGetCurrentContext()]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 
} 
UIGraphicsEndImageContext(); 

Una volta che avete l'immagine che si può salvarlo come PNG.

Creare PDF è anche possibile in un modo molto simile, ma solo su una versione di iPhone OS non ancora rilasciata.

+0

Penso che l'API CGPDF ... esistesse a partire da iPhone OS 2.0. –

+0

Sì, ma pensavo che il rendering di un livello in un contesto PDF fosse qualcosa di nuovo. –

+0

Anche questa risposta funziona quasi. Il problema è la dimensione della pagina cambia tra le pagine. C'è un modo per determinare la dimensione del contenuto nella visualizzazione Web in modo che io possa creare un contesto di dimensioni corrette? – mjdth

0

@mjdth, prova fileURLWithPath:isDirectory: invece. URLWithString non funzionava neanche per me.

@implementation UIView(PDFWritingAdditions) 

- (void)renderInPDFFile:(NSString*)path 
{ 
    CGRect mediaBox = self.bounds; 
    CGContextRef ctx = CGPDFContextCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path isDirectory:NO], &mediaBox, NULL); 

    CGPDFContextBeginPage(ctx, NULL); 
    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -mediaBox.size.height); 
    [self.layer renderInContext:ctx]; 
    CGPDFContextEndPage(ctx); 
    CFRelease(ctx); 
} 

@end 
0

Il codice seguente convertirà il contenuto (completo) di un UIWebView in un UIImage.

Dopo aver reso UIImage lo scrivo su disco come PNG per vedere il risultato.
Ovviamente si può fare con UIImage qualunque cosa ti piaccia.

UIImage *image = nil; 
CGRect oldFrame = webView.frame; 

// Resize the UIWebView, contentSize could be > visible size 
[webView sizeToFit]; 
CGSize fullSize = webView.scrollView.contentSize; 

// Render the layer content onto the image 
UIGraphicsBeginImageContext(fullSize); 
CGContextRef resizedContext = UIGraphicsGetCurrentContext(); 
[webView.layer renderInContext:resizedContext]; 
image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

// Revert the UIWebView back to its old size 
webView.frame = oldFrame; 

// Write the UIImage to disk as PNG so that we can see the result 
NSString *path= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.png"]; 
[UIImagePNGRepresentation(image) writeToFile:path atomically:YES]; 

Nota: assicurarsi che UIWebView sia completamente caricato (UIWebViewDelegate o caricamento della proprietà).

Problemi correlati