我正在尝试从UIView
创建PDF,其中可能包含图片,标签等。
我已检查了引用(GeneratingPDF),并且我也了解renderInContext:
方法,该方法可用于将UIView
的内容绘制到PDF上下文中。
我使用renderInContext:
创建了一个PDF。然而,图像和文字失去了它们的忠诚度。即图像不能单独选择和放大。在生成的PDF中无法选择/复制文本等。它与从UIView
的快照创建的PDF一样好/坏。
我的问题是,我是否必须绘制文字和单独拍摄图像以实现我想要的效果(使用CGContextShowTextAtPoint
& CGContextDrawImage
)?
如果是,那么我该如何扫描UIView
以查找文本&图片?假设我从外部收到UIView
&我不知道它的内容。
答案 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));
}