从UIWebView或UIView获取PDF / PNG作为输出

时间:2010-03-16 12:38:33

标签: iphone objective-c cocoa-touch pdf png

有没有办法获取UIWebView的内容并将其转换为PDF或PNG文件?例如,我希望通过从Safari打印时选择PDF按钮获得与Mac上可用的输出类似的输出。我认为这是不可能/内置的,但希望我会惊讶并找到一种方法将内容从webview获取到文件。

谢谢!

4 个答案:

答案 0 :(得分:21)

您可以在UIView上使用以下类别来创建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

坏消息:UIWebView不会在PDF中创建漂亮的形状和文本,而是将自身呈现为PDF中的图像。

答案 1 :(得分:5)

从Web视图创建图像很简单:

UIImage* image = nil;

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

获得图像后,您可以将其另存为PNG。

以非常类似的方式创建PDF也是可能的,但仅限于尚未发布的iPhone OS版本。

答案 2 :(得分:0)

@mjdth,请尝试fileURLWithPath:isDirectory:URLWithString也不适合我。

@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

答案 3 :(得分:0)

下面的代码会将UIWebView的(完整)内容转换为UIImage。

渲染UIImage后,我将其作为PNG写入磁盘以查看结果 当然,无论你喜欢什么,你都可以使用UIImage。

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

注意:确保UIWebView已完全加载(UIWebViewDelegate或加载属性)。