2011-09-22 78 views
3

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

我用renderInContext:创建PDF。然而,图像和文字失去了忠诚度。即图像不能单独选择&在结果PDF中不能选择/复制文本等。它与从UIView的快照创建的PDF一样好/坏。

我的问题是,我必须绘制文本&图像分别以达到我想要的(使用CGContextShowTextAtPoint & CGContextDrawImage)?

如果是,那么我该如何去扫描UIView的文字&图片?假设我从&以外收到UIView,但不知道其内容。

回答

1

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

感谢迈克尔!那么,你确定在这种情况下不能使用'renderInContext:'吗?我正在考虑“UIView”有多彩的背景或其他东西,这很难画出来。 – Akshay

+0

是的,我确定。实际上,我在不久之前经历了这个问题,并且我的逻辑开始完全在你的位置(renderInContext :),然后我尝试搜索一些代码以将UIView绘制到PDF中,最后真正做到这一点的唯一方法是使用CGContext方法并从头开始绘制CGContextRef中的所有内容。 –

+0

再次感谢迈克尔!那么,如果UIView具有渐变背景,您如何绘制?另外,我的实际使用案例是从'UIWebView'创建一个PDF,用于显示一个文件(比如ppt或doc),为此我发现文本和图像不是子视图(没有UILabels或UITextViews)。你也试过这个吗?对不起,最初没有指定。 – Akshay

2

我有运气适量的只是走我的视图层次,并呼吁-drawRect:我自己。有一个位的设置,你已经在不知不觉中成为前做的,像翻译CTM和清除文本矩阵,但是当你这样做的每个视图,你可以这样做:

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

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

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

+0

此UIView类别运作良好 - 我相信它使用您的策略:https://github.com/mruegenberg/uiview-hierarchical-drawing。有一点需要记住的是,如果您使用CALayers,则需要添加代码以明确写入上下文。看到这个答案:http://stackoverflow.com/questions/13783971/maintain-vector-graphics-when-rendering-calayer-into-pdf-output – jeffmax

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


}