背景
公司項(xiàng)目中需要顯示訂單合同PDF文件。正常情況下,加載pdf文件直接通過(guò)UIWebView或者WKWebView就可以墓懂。不過(guò)實(shí)際情況中,PDF文件如果存在電子簽名(簽章)的話霉囚,直接通過(guò)webView是無(wú)法查看到電子簽名(簽章)的∝盎可以寫(xiě)個(gè)簡(jiǎn)單的demo對(duì) http://blogs.adobe.com/security/SampleSignedPDFDocument.pdf
這個(gè)pdf文件進(jìn)行查看對(duì)比:
- 通過(guò)PC瀏覽器查看: 有電子簽名
- 通過(guò)iOS WebView加載地址查看: 無(wú)電子簽名盈罐,并且有一部分內(nèi)容丟失
解決辦法:
之前直接使用WKWebview加載pdf地址來(lái)處理的,具體實(shí)現(xiàn)是通過(guò)遠(yuǎn)端的pdfviewer
(可以理解為web端的pdf查看頁(yè)面)拼接 pdf
的url 路徑來(lái)加載的闪唆,大概如下:
// 由于pdf文件中含有電子簽章盅粪,如果直接通過(guò)pdf文件地址進(jìn)行加載,會(huì)無(wú)法顯示簽章內(nèi)容悄蕾,需要進(jìn)行解析
let pdfViewerUrl = "https://example.xxxx.cc/PDFWebSign/web/showPdf.html" //后臺(tái)提供的pdf文件解析地址
let pdfFileUrl = "https://example.xxxx.cc/pdf/2bf949849dd048b28123asd123_sign.pdf"http://pdf文件實(shí)際地址
// https://example.xxxx.cc/PDFWebSign/web/showPdf.html?file=https://example.xxxx.cc/pdf/2bf949849dd048b28123asd123_sign.pdf&isView=true&fileUrl=https://example.xxxx.cc/pdf/2bf949849dd048b28123asd123_sign.pdf
let urlString = "\(pdfViewerUrl)?file=\(pdfFileUrl)isView=true&fileUrl=\(pdfFileUrl)"
let urlRequest = URLRequest(url: URL(string: urlString)!)
webView.loadRequest(urlRequest)
不過(guò)由于存在跨域問(wèn)題票顾,需要進(jìn)行cookie的注入操作,并且從遠(yuǎn)端進(jìn)行解析加載pdf速度一直很慢帆调,所有想嘗試其他的方法奠骄。
調(diào)研過(guò)程略...
調(diào)研相關(guān)鏈接:
iOS展示pdf簽名時(shí)遇到的問(wèn)題及解決辦法
iOS實(shí)現(xiàn)PDF閱讀功能調(diào)研
最終方案:
通過(guò)pdf.js加載
接入教程直接參照: iOS使用pdf.js打開(kāi)PDF文件
參照上面的步驟介入后發(fā)現(xiàn)還是無(wú)法顯示電子簽名(簽章) 在查看 pdf.js 上的issue后發(fā)現(xiàn)有相關(guān)issue 如下:
其中 #4743 中Osukaru 提出了解決方案:
在 src/core/annotation.js第601行(當(dāng)前版本)中
// Hide unsupported Widget signatures. 注釋掉if中的內(nèi)容即可顯示電子簽章
if (data.fieldType === 'Sig') {
warn('unimplemented annotation type: Widget signature');
this.setFlags(AnnotationFlag.HIDDEN);
}
(后面查詢過(guò)程中發(fā)現(xiàn)在 使用PDF.js如何顯示pdf文件的電子簽章 中也提到同樣的解決辦法。)
將 clone
下來(lái)的 pdf.js
中 src/core/annotation.js
文件修改后按照iOS使用pdf.js打開(kāi)PDF文件
重新構(gòu)建執(zhí)行
gulp generic
再接入到工程項(xiàng)目中即可,最終效果:
注意番刊,這里沒(méi)有使用上面提供的 http://blogs.adobe.com/security/SampleSignedPDFDocument.pdf 進(jìn)行驗(yàn)證含鳞,是因?yàn)樵谶\(yùn)行過(guò)程中會(huì)crash,并拋出 WebActionDisablingCALayerDelegate willBeRemoved]: unrecognized selector sent 錯(cuò)誤