iOS UIWebView加载PDF不显示电子签章 WKWebView加载PDF不显示电子签章

一、公司项目使用到电子合同,用的是加载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**

5903237-d30330a96dea177d.jpeg

加载方法
- (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文件代码,但达不到我想要的效果
参考文章

你可能感兴趣的:(iOS UIWebView加载PDF不显示电子签章 WKWebView加载PDF不显示电子签章)