1

您可以调用renderInContext图层。有类似的东西UIPrintPageRenderer吗?我基本上想UIImage从 PDF 文档的第一页创建一个UIPrintPageRenderer. 除了上下文部分的实际渲染之外,我还有其余的代码。

编辑:我在这里误解了一些基本的基本概念吗?如果是这样,请随时给我一个快速的教训。

4

1 回答 1

1

在这篇文章中从 Vel Genov 那里获取我的大部分信息,这是你应该做的:

下面的示例代码添加了一个类别UIPrintPageRenderer来创建实际的 PDF 数据。

@interface UIPrintPageRenderer (PDF)
- (NSData*) createPDF;
@end

@implementation UIPrintPageRenderer (PDF)
- (NSData*) createPDF
{
    NSMutableData *pdfData = [NSMutableData data];
    UIGraphicsBeginPDFContextToData( pdfData, self.paperRect, nil );
    [self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)];
    CGRect bounds = UIGraphicsGetPDFContextBounds();
    for ( int i = 0 ; i < self.numberOfPages ; i++ )
    {
        UIGraphicsBeginPDFPage();
        [self drawPageAtIndex: i inRect: bounds];
    }
    UIGraphicsEndPDFContext();
    return pdfData;
}
@end

然后,这进入webViewDidFinishLoad()

- (void)webViewDidFinishLoad:(UIWebView *)webViewIn {
    NSLog(@"web view did finish loading");

    // webViewDidFinishLoad() could get called multiple times before
    // the page is 100% loaded. That's why we check if the page is still loading
    if (webViewIn.isLoading)
        return;

    UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init];
    [render addPrintFormatter:webViewIn.viewPrintFormatter startingAtPageAtIndex:0];

    // Padding is desirable, but optional
    float padding = 10.0f;

    // Define the printableRect and paperRect
    // If the printableRect defines the printable area of the page
    CGRect paperRect = CGRectMake(0, 0, PDFSize.width, PDFSize.height);
    CGRect printableRect = CGRectMake(padding, padding, PDFSize.width-(padding * 2), PDFSize.height-(padding * 2));

    [render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"];
    [render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"];

    // Call the printToPDF helper method that will do the actual PDF creation using values set above
    NSData *pdfData = [render createPDF];

    // Save the PDF to a file, if creating one is successful
    if (pdfData) {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *path = [paths objectAtIndex:0];

        NSString *pdfPath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"Purchase Order.pdf"]];

        [pdfData writeToFile:pdfPath atomically:YES];
    }
    else
    {
        NSLog(@"error creating PDF");
    }
}

PDFSize 定义为常数,设置为标准 A4 页面大小。可以对其进行编辑以满足您的需求。

#define PDFSize CGSizeMake(595.2,841.8)

以下是 Val 对代码的评价:

当调用 webViewDidFinishLoad() 时,视图可能不会 100% 加载。检查视图是否仍在加载是必要的。这很重要,因为它可能是您的问题的根源。如果不是,那我们就可以走了。这里有一个非常重要的说明。一些网页是动态加载的(在页面本身中定义)。以 youtube.com 为例。该页面几乎立即显示,带有“加载”屏幕。这将欺骗我们的 web 视图,并且它的“isLoading”属性将设置为“false”,而网页仍在动态加载内容。虽然这是一个非常罕见的情况,在一般情况下,这个解决方案会很好地工作。如果您需要从这样的动态加载网页生成 PDF 文件,您可能需要将实际生成移动到不同的位置。

另一个关键方面是设置 printableRect 和 pageRect。请注意,这些是单独设置的。如果 printableRect 小于 paperRect ,您最终会在内容周围添加一些填充 - 例如,请参见代码。这是Apple 的 API 文档的链接,其中包含两者的简短描述。

于 2015-09-21T21:50:56.500 回答