iOS:从UIView创buildPDF

我试图从一个UIView可能包含图像,标签等创buildPDF我已经检查了参考( GeneratingPDF ),我也意识到renderInContext:方法,它可以用来绘制UIView的内容到PDF上下文。

我使用renderInContext:创build一个PDF。 然而,图像和文字失去了忠诚。 即,图像不能单独select,文本不能被选中/复制等,在所产生的PDF。 这与从UIView的快照创build的PDF一样好/坏。

我的问题是,我必须单独绘制文本和图像来实现我想要的(使用CGContextShowTextAtPointCGContextDrawImage )?

如果是的话,我该如何去扫描UIView文本和图像? 假设我从外部接收UIView不知道它的内容。

您确实必须使用像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]]) { ... } } 

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

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

它生成的PDF是基于vector的 – 不只是一个平面位图,所以它可以很好地缩放,你可以select查看器/浏览器中的文本。 这只适用于简单的香草自定义绘图和非常简单的东西,如UILabels。 我怀疑它会用更复杂的UIKit对象(我在考虑表视图和滚动视图)。 此外,你需要额外的工作UIImageViews(我猜设置图层的内容属性与CGImageRef),如果你有其他基于层的属性和转换 – 甚至更多的工作。

希望苹果公司给我们一个更好的解决scheme比保持并行绘制代码!

尝试,

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