???? 最近在做一個(gè)房屋租賃項(xiàng)目,其中有用到的h5網(wǎng)頁轉(zhuǎn)PDF、加水印、加二維碼等功能,想把其中代碼拆分出來,總結(jié)一下。
1、服務(wù)端返回的帶css格式的String文本,通過WebView控件自帶功能可以直接加載在客戶端,無需實(shí)現(xiàn)其他特別方法。如下:
NSURL *baseUrl = [[NSBundle mainBundle] bundleURL];?
?[webView loadHTMLString:htmlString baseURL:baseUrl];
解釋一下這個(gè)baseURL,本來可以設(shè)置為nil的,這里之所以要設(shè)值是因?yàn)橹蠹虞d水印我是通過設(shè)置網(wǎng)頁背景達(dá)到要求的。那網(wǎng)頁背景圖我保存在項(xiàng)目圖庫,所以必須把資源這樣引入,不然h5的圖片會(huì)加載不出來。?
2、實(shí)時(shí)轉(zhuǎn)成pdf并上傳服務(wù)端,以下貼以下轉(zhuǎn)pdf的代碼。
#import "UIWebView+ConverToData.h"?? //webview的擴(kuò)展類
static NSInteger pdfPageCount = 0;
@implementation UIWebView (ConverToData)
//將網(wǎng)頁轉(zhuǎn)成PDF格式的Data數(shù)據(jù)
- (NSData *)converToPDF
{
??? UIViewPrintFormatter *fmt = [self viewPrintFormatter];
??? UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init];
??? [render addPrintFormatter:fmt startingAtPageAtIndex:0];
??? CGRect page; //紙張大小
??? page.origin.x = 0;
??? page.origin.y = 0;
??? page.size.width = 600;
??? page.size.height = 768;
???
??? CGRect printable = CGRectInset( page, 50, 50 );? //設(shè)置頁邊距
??? [render setValue:[NSValue valueWithCGRect:page] forKey:@"paperRect"];
??? [render setValue:[NSValue valueWithCGRect:printable] forKey:@"printableRect"];
???
??? NSMutableData * pdfData = [NSMutableData data];
??? UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil );
??? pdfPageCount = [render numberOfPages];
??? //??? LHLog(@"pdfPageNum = %ld",pdfPageCount);
???
??? for (NSInteger i=0; i < [render numberOfPages]; i++)
??? {
??????? UIGraphicsBeginPDFPage();
??????? CGRect bounds = UIGraphicsGetPDFContextBounds();
??????? [render drawPageAtIndex:i inRect:bounds];
???????
??? }
??? UIGraphicsEndPDFContext();
??? return pdfData;
}
//返回PDF的頁數(shù)
- (NSInteger)getPDFPageCount
{
??? return pdfPageCount;
}
3、生成二維碼,插入到PDF文件中,保存到本地。
/**
*? 創(chuàng)建二維碼
*? @param qrKey? 創(chuàng)建二維碼的關(guān)鍵字,掃描出來后的顯示的key
*? @return 二維碼圖片,默認(rèn)大小
*/
- (UIImage *)createQRCodeWithKey:(NSString *)qrKey
{
? ? return [self createQRCodeWithKey:qrKey qrImageSize:100];
}
/**
*? 創(chuàng)建二維碼
*? @param qrKey? 創(chuàng)建二維碼的關(guān)鍵字,掃描出來后的顯示的key
*? @param size? ? 設(shè)置二維碼的寬=高
*? @return 二維碼圖片
*/
- (UIImage *)createQRCodeWithKey:(NSString *)qrKey qrImageSize:(CGFloat)size
{
? ? if (qrKey == nil || qrKey.length == 0) {
? ? ? ? return nil;
? ? }
? ? // 實(shí)例化二維碼濾鏡
? ? CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
? ? // 恢復(fù)濾鏡的默認(rèn)屬性
? ? [filter setDefaults];
? ? // 將字符串轉(zhuǎn)換成NSdata
? ? NSData *data = [qrKey dataUsingEncoding:NSUTF8StringEncoding];
? ? // 通過KVO設(shè)置濾鏡, 傳入data, 將來濾鏡就知道要通過傳入的數(shù)據(jù)生成二維碼
? ? [filter setValue:data forKey:@"inputMessage"];
? ? // 設(shè)置 filter 容錯(cuò)等級(jí)
? ? [filter setValue:@"M" forKey:@"inputCorrectionLevel"];
? ? // 生成二維碼
? ? CIImage *outputImage = [filter outputImage];
? ? UIImage *qrImage = [self createNonInterpolatedUIImageFormCIImage:outputImage withSize:size];
? ? return qrImage;
}
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat)size
{
? ? CGRect extent = CGRectIntegral(image.extent);
? ? CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
? ? // 創(chuàng)建bitmap;
? ? size_t width = CGRectGetWidth(extent) * scale;
? ? size_t height = CGRectGetHeight(extent) * scale;
? ? CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
? ? CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
? ? CIContext *context = [CIContext contextWithOptions:nil];
? ? CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
? ? CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
? ? CGContextScaleCTM(bitmapRef, scale, scale);
? ? CGContextDrawImage(bitmapRef, extent, bitmapImage);
? ? // 保存bitmap到圖片
? ? CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
? ? CGContextRelease(bitmapRef);
? ? CGImageRelease(bitmapImage);
? ? return [UIImage imageWithCGImage:scaledImage];
}
使用Webview進(jìn)行保存到本地:
- (void)savePDFMethodTwo
{
NSData *pdfData = [_webView converToPDF];
NSInteger pageCount = [_webView getPDFPageCount];
UIImage *qrImage = [self createQRCodeWithKey:@"Just test it"];
BOOL result = [self addQRImageToPDFFile:qrImage pdfData:pdfData withTotalPage:pageCount];
//判斷result等于yes則保存成功,否則失敗。
}
4、預(yù)覽PDF,測試掃描效果。
- (void)sharePdf
{
NSString *pdfPath = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp/testFile.pdf"];
??? NSLog(@"pdfPath = %@",pdfPath);
??? BaseWebViewController *baseWebView = [[BaseWebViewController alloc] init];
??? baseWebView.title = @"PDF展示";
??? baseWebView.urlString = pdfPath;
??? [self.navigationController pushViewController:baseWebView animated:YES];
}
最后申明一下,轉(zhuǎn)載請說明。