webview加载pdf时,电子签名不显示

问题描述:

项目中需要用到云合同来进行电子签名,合同为pdf格式,可以通过UIWebView进行预览。但是在测试过程中却发现,合同可以正常显示,电子签名却不显示。

最终的解决方案是:通过pdf.js来加载合同。

接入教程:

首先把pdf.js clone到本地:

git clone git://github.com/mozilla/pdf.js.git

pdf.js 构建基于nodejs,因此需要安装nodejs:

npm install -g gulp-cli
npm install

进入pdf.js所在的文件,输入gulp generic或$ gulp minified进行构建:

cd pdf.js
#generic和minified取其中一种即可。
gulp generic
gulp minified

构建完成后将build\generic或build\ minified下的文件导入到xcode中。我在项目中用的是minified。

敲黑板啦
自定义一个继承与UIWebView的webView,并添加如下代码:

- (void)loadPDFFile:(NSString*)filePath;
{
    _filePath = filePath;
    
    NSString *viwerPath = [[NSBundle mainBundle] pathForResource:@"viewer" ofType:@"html" inDirectory:@"minified/web"];
    NSString *urlStr = [NSString stringWithFormat:@"%@?file=%@#page=1",viwerPath,filePath];
    urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlStr]];
    [self loadRequest:request];
}

在需要加载pdf的控制器中,初始化这个自定义的webView,并传入pdf的路径,本地路径或外网路径皆可。

开发阶段到此结束。


测试阶段:

刚开始,在iOS10的测试机上是没有问题的,项目运行良好,签名也完美解决。但是在测试的过程中发现,在iOS12的系统上,pdf无法打开,提示:file origin does not match viewer 错误。

解决办法:
在minified/web/pdf.viewer.js文件中注释掉以下代码(这是构建完成之后的):

if(r!==t&&"blob:"!==i)throw new Error("file origin does not match viewer's")

注意:pdf.js不支持跨域,所以才会报“file origin does not match viewer”错误。

至此,已经万事大吉☺☺☺

参考连接:
iOS开发之pdf文档的加载与浏览的4种方式
iOS使用pdf.js打开PDF文件
iOS 加载PDF问题无法显示电子章问题
pdf.js 在线浏览pdf组件构建与安装注意事项
Load pdf on foreign url with pdf.js

你可能感兴趣的:(webview加载pdf时,电子签名不显示)