試用Foxit PDF: 在網頁中單頁展示PDF

產品需求

????????在網頁中展示PDF文件,每次展示一頁,通過按鈕進行翻頁。

思路分析

????????之前網站功能分別使用vue-pdf和pdfjs-dist實現過,但渲染速度都特別慢,所以想試試foxit pdf插件。網站只是用插件單頁展示PDF文件,功能簡單,在官網提供的插件包里也有只渲染單頁的示例代碼,稍加改動后即可使用,但實施過程中發現有許多坑,于是想找官方文檔,費了好一番功夫才找到一個中文文檔,但發現里面也沒有詳細的參數配置說明,所以只能自行摸索。

過程經歷

? ??????問題1

????????根據項目需求,讓PDF的寬度撐滿父盒子是比較理想的,而在PDFViewer的配置項中有一個defaultScale字段,是與PDF的顯示尺寸相關的。defaultScale的取值為數字或字符串,因為沒有明確的官方說明,所以只能試,已知的可取值為:fitWidth(默認值)、fitHeight、數字(縮放比例)。

????????其中fitWidth比較符合需求,但實際操作時,當取值fitWidth(fitHeight也是)時,頁面總是會出現滾動條。

1

????????從控制臺可看到html上有一個“--facing-margin: 8px;”,如果在控制臺將該樣式去除(或將主dom元素display設為block)則滾動條會符合預期,于是做了如下嘗試:

????????1)新增CSS樣式,將--facing-margin覆蓋為0px,發現問題依舊;

????????2)直接在庫代碼中(js文件和css文件中各一處)將--facing-margin值改為0px,發現問題依舊;

????????3)將主dom元素display設為block,問題依舊;

????????4)將比例調小(比如將defaultScale設為0.95),可解決問題,但取值不好控制;

????????5)在上面的測試過程中,發現將--facing-margin改為0px后,再觸發滾動事件后,可以觸發頁面重新計算,這時滾動條會變得符合預期。所以在PDF文件加載完成后用代碼觸發滾動事件,問題解決。

2

? ??????問題2

????????當將調整后的Demo代碼移植到實際項目以后,PDF計算后的尺寸并非是父盒子的寬度,而是網頁視窗窗口的寬度。又因為PDF的父盒子大小與視窗大小沒有固定的比例關系,所以考慮將PDF的顯示放在一個單獨頁面中,再用iframe嵌入網頁中進行使用。

????????不過,這樣做的話,iframe的高度不會根據內容去自動調整,所以只能人為調整。此處使用的方案是:iframe打開PDF文件后,通過postMessage將PDF的尺寸信息和頁碼總數發給外層窗口,外層收到尺寸信息后再修改iframe的高度。

3

? ??????問題3

????????將iframe嵌入網頁后,當PDF翻頁時,發現iframe時而有滾動條時而沒有,時而PDF是撐滿網頁的,時而又與邊框存在間隙。

4

????????在控制臺可以看到PDF的尺寸閃爍是因為每次翻頁時都會重新計算寬度,而當某次因為某些原因產生滾動條后,滾動條會壓縮網頁的有效寬度,那么下次翻頁時計算的寬度就會偏小,于是又會出現間隙(如圖所示,間隙大約8px,默認的滾動條寬16px,所以大體可以猜到原因)。

????????解決辦法是直接在iframe網頁中將html的overflow直接設為hidden,這樣就可以避開滾動條對尺寸計算產生的影響。那這樣改了以后會不會影響上一步postMessage中的PDF高度尺寸呢?實測的結果是不會。如下圖所示,overflow:hidden不會影響scrollHeight等信息(圖片中的渲染效果是在控制臺人為修改的,非瀏覽器自動渲染,正常的頁面高度不會缺損)。

5

最終結果

????????初始化時,因為要下載PDF文件,速度慢些;之后的操作還是比較流暢的,效果還可以。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容