一、公司项目使用到电子合同,用的是加载pdf,合同就需要签字和盖章,开始用的是WKWebView加载,后来发现iOS11及以下版本用WKWebView时不显示电子签名和签章,那iOS11及以下版本就需要特殊处理,这里用的是UIWebView 加载pdf.js
二、pdf.js可以实现在html下直接浏览pdf文档,是一款开源的pdf文档读取解析插件,非常强大,能将PDF文件渲染成Canvas。PDF.js主要包含两个库文件,一个pdf.js和一个pdf.worker.js,一个负责API解析,一个负责核心解析
pdf.js下载地址
** 把文件复制到工程文件夹,然后拖到工程中,注意不要选Create group**
加载方法
- (void)afnetworking {
if (!self.uiwebView) {
self.uiwebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, MainWidth - AutoSizeScaleX(60), MainHeight- SJ_StatusBarAndNavigationBarHeight)];
}
[self.view addSubview:self.uiwebView];
[self downloadFileWithUrlString:self.pdfUrl completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
NSString *viwerPath = [[NSBundle mainBundle] pathForResource:@"viewer" ofType:@"html" inDirectory:@"pdfjs/web"];
NSString *urlStr = [NSString stringWithFormat:@"%@?file=%@#page=1",viwerPath,filePath];
urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlStr]];
[self.uiwebView loadRequest:request];
});
}];
}
- (void)downloadFileWithUrlString:(NSString *)urlString completionHandler:(void (^ _Nullable)(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error))completionHandler {
if (!urlString) {
return;
}
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] progress:nil destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
return [[[NSFileManager defaultManager] URLForDirectory:(NSCachesDirectory) inDomain:(NSUserDomainMask) appropriateForURL:targetPath create:YES error:nil] URLByAppendingPathComponent:[NSString stringWithFormat:@"%ld.pdf", (long)[[NSDate date] timeIntervalSince1970]]];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
completionHandler(response, filePath, error);
}];
[downloadTask resume];
}
注意
一、有个问题就是pdf.js的加载缓慢,可能需要大概10s
二、一定使用UIWebview加载
三、跨域加载,大多数情况是加载服务器远程pdf文档,此时会加载失败,找到viewer.js文件将判断注释掉即可
// if (origin !== viewerOrigin && protocol !== 'blob:') {
// throw new Error('file origin does not match viewer\'s');
// }
四、将 viewer.js的 var DEFAULT_URL = 'compressed.tracemonkey-pldi-09.pdf'; 默认路径删掉,改为var DEFAULT_URL = '';
五、默认是不显示电子签章、签名的,若需要,将worker.js文件中的相关代码注释;
if (data.fieldType === 'Sig') {
//WGZ
// data.fieldValue = null;
//
// _this3.setFlags(_util.AnnotationFlag.HIDDEN);
}
六、如果需要修改加载页面的布局样式,或者隐藏下载按钮等,把viewer.html文件中相关代码注释掉,或者修改相关属性即可 。 注:尝试修改了viewer.html文件代码,但达不到我想要的效果
参考文章