總結(jié)一下關(guān)于ios生成pdf,加水印和二維碼

???? 最近在做一個(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ì)加載不出來。?

服務(wù)端返回的htmlString需要在頭部追加一下水印背景的css代碼

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,測(cè)試掃描效果。

- (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)載請(qǐng)說明。


合同PDF展示,包括水印和二維碼
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容