最近完成一個項目聘惦,就是將ScrollView上的內容生成為PDF文件痹束,同時在原視圖上忽略一些圖片的顯示痢掠,這里記錄一下實現(xiàn)思路。
思路
- 1.保存需要打印的視圖的初始Frame和原有父視圖匹厘。
- 2.設置需要打印的內容寬高(包括左右上下的空白)。
- 3.生成一個背景視圖脐区,該視圖的寬高為需要打印內容的寬高愈诚。
- 4.重新設置Scrollview的Frame和父視圖,此時的父視圖就是背景視圖。
- 5.使用UIGraphics框架進行PDF的生成炕柔。
- 6.將ScrollView的Frame和父視圖進行恢復酌泰,恢復為初始狀態(tài)。
- 7.對生成的PDF數(shù)據(jù)進行處理匕累。
Demo 在鏈接下PDFDemo中
戳此獲取Demo
主要代碼如下:
-(NSMutableData*)createPDFfromUIScrollView:(UIScrollView*)scrollView {
//存儲ScrollView的初始位置及父視圖
CGRect origRect = scrollView.frame;
UIView *origSuperView = scrollView.superview;
//此處可以做一些子視圖的處理陵刹,比如忽略ScrollView上一些圖片的打印,需要將該圖片視圖進行適時的隱藏
//創(chuàng)建一個新的用來顯示的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];
//聲明存儲打印數(shù)據(jù)的數(shù)據(jù)結構
NSMutableData *pdfData = [NSMutableData data];
//設置要打印出來的文件的寬高
UIGraphicsBeginPDFContextToData(pdfData, rootRect, nil);
//開始打印
UIGraphicsBeginPDFPage();
CGContextRef pdfContext = UIGraphicsGetCurrentContext();
[rootView.layer renderInContext:pdfContext];
//結束打印
UIGraphicsEndPDFContext();
//將scrollview的frame與父視圖設置為初始狀態(tài)
scrollView.frame = origRect;
[origSuperView addSubview:scrollView];
//此處對可以進行對子視圖的恢復辛辨,比如說圖片視圖的恢復顯示
//輸出打印數(shù)據(jù),根據(jù)需要進行數(shù)據(jù)的存儲或傳輸
return pdfData;
}