前言
iOS9之后的系統(tǒng)存在pdf展示中文的亂碼問(wèn)題,而且是部分pdf文檔,有些pdf文檔就不會(huì)出現(xiàn)亂碼現(xiàn)象。至于之前的系統(tǒng)版本是否存在這個(gè)問(wèn)題,根據(jù)個(gè)人了解,應(yīng)該是沒(méi)有的。
查了很多資料,關(guān)于亂碼的成因,大都說(shuō)是因?yàn)閕OS9升級(jí)之后,系統(tǒng)的字庫(kù)對(duì)于中文支持的不全。下面的內(nèi)容也是以這一說(shuō)法為出發(fā)點(diǎn)尋求出的解決辦法,并從側(cè)面也證明了這一說(shuō)法。
1.兩種方式展示pdf的亂碼表象
這里首先是簡(jiǎn)述兩種最為常用的展示pdf的方法,如無(wú)需要,可跳過(guò)本段內(nèi)容。
- 1.利用webView加載pdf
首先初始化一個(gè)webView
webView.scalesPageToFit = YES; //設(shè)置此項(xiàng),可以縮放頁(yè)面
加載文檔(先將文件拖入當(dāng)前項(xiàng)目)
NSString * path = [[NSBundle mainBundle] pathForResource:@"文件名" ofType:@"pdf"];
//或者
NSString * path = [[NSBundle mainBundle] pathForResource:@"文件名.pdf" ofType:nil];
最后
NSURL * url = [NSURL fileURLWithPath:path];
NSData * data = [NSData dataWithContentsOfFile:path];
[webView loadData:data MIMEType:@"application/pdf" textEncodingName:@"UTF-8" baseURL:url];
//或者干脆直接:
[webView loadRequest:[NSURLRequest requestWithURL:url]];
程序很簡(jiǎn)單,利用這種方式也可以簡(jiǎn)單的展示word文件,這種方式優(yōu)點(diǎn)是簡(jiǎn)單輕量,簡(jiǎn)單展示可以,復(fù)雜的交互就不支持了。(MIME 參考手冊(cè))
利用這個(gè)方法,在真機(jī)上實(shí)驗(yàn)(iOS9.2.1和iOS9.0.2),結(jié)果如下:

- 2.利用CGContextDrawPDFPage
相對(duì)于webView的局限,CGContextDrawPDFPage是利用系統(tǒng)框架直接繪制pdf,可以自定義閱讀器。之所以用另一種方式展示pdf,是為了對(duì)比實(shí)驗(yàn),避免一些未知因素的干擾。
關(guān)于原生繪制pdf的方法,網(wǎng)上有很多,因?yàn)檩^為麻煩,筆者也只是簡(jiǎn)單寫(xiě)了個(gè)展示一頁(yè)pdf的demo,而且寫(xiě)的比較失敗,就不在貼代碼了。。。不過(guò)需要的效果是出來(lái)了,很直觀,依舊亂碼。

2.顯示亂碼的兩種解決(妥協(xié))辦法
上面啰嗦了半天,下面開(kāi)始進(jìn)入正題。
- 1.為系統(tǒng)添加字庫(kù)(“不需要”越獄?。?br>
既然都說(shuō)是系統(tǒng)的字庫(kù)問(wèn)題,那么我們就為系統(tǒng)添加字庫(kù)來(lái)看看效果。
添加字庫(kù)需要三方app的支持,AppStore檢索“aoFont”(下免費(fèi)版就行,不是廣告。。。),一款很強(qiáng)大的系統(tǒng)字體添加app,最主要的是不需要越獄!
這個(gè)app我也是偶然閱讀這篇文章才知道的,我們下面的操作也主要依賴這篇文章:(在此感謝一下原文的作者)
原文作者提供了很多字庫(kù),在筆者的實(shí)驗(yàn)中,只需要添加一種字體就足夠了:“宋體”。
字體下載鏈接在見(jiàn)原文,字體安裝方式原文也有簡(jiǎn)單介紹,aoFont還是比較易用的,可自行操作(字體安裝容易,但是上傳時(shí)容易出問(wèn)題,按照app的提示來(lái)就好,如果上傳失敗,建議再試,也遇到有些字體無(wú)法上傳,畢竟免費(fèi)版。。。):



接下來(lái)再次用上面的兩種方式展示剛才的pdf文檔,效果如下:


我們發(fā)現(xiàn),亂碼問(wèn)題的確是“遏制”了,但只是遏制,上圖中紅框內(nèi)的字體顯示依舊不正常,可能是字庫(kù)不夠全的原因,因?yàn)樵谡o@示時(shí)可以看出,紅框內(nèi)的黃色字體和其他不是同一字體,很像是黑體,而我們現(xiàn)在,也僅僅是添加了宋體而已。(如果依舊未正常顯示,可以更換添加其他字體試試,或者多添加幾種字體。)
到此,iOS9的pdf中文亂碼問(wèn)題算是差不多有個(gè)交代了,基本可以確定,的確是系統(tǒng)字庫(kù)的問(wèn)題。無(wú)論是iOS9.0.2還是最新的9.2.1,都存在,低版本系統(tǒng)沒(méi)有試驗(yàn),不過(guò)根據(jù)了解到的,是沒(méi)有問(wèn)題的。
- 2.從源頭遏制亂碼問(wèn)題
雖說(shuō)知道了是系統(tǒng)字庫(kù)的問(wèn)題,但作為開(kāi)發(fā)人員,我們讓用戶自行安裝字庫(kù)去解決,實(shí)在不妥。。。在app中植入類似aoFont的功能,又有點(diǎn)得不償失。所以,最好的辦法就是從源頭解決。
文章開(kāi)頭也說(shuō)了,亂碼問(wèn)題雖然存在,甚至常見(jiàn),但是并不是全部的pdf文檔都會(huì)出現(xiàn)亂碼,這應(yīng)該是pdf在壓縮制作上傳時(shí)出現(xiàn)的問(wèn)題,從文檔源頭入手或許是個(gè)辦法。
下面做下圖的操作:

此時(shí)我們得到和源文件內(nèi)容一致的另一個(gè)pdf文檔,再次拖入之前的項(xiàng)目,編譯,展示:

這次,我們得到了完全正常的顯示效果,紅框內(nèi)的黃色字體也正常顯示了(現(xiàn)在可以和其他字體對(duì)比,這兩個(gè)字體的確不是宋體,和前文圖片對(duì)比上圖的藍(lán)色字體(符號(hào)),也會(huì)發(fā)現(xiàn)二者字體是不同的,畢竟前文的字體是我們自行添加的)。
在導(dǎo)出文檔的操作中,mac做了哪些操作我并不清除,但是字體應(yīng)該是換成了系統(tǒng)所支持的,不然就不會(huì)正常顯示了。但這也并不就是說(shuō)后臺(tái)在上傳時(shí)必須先將我們所需的文檔全部用mac壓縮一遍才行,只是說(shuō),在上傳之前,做好甄別,或者利用某些手段做統(tǒng)一處理,才是更為合適的解決或者說(shuō)是無(wú)奈的妥協(xié)辦法,至于怎么處理,看自己的手段和實(shí)際了,此處不再贅述。
當(dāng)前,我們也期待蘋(píng)果在后期的系統(tǒng)升級(jí)中能夠考慮這個(gè)問(wèn)題,不然,我們也只能一直妥協(xié)下去了。。。
如果某位讀者有更好的方法,也歡迎留言交流!
(代碼不多就不再上傳了)
參考文章:
1.iOS開(kāi)發(fā)筆記——PDF的顯示和瀏覽<女神的文章,特別推薦~>
2.【添加字庫(kù)】iOS 8.1 增加用戶字庫(kù)(不是替換),iWork套件感覺(jué)好多了