2010-03-16 26 views
16

Có cách nào để lấy nội dung của UIWebView và chuyển đổi nó thành tệp PDF hoặc PNG không? Tôi muốn có được kết quả tương tự như vậy trên Mac bằng cách chọn nút PDF khi in từ Safari chẳng hạn. Tôi giả định rằng điều này là không thể/xây dựng được nêu ra, nhưng hy vọng tôi sẽ ngạc nhiên và tìm cách để có được nội dung từ một webview vào một tập tin.Nhận PDF/PNG dưới dạng đầu ra từ một UIWebView hoặc UIView

Cảm ơn!

Trả lời

21

Bạn có thể sử dụng các loại sau đây trên UIView để tạo ra một tập tin 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 

Tin xấu: UIWebView không tạo ra hình dạng đẹp và văn bản trong PDF, nhưng làm cho chính nó như là một hình ảnh vào PDF.

+0

Cảm ơn bài đăng. Tôi nhận được một vấn đề mặc dù CGPDFContextCreateWithURL không chính xác tạo ngữ cảnh. Tôi đã thử một số url khác nhau và nó dường như không thay đổi bất cứ điều gì. Bất kỳ ý tưởng? – mjdth

+0

Đã xảy ra lỗi trong cách tạo CFURLRef. Tôi đã sửa nó và nó sẽ hoạt động ngay bây giờ cho các URL tập tin thích hợp. –

+0

Hiển thị UILabels với phương pháp này dường như rasterize văn bản. Nếu bạn muốn văn bản của mình vẫn được vector hóa, hãy vẽ chúng trực tiếp vào lớp như được mô tả ở đây http://stackoverflow.com/questions/2209734/add-text-to-calayer –

5

Tạo một hình ảnh từ một cái nhìn web rất đơn giản:

UIImage* image = nil; 

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

Một khi bạn có hình ảnh bạn có thể lưu nó như là một PNG.

Tạo PDF cũng có thể theo cách tương tự, nhưng chỉ trên phiên bản hệ điều hành iPhone chưa được phát hành.

+0

Tôi nghĩ rằng API CGPDF ... đã tồn tại từ iPhone OS 2.0. –

+0

Vâng, nhưng tôi nghĩ rằng rendering một lớp vào một bối cảnh PDF là một cái gì đó mới. –

+0

Câu trả lời này hầu như cũng hoạt động. Vấn đề là kích thước của trang thay đổi giữa các trang. Có cách nào để xác định kích thước của nội dung trong chế độ xem web để tôi có thể tạo ngữ cảnh có kích thước chính xác không? – mjdth

0

@mjdth, hãy thử fileURLWithPath:isDirectory: thay thế. URLWithString cũng không hoạt động đối với tôi.

@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

Mã bên dưới sẽ chuyển nội dung (đầy đủ) của UIWebView thành UIImage.

Sau khi hiển thị UIImage, tôi ghi nó vào đĩa dưới dạng PNG để xem kết quả.
Tất nhiên bạn có thể làm với UIImage bất cứ điều gì bạn thích.

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]; 

Lưu ý: đảm bảo UIWebView được tải đầy đủ (UIWebViewDelegate hoặc tải thuộc tính).

Các vấn đề liên quan