问题描述:
项目中需要用到云合同来进行电子签名,合同为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