最近在做一个房屋租赁项目,其中有用到的h5网页转PDF、加水印、加二维码等功能,想把其中代码拆分出来,总结一下。
1、服务端返回的带css格式的String文本,通过WebView控件自带功能可以直接加载在客户端,无需实现其他特别方法。如下:
NSURL *baseUrl = [[NSBundle mainBundle] bundleURL];
[webView loadHTMLString:htmlString baseURL:baseUrl];
解释一下这个baseURL,本来可以设置为nil的,这里之所以要设值是因为之后加载水印我是通过设置网页背景达到要求的。那网页背景图我保存在项目图库,所以必须把资源这样引入,不然h5的图片会加载不出来。
服务端返回的htmlString需要在头部追加一下水印背景的css代码2、实时转成pdf并上传服务端,以下贴以下转pdf的代码。
#import "UIWebView+ConverToData.h" //webview的扩展类
static NSInteger pdfPageCount = 0;
@implementation UIWebView (ConverToData)
//将网页转成PDF格式的Data数据
- (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 ); //设置页边距
[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的页数
- (NSInteger)getPDFPageCount
{
return pdfPageCount;
}
3、生成二维码,插入到PDF文件中,保存到本地。
/**
* 创建二维码
* @param qrKey 创建二维码的关键字,扫描出来后的显示的key
* @return 二维码图片,默认大小
*/
- (UIImage *)createQRCodeWithKey:(NSString *)qrKey
{
return [self createQRCodeWithKey:qrKey qrImageSize:100];
}
/**
* 创建二维码
* @param qrKey 创建二维码的关键字,扫描出来后的显示的key
* @param size 设置二维码的宽=高
* @return 二维码图片
*/
- (UIImage *)createQRCodeWithKey:(NSString *)qrKey qrImageSize:(CGFloat)size
{
if (qrKey == nil || qrKey.length == 0) {
return nil;
}
// 实例化二维码滤镜
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 恢复滤镜的默认属性
[filter setDefaults];
// 将字符串转换成NSdata
NSData *data = [qrKey dataUsingEncoding:NSUTF8StringEncoding];
// 通过KVO设置滤镜, 传入data, 将来滤镜就知道要通过传入的数据生成二维码
[filter setValue:data forKey:@"inputMessage"];
// 设置 filter 容错等级
[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));
// 创建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进行保存到本地:
- (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、预览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];
}
最后申明一下,转载请说明。
合同PDF展示,包括水印和二维码
网友评论