iOS:从UIView创建PDF

时间:2011-09-22 05:38:38

标签: iphone objective-c ios pdf uiview

我正在尝试从UIView创建PDF,其中可能包含图片,标签等。 我已检查了引用(GeneratingPDF),并且我也了解renderInContext:方法,该方法可用于将UIView的内容绘制到PDF上下文中。

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

我的问题是,我是否必须绘制文字和单独拍摄图像以实现我想要的效果(使用CGContextShowTextAtPoint& CGContextDrawImage)?

如果是,那么我该如何扫描UIView以查找文本&图片?假设我从外部收到UIView&我不知道它的内容。

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

您确实必须使用CGContextRef等功能将文本/图像单独绘制到CGPDFContextCreateWithURL(查看CGContextShowTextAtPoint)。虽然理论上您可以扫描UIView的图像/标签,但如果您只是从头开始绘制布局会更好。您必须有一些方法来了解UIView中应该包含哪些元素。虽然代码会有很大差异,但从逻辑上讲,你应该以与编程方式绘制UIView而不是从笔尖加载它的方式相同的方式处理它。

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

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

答案 2 :(得分:0)

试,

{
   //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));


}