[iOS]将ScrollView上的内容生成为PDF文件

最近完成一个项目,就是将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;
}

你可能感兴趣的:([iOS]将ScrollView上的内容生成为PDF文件)