最近完成一个项目,就是将ScrollView上的内容生成为PDF文件,同时在原视图上忽略一些图片的显示,这里记录一下实现思路。
思路
- 1.保存需要打印的视图的初始Frame和原有父视图。
- 2.设置需要打印的内容宽高(包括左右上下的空白)。
- 3.生成一个背景视图,该视图的宽高为需要打印内容的宽高。
- 4.重新设置Scrollview的Frame和父视图,此时的父视图就是背景视图。
- 5.使用UIGraphics框架进行PDF的生成。
- 6.将ScrollView的Frame和父视图进行恢复,恢复为初始状态。
- 7.对生成的PDF数据进行处理。
Demo 在链接下PDFDemo中
戳此获取Demo
主要代码如下:
-(NSMutableData*)createPDFfromUIScrollView:(UIScrollView*)scrollView {
//存储ScrollView的初始位置及父视图
CGRect origRect = scrollView.frame;
UIView *origSuperView = scrollView.superview;
//此处可以做一些子视图的处理,比如忽略ScrollView上一些图片的打印,需要将该图片视图进行适时的隐藏
//创建一个新的用来显示的pdf的大小,这里为内容上下各预留了20的偏移
CGRect rootRect = CGRectMake(0, 0, 595, scrollView.contentSize.height + 40);
//重新计算scrollview的frame,新frame处于背景的中间,同时,为了能打印所有内容,将size设置为contentsize
CGRect newScrollRect = CGRectMake((595 - scrollView.contentSize.width) / 2., 20, scrollView.contentSize.width, scrollView.contentSize.height);
//重新为scrollview设置frame,并从原父视图移除
[scrollView removeFromSuperview];
scrollView.frame = newScrollRect;
//设置背景图,这里的背景图宽度为A4的宽度595
UIView *rootView = [[UIView alloc] initWithFrame:rootRect];
rootView.backgroundColor = [UIColor whiteColor];
//将需要打印的内容放置在新的背景图上
[rootView addSubview:scrollView];
//声明存储打印数据的数据结构
NSMutableData *pdfData = [NSMutableData data];
//设置要打印出来的文件的宽高
UIGraphicsBeginPDFContextToData(pdfData, rootRect, nil);
//开始打印
UIGraphicsBeginPDFPage();
CGContextRef pdfContext = UIGraphicsGetCurrentContext();
[rootView.layer renderInContext:pdfContext];
//结束打印
UIGraphicsEndPDFContext();
//将scrollview的frame与父视图设置为初始状态
scrollView.frame = origRect;
[origSuperView addSubview:scrollView];
//此处对可以进行对子视图的恢复,比如说图片视图的恢复显示
//输出打印数据,根据需要进行数据的存储或传输
return pdfData;
}