iOS:来自多个UIViews的单页PDF

时间:2014-01-13 22:51:05

标签: ios pdf uiview calayer uigraphicscontext

我编写了这段代码片段,它接受了一系列UIViews并将它们呈现为PDF。但是,每个视图都被渲染到一个单独的页面中,因为我无法弄清楚如何合并PDF页面或将所有视图渲染到单个页面中。

当前代码:

+ (NSData*)pdfFromViews:(NSArray*)views
{
    NSMutableData* pdf = [NSMutableData data];

    UIGraphicsBeginPDFContextToData(pdf, CGRectZero, nil);
    CGContextRef context = UIGraphicsGetCurrentContext();

    for(UIView* view in views)
    {
        UIGraphicsBeginPDFPageWithInfo(view.bounds, nil);
        [view.layer renderInContext:context];
    }

    UIGraphicsEndPDFContext();

    return pdf;
}

如果我只调用此行一次 - UIGraphicsBeginPDFPage() - 无论我对view.layer.frame所做的更改或我用于上下文的CGRect的大小如何,视图都会相互叠加。< / p>

我对当前的图像质量感到满意,不需要在PDF中添加任何链接或文本。

我正在寻找一种方法来合并我生成的PDF页面,或者将我的视图绘制到单个页面中。注意:我无法将我的视图作为子视图添加到公共父视图中,因为它会弄乱我的应用程序布局。理想情况下,我会这样做,但UIViews无法复制。

1 个答案:

答案 0 :(得分:2)

使用CGContextTranslateCTM

在渲染之间移动原点
+ (NSData*)pdfFromViews:(NSArray*)views {
    NSMutableData* pdf = [NSMutableData data];
    UIGraphicsBeginPDFContextToData(pdf, CGRectZero, nil);
    UIGraphicsBeginPDFPage();
    CGContextRef context = UIGraphicsGetCurrentContext();

    for(UIView *view in views) {
        [view.layer renderInContext:context];
        CGContextTranslateCTM(context, 0, view.bounds.size.height);
    }

    UIGraphicsEndPDFContext();
    return pdf;
}

您可能还想指定适合您观看次数的页面大小。计算尺寸并致电UIGraphicsBeginPDFPageWithInfo而不是UIGraphicsBeginPDFPage