【问题标题】:iOS: Create PDF from UIViewiOS:从 UIView 创建 PDF
【发布时间】:2011-11-22 12:36:43
【问题描述】:

我正在尝试从UIView 创建一个 PDF,其中可能包含图像、标签等。 我检查了参考资料 (GeneratingPDF),并且我还知道 renderInContext: 方法,该方法可用于将 UIView 的内容绘制到 PDF 上下文中。

我使用renderInContext: 创建了一个 PDF。然而,图像和文字失去了保真度。即图像无法单独选择,并且无法在生成的 PDF 中选择/复制文本等。它与从UIView 的快照创建的 PDF 一样好/坏。

我的问题是,我是否必须单独绘制文本和图像才能达到我想要的效果(使用CGContextShowTextAtPointCGContextDrawImage)?

如果是,那么我该如何扫描UIView 以获取文本和图像?假设我收到了来自外部的 UIView 并且我不知道它的内容。

【问题讨论】:

    标签: iphone objective-c ios pdf uiview


    【解决方案1】:

    我只是走我的视图层次结构,并调用 -drawRect: 我自己有一定的运气。在每个视图之前都有一些设置,比如翻译 ctm 和清除文本矩阵,但是当你为每个视图完成这些之后,你可以这样做:

    UIGraphicsPushContext(ctx);
    [self drawRect:self.frame];
    UIGraphicsPopContext();
    

    它生成的 PDF 是基于矢量的 - 不仅仅是平面位图,因此它可以很好地缩放,您可以在查看器/浏览器中选择文本。这仅适用于普通的自定义绘图和非常简单的东西,如 UILabels。我怀疑它是否适用于更复杂的 UIKit 对象(我正在考虑表格视图和滚动视图)。此外,您还需要为 UIImageViews 做额外的工作(我猜想用 CGImageRef 设置图层的内容属性),如果您还有其他基于图层的属性和转换 - 更多的工作。

    希望 Apple 能给我们提供比维护并行绘制代码更好的解决方案!

    【讨论】:

    【解决方案2】:

    您确实必须使用CGContextShowTextAtPoint 之类的函数将文本/图像单独绘制到CGContextRef(查看CGPDFContextCreateWithURL)中。虽然理论上您可以扫描 UIView 中的图像/标签,但最好从头开始绘制布局。您必须通过某种方式知道 UIView 中应该包含哪些元素。虽然代码会有很大不同,但从逻辑上讲,您应该以与以编程方式绘制 UIView 而不是从 nib 加载它的方式相同的方式处理它。

    如果你真的想扫描你的 UIView,你可以这样做:

    for(UIView *subview in parentView.subviews) {
     if([subview isKindOfClass:[UIImageView class]]) {
      ...
     } else if([subview isKindOfClass:[UITextView class]]) {
      ...
     } else if([subview isKindOfClass:[UILabel class]]) {
      ...
     }
    }
    

    【讨论】:

    • 谢谢迈克尔!那么,您确定在这种情况下不能使用renderInContext: 吗?我正在考虑UIView 具有精美的多色背景或其他东西的场景,这可能很难绘制。
    • 是的,我确定。实际上我不久前遇到了这个问题,我的逻辑正是从你的逻辑开始的(renderInContext :) 然后我尝试搜索一些代码来将 UIView 绘制到 PDF 中,最后真正做到这一点的唯一方法是使用 CGContext 方法并从头开始绘制 CGContextRef 中的所有内容。
    • 再次感谢迈克尔!那么,如果 UIView 有带渐变的背景,你怎么画呢?此外,我的实际用例是从 UIWebView 创建一个 PDF,我用它来显示一个文件(比如 ppt 或 doc),我发现文本和图像不作为子视图存在(没有 UILabel 或 UITextViews)。你也试过这个吗?很抱歉最初没有指定。
    • 所以您真的想将 ppt 或 doc 转换为 PDF?那是一个完全不同的故事。我不确定要为您指明什么方向。据我所知,在 iOS 中没有构建方便的库来执行此操作。连接到 Web 服务以允许服务器为您进行转换可能是最简单的,但我不知道这是否符合您的需求。祝你好运!
    • 嗨,Michael 是否可以从 opengles 视图生成 PDF。请让我知道它是否可行,以便我可以继续。提前致谢。
    【解决方案3】:

    试试,

    {
       //read the pdf file
    
         CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(),     CFSTR("iPhoneAppProgrammingGuide.pdf"), NULL, NULL);
            PDFfile = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
            CFRelease(pdfURL)
    
        CGPDFPageRef page = CGPDFDocumentGetPage(PDFfile,currentpage);
    
        context = UIGraphicsGetCurrentContext();
        CGContextSaveGState(context);
        CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
        CGContextFillRect(context,self.bounds);   
        CGContextTranslateCTM(context, -1.0, [self bounds].size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(page,  kCGPDFArtBox, [self bounds], 0, true));
        CGContextDrawPDFPage(context, page);    
        CGContextRestoreGState(context);
        //CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox),
                                                    CGContextGetClipBoundingBox(context));
    
          // CGContextConcatCTM(context, transform);
             UIGraphicsBeginImageContext(CGSizeMake(self.bounds.size.width, self.bounds.size.height));
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 2012-10-02
      • 1970-01-01
      • 2015-08-08
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多