問題描述:
項(xiàng)目中需要用到云合同來(lái)進(jìn)行電子簽名,合同為pdf格式,可以通過UIWebView進(jìn)行預(yù)覽。但是在測(cè)試過程中卻發(fā)現(xiàn),合同可以正常顯示,電子簽名卻不顯示。
最終的解決方案是:通過pdf.js來(lái)加載合同。
接入教程:
首先把pdf.js clone到本地:
git clone git://github.com/mozilla/pdf.js.git
pdf.js 構(gòu)建基于nodejs,因此需要安裝nodejs:
npm install -g gulp-cli
npm install
進(jìn)入pdf.js所在的文件,輸入gulp generic或$ gulp minified進(jìn)行構(gòu)建:
cd pdf.js
#generic和minified取其中一種即可。
gulp generic
gulp minified
構(gòu)建完成后將build\generic或build\ minified下的文件導(dǎo)入到xcode中。我在項(xiàng)目中用的是minified。
敲黑板啦
自定義一個(gè)繼承與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的控制器中,初始化這個(gè)自定義的webView,并傳入pdf的路徑,本地路徑或外網(wǎng)路徑皆可。
開發(fā)階段到此結(jié)束。
測(cè)試階段:
剛開始,在iOS10的測(cè)試機(jī)上是沒有問題的,項(xiàng)目運(yùn)行良好,簽名也完美解決。但是在測(cè)試的過程中發(fā)現(xiàn),在iOS12的系統(tǒng)上,pdf無(wú)法打開,提示:file origin does not match viewer 錯(cuò)誤。
解決辦法:
在minified/web/pdf.viewer.js文件中注釋掉以下代碼(這是構(gòu)建完成之后的):
if(r!==t&&"blob:"!==i)throw new Error("file origin does not match viewer's")
注意:pdf.js不支持跨域,所以才會(huì)報(bào)“file origin does not match viewer”錯(cuò)誤。
至此,已經(jīng)萬(wàn)事大吉???
參考連接:
iOS開發(fā)之pdf文檔的加載與瀏覽的4種方式
iOS使用pdf.js打開PDF文件
iOS 加載PDF問題無(wú)法顯示電子章問題
pdf.js 在線瀏覽pdf組件構(gòu)建與安裝注意事項(xiàng)
Load pdf on foreign url with pdf.js