7

我想在我的 iOS 6 应用程序中生成一个好看的 PDF。

我试过了:

  • UIView 在上下文中渲染
  • 使用 CoreText
  • 使用 NSString drawInRect
  • 使用 UILabel drawRect

这是一个代码示例:

-(CGContextRef) createPDFContext:(CGRect)inMediaBox path:(NSString *) path
{
    CGContextRef myOutContext = NULL;
    NSURL * url;

    url = [NSURL fileURLWithPath:path];
    if (url != NULL) {
        myOutContext = CGPDFContextCreateWithURL ((__bridge CFURLRef) url,
                                                  &inMediaBox,
                                                  NULL);
    }


    return myOutContext;
}

-(void)savePdf:(NSString *)outputPath
{
    if (!pageViews.count)
        return;

    UIView * first = [pageViews objectAtIndex:0];

    CGContextRef pdfContext = [self createPDFContext:CGRectMake(0, 0, first.frame.size.width, first.frame.size.height) path:outputPath];

    for(UIView * v in pageViews)
    {
        CGContextBeginPage (pdfContext,nil);
        CGAffineTransform transform = CGAffineTransformIdentity;
        transform = CGAffineTransformMakeTranslation(0, (int)(v.frame.size.height));
        transform = CGAffineTransformScale(transform, 1, -1);
        CGContextConcatCTM(pdfContext, transform);

        CGContextSetFillColorWithColor(pdfContext, [UIColor whiteColor].CGColor);
        CGContextFillRect(pdfContext, v.frame);

        [v.layer renderInContext:pdfContext];

        CGContextEndPage (pdfContext);
    }

    CGContextRelease (pdfContext);
}

渲染的 UIViews 只包含一个 UIImageView + 一堆 UILabels(一些有边界,一些没有边界)。

我还尝试了在 stackoverflow 上找到的建议:子类化 UILabel 并执行此操作:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    BOOL isPDF = !CGRectIsEmpty(UIGraphicsGetPDFContextBounds());
    if (!layer.shouldRasterize && isPDF)
        [self drawRect:self.bounds]; // draw unrasterized
    else
        [super drawLayer:layer inContext:ctx];
}

但这也没有改变任何东西。

无论我做什么,在预览中打开 PDF 时,文本部分都可以选择为一个块,但不是每个字符的字符,并且缩放 pdf 显示它实际上是一个位图图像。

有什么建议么?

4

3 回答 3

2

Raywenderlich 的这个教程拯救了我的一天。希望它也对你有用。 http://www.raywenderlich.com/6818/how-to-create-a-pdf-with-quartz-2d-in-ios-5-tutorial-part-2

于 2012-11-22T13:50:27.317 回答
1

我去年这样做时的经验是,Apple 没有提供任何库来做这件事。我最终导入了一个开源 C 库 (libHaru)。然后我在我的视图层次结构的每个类中添加了一个输出到它的函数。任何带有子视图的视图都会在其子视图上调用渲染。我的 UILabel、UITextFields、UIImageViews、UISwitches 等会将它们的内容输出为文本或图形,因此我还为某些视图渲染了背景颜色。

这并不是很令人生畏,但是 libHaru 给了我一些字体问题,所以 iirc 我最终只使用了默认字体和字体大小。

于 2012-11-28T22:18:50.613 回答
0

它适用于 UILabels,除了你必须解决一个错误:

在 iPad 上将 UIView 作为矢量呈现为 PDF - 有时呈现为位图,有时呈现为矢量

于 2018-12-19T08:45:45.217 回答