Ottieni un PDF / PNG come output da UIWebView o UIView

C’è 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 ansible / integrato, ma spero di essere sorpreso e di trovare un modo per ottenere il contenuto da una webview in un file.

Grazie!

È ansible utilizzare la seguente categoria su UIView per creare un file PDF:

 #import  @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 belle forms e testi nel PDF, ma si presenta come immagine nel PDF.

La creazione di un’immagine da una visualizzazione Web è semplice:

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

Una volta ottenuta l’immagine, è ansible salvarla come PNG.

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

@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 

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

Dopo aver reso UIImage, lo scrivo sul disco come PNG per vedere il risultato.
Certo che potresti 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à).