Получить PDF / PNG как вывод из UIWebView или UIView - PullRequest
16 голосов
/ 16 марта 2010

Есть ли способ получить содержимое UIWebView и преобразовать его в файл PDF или PNG? Я хотел бы получить вывод, аналогичный доступному на Mac, например, нажав кнопку PDF при печати из Safari. Я предполагаю, что это пока невозможно / встроено, но, надеюсь, я удивлюсь и найду способ получить контент из веб-просмотра в файл.

Спасибо! * * 1004

Ответы [ 4 ]

21 голосов
/ 16 марта 2010

Вы можете использовать следующую категорию в 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.

5 голосов
/ 16 марта 2010

Создать изображение из веб-вида просто:

UIImage* image = nil;

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

Получив изображение, вы можете сохранить его в формате PNG.

Создание PDF-файлов также возможно очень похожим способом, но только на еще не выпущенной версии iPhone OS.

0 голосов
/ 03 февраля 2013

Приведенный ниже код преобразует (полное) содержимое 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 или свойство загрузки).

0 голосов
/ 22 июля 2010

@ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...