柚子快報邀請碼778899分享:pdf Document
柚子快報邀請碼778899分享:pdf Document
var?ctx?=?canvas.getContext(‘2d’);
canvas.height?=?viewport.height;
canvas.width?=?viewport.width;
page.render({
canvasContext:?ctx,
viewport:?viewport
});
});
}
PDFJS.getDocument(url).then(function?(pdf)?{
pdfDoc?=?pdf;
for?(var?i?=?1;?i?<=?pdfDoc.numPages;?i++)?{
renderPage(i)
}
});
新建Html
content=“width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=4.0,user-scalable=no”/>
Document
準(zhǔn)備好js和html后,使用webview對在線pdf(www.gjtool.cn/pdfh5/git.p…[1] 進(jìn)行加載,
webView?.loadUrl(“file:///android_asset/index.html?https://www.gjtool.cn/pdfh5/git.pdf”);
運行成功后,pdf也加載出來了。
添加雙指縮放
好家伙,終于是加載出了pdf,我滿心歡喜的拿著效果給產(chǎn)品看一看。
“你這是加載出來了,但是字體看著有點小,你看能不能加上雙指縮放的功能”。產(chǎn)品小王看了一眼,
“那必須能啊?!?/p>
將webview設(shè)置為支持縮放狀態(tài),并且useWideViewPort設(shè)置為true,讓W(xué)ebivew支持meta標(biāo)簽的viewport屬性,
settings?.useWideViewPort?=?true
settings?.builtInZoomControls?=?true
settings?.setSupportZoom(true)
settings?.displayZoomControls?=?false?//不顯示縮放按鈕
并且修改html中的meta屬性,設(shè)置minimum-scale,maximum-scale屬性,以及將user-scalable置為yes,
運行成功后,成功對pdf進(jìn)行雙指縮放。
產(chǎn)品看了過后,點了點頭。我也開開心心的提交了代碼。
簽章無法顯示
以為這個小功能已經(jīng)開發(fā)完成,沒有多大的問題,直到有一天測試小姐姐找到我,
“你這pdf顯示有問題,當(dāng)pdf上有簽章時,簽章無法顯示”
“what?”
簽章無法顯示,這個倒是沒有自測過,趕緊找測試要了鏈接來驗證,經(jīng)過驗證,簽章的顯示確實有問題。所謂簽章,即在pdf上加蓋公章或者簽名。如下圖
(來源網(wǎng)絡(luò))
簽章是屬于后期添加在pdf上,對于簽章的加載,簡單的js是無法加載成功的。
那該如何處理?
其實有個非常強大的第三方庫pdf.js[2]已經(jīng)幫我們處理好了,pdf.js可通過pdf文件的地址或pdf數(shù)據(jù)流獲取pdf,具體實現(xiàn)是調(diào)用接口函數(shù) PDFJs.getDocument(url/buffer)將pdf載入html,通過canvas處理, 然后渲染pdf文件,當(dāng)然也能夠顯示出簽章。
只不過它的使用有點麻煩,需要先將pdf.js下載出來,下載地址[3] ,copy到Android項目中assert文件夾中,
最后加載方式還是和上方一樣使用webview來加載。缺點就是包體積增大。
當(dāng)我們使用pdf.js默認(rèn)加載pdf時,會發(fā)現(xiàn)效果圖的上方出現(xiàn)了多余的控制按鈕,比如下圖:
但是在UI設(shè)計圖中,是沒有包含這些控制按鈕的,如果就這么提交,估計不一會UI小姐姐就來找我了。
那該如何處理?
其實在本篇一開始使用的方式中,加載完成pdf是沒有這些控制按鈕的,那么問題來了,我們是不是可以將第一種方式與pdf.js相結(jié)合,來進(jìn)行加載?
pdf.js主要包含兩個核心庫文件,一個pdf.js和一個pdf.worker.js,一個負(fù)責(zé)API解析,一個負(fù)責(zé)核心解析。如果需要與第一種方式結(jié)合,我們就將pdf.js、pdf.worker.js以及pdf.sandbox.js三個文件copy出來,放到assert中。
在html中的script標(biāo)簽中添加對pdf.js、pdf.worker.js等的引用,
修改index.js文件
var?url?=?location.search.substring(1);
function?createPage()?{
var?div?=?document.createElement(“canvas”);
document.body.appendChild(div);
return?div;
}
alert(url);
function?renderPage(num)?{
pdfDoc.getPage(num).then(function?(page)?{
var?viewport?=?page.getViewport({?scale:?2.0?});
var?canvas?=?createPage();
var?ctx?=?canvas.getContext(‘2d’);
canvas.height?=?viewport.height;
canvas.width?=?viewport.width;
page.render({
canvasContext:?ctx,
viewport:?viewport
}).promise.then(()?=>?{});
});
}
pdfjsLib.getDocument(url).promise.then(function?(pdf)?{
pdfDoc?=?pdf;
for?(var?i?=?1;?i?<=?pdfDoc.numPages;?i++)?{
renderPage(i)
}
});
可以看到運行成功后,簽章成功展示且多余的控制按鈕也不會顯示,這里效果圖就不展示了。
我又開開心心的提交了代碼。
中文字符顯示不全
又過了一段時間,我正愉快的敲著代碼,這時候測試小姐姐又找到了我,
“這邊pdf顯示有點問題,一些文字、字符顯示不全,出現(xiàn)缺少字符的現(xiàn)象”
“what?”
我趕緊重現(xiàn)驗證下,當(dāng)pdf上有多種字體時,會有概率出現(xiàn)字符顯示不全的現(xiàn)象。查了查,當(dāng)運行加載此類pdf時,在控制臺上會出現(xiàn)了一些警告信息。
“Error during font loading”
是因為在解析pdf時,默認(rèn)的字體庫已經(jīng)不能覆蓋多種字體,也就無法將所有字體顯示完全。
那如何處理?
默認(rèn)字體庫無法滿足,那就添加新的字體庫,
在pdf.js文件中添加cMapUrl = “cdn.jsdelivr.net/npm/pdfjs-d…[4]” ,
params.rangeChunkSize?=?params.rangeChunkSize?||?DEFAULT_RANGE_CHUNK_SIZE;
params.CMapReaderFactory?=?params.CMapReaderFactory?||?DefaultCMapReaderFactory;
params.ignoreErrors?=?params.stopAtErrors?!==?true;
params.fontExtraProperties?=?params.fontExtraProperties?===?true;
params.pdfBug?=?params.pdfBug?===?true;
params.enableXfa?=?params.enableXfa?===?true;
params.cMapPacked?=?true
params.cMapUrl?=?“https://cdn.jsdelivr.net/npm/pdfjs-dist@2.2.228/cmaps/”
ok,運行看看,中文已顯示完全。
以上,webview加載pdf的問題基本已經(jīng)解決。針對webview加載pdf的方案,主要解決問題如下:
雙指縮放; 簽章無法顯示;
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)前端工程師,想要提升技能,往往是自己摸索成長或者是報班學(xué)習(xí),但對于培訓(xùn)機構(gòu)動則幾千的學(xué)費,著實壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Web前端開發(fā)全套學(xué)習(xí)資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時減輕大家的負(fù)擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上前端開發(fā)知識點,真正體系化!
由于文件比較大,這里只是將部分目錄截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且會持續(xù)更新!
如果你覺得這些內(nèi)容對你有幫助,可以掃碼獲取?。。▊渥ⅲ呵岸耍?/p>
最后
整理面試題,不是讓大家去只刷面試題,而是熟悉目前實際面試中常見的考察方式和知識點,做到心中有數(shù),也可以用來自查及完善知識體系。
《前端基礎(chǔ)面試題》,《前端校招面試題精編解析大全》,《前端面試題寶典》,《前端面試題:常用算法》PDF完整版點擊這里領(lǐng)取
源碼講義、實戰(zhàn)項目、講解視頻,并且會持續(xù)更新!**
如果你覺得這些內(nèi)容對你有幫助,可以掃碼獲?。。。▊渥ⅲ呵岸耍?/p>
最后
整理面試題,不是讓大家去只刷面試題,而是熟悉目前實際面試中常見的考察方式和知識點,做到心中有數(shù),也可以用來自查及完善知識體系。
《前端基礎(chǔ)面試題》,《前端校招面試題精編解析大全》,《前端面試題寶典》,《前端面試題:常用算法》PDF完整版點擊這里領(lǐng)取
[外鏈圖片轉(zhuǎn)存中…(img-TyeqFDBQ-1712546616292)]
[外鏈圖片轉(zhuǎn)存中…(img-w75QqgmZ-1712546616293)]
[外鏈圖片轉(zhuǎn)存中…(img-ZXAMMXzY-1712546616293)]
柚子快報邀請碼778899分享:pdf Document
文章來源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。