iOS9 pdf中文亂碼問題的原因與“妥協”辦法

weixin_33850890發表於2016-02-02

前言

iOS9之後的系統存在pdf展示中文的亂碼問題,而且是部分pdf文件,有些pdf文件就不會出現亂碼現象。至於之前的系統版本是否存在這個問題,根據個人瞭解,應該是沒有的。
查了很多資料,關於亂碼的成因,大都說是因為iOS9升級之後,系統的字型檔對於中文支援的不全。下面的內容也是以這一說法為出發點尋求出的解決辦法,並從側面也證明了這一說法。

1.兩種方式展示pdf的亂碼錶象

這裡首先是簡述兩種最為常用的展示pdf的方法,如無需要,可跳過本段內容。

  • 1.利用webView載入pdf
    首先初始化一個webView
webView.scalesPageToFit = YES; //設定此項,可以縮放頁面
載入文件(先將檔案拖入當前專案)
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]];

程式很簡單,利用這種方式也可以簡單的展示word檔案,這種方式優點是簡單輕量,簡單展示可以,複雜的互動就不支援了。(MIME 參考手冊
利用這個方法,在真機上實驗(iOS9.2.1和iOS9.0.2),結果如下:

1468630-46b541e101647eba.png
iOS9.2.1 pdf顯示亂碼.png
  • 2.利用CGContextDrawPDFPage
    相對於webView的侷限,CGContextDrawPDFPage是利用系統框架直接繪製pdf,可以自定義閱讀器。之所以用另一種方式展示pdf,是為了對比實驗,避免一些未知因素的干擾。
    關於原生繪製pdf的方法,網上有很多,因為較為麻煩,筆者也只是簡單寫了個展示一頁pdf的demo,而且寫的比較失敗,就不在貼程式碼了。。。不過需要的效果是出來了,很直觀,依舊亂碼。
1468630-d158d6ab06e1bd37.png
iOS9.0.2 原生pdf亂碼

2.顯示亂碼的兩種解決(妥協)辦法

上面囉嗦了半天,下面開始進入正題。

  • 1.為系統新增字型檔(“不需要”越獄!)
    既然都說是系統的字型檔問題,那麼我們就為系統新增字型檔來看看效果。
    新增字型檔需要三方app的支援,AppStore檢索“aoFont”(下免費版就行,不是廣告。。。),一款很強大的系統字型新增app,最主要的是不需要越獄!
    這個app我也是偶然閱讀這篇文章才知道的,我們下面的操作也主要依賴這篇文章:(在此感謝一下原文的作者)

【新增字型檔】iOS 8.1 增加使用者字型檔(不是替換),iWork套件感覺好多了

原文作者提供了很多字型檔,在筆者的實驗中,只需要新增一種字型就足夠了:“宋體”。
字型下載連結在見原文,字型安裝方式原文也有簡單介紹,aoFont還是比較易用的,可自行操作(字型安裝容易,但是上傳時容易出問題,按照app的提示來就好,如果上傳失敗,建議再試,也遇到有些字型無法上傳,畢竟免費版。。。):

1468630-d6b437caea99cdb8.png

1468630-5a1f8247799744ee.png
1468630-9b78ae49785e5308.png
安裝好之後 aoFont的介面資訊

接下來再次用上面的兩種方式展示剛才的pdf文件,效果如下:

1468630-009534b780a1504f.png
iOS9.0.2 新增系統字型檔後,pdf部分顯示亂碼.png

1468630-584c9909a65cb7c8.png
iOS9.0.2 原生pdf亂碼解決

我們發現,亂碼問題的確是“遏制”了,但只是遏制,上圖中紅框內的字型顯示依舊不正常,可能是字型檔不夠全的原因,因為在正常顯示時可以看出,紅框內的黃色字型和其他不是同一字型,很像是黑體,而我們現在,也僅僅是新增了宋體而已。(如果依舊未正常顯示,可以更換新增其他字型試試,或者多新增幾種字型。)

到此,iOS9的pdf中文亂碼問題算是差不多有個交代了,基本可以確定,的確是系統字型檔的問題。無論是iOS9.0.2還是最新的9.2.1,都存在,低版本系統沒有試驗,不過根據瞭解到的,是沒有問題的。

  • 2.從源頭遏制亂碼問題
    雖說知道了是系統字型檔的問題,但作為開發人員,我們讓使用者自行安裝字型檔去解決,實在不妥。。。在app中植入類似aoFont的功能,又有點得不償失。所以,最好的辦法就是從源頭解決。
    文章開頭也說了,亂碼問題雖然存在,甚至常見,但是並不是全部的pdf文件都會出現亂碼,這應該是pdf在壓縮製作上傳時出現的問題,從文件源頭入手或許是個辦法。

下面做下圖的操作:

1468630-e9118275c8f8e293.png
用mac的預覽模式開啟相應的pdf,檔案 > 匯出為PDF...

此時我們得到和原始檔內容一致的另一個pdf文件,再次拖入之前的專案,編譯,展示:

1468630-199da4160c2dbcd3.png
iOS9.2.1 pdf顯示正常.png

這次,我們得到了完全正常的顯示效果,紅框內的黃色字型也正常顯示了(現在可以和其他字型對比,這兩個字型的確不是宋體,和前文圖片對比上圖的藍色字型(符號),也會發現二者字型是不同的,畢竟前文的字型是我們自行新增的)。

在匯出文件的操作中,mac做了哪些操作我並不清除,但是字型應該是換成了系統所支援的,不然就不會正常顯示了。但這也並不就是說後臺在上傳時必須先將我們所需的文件全部用mac壓縮一遍才行,只是說,在上傳之前,做好甄別,或者利用某些手段做統一處理,才是更為合適的解決或者說是無奈的妥協辦法,至於怎麼處理,看自己的手段和實際了,此處不再贅述。

當前,我們也期待蘋果在後期的系統升級中能夠考慮這個問題,不然,我們也只能一直妥協下去了。。。
如果某位讀者有更好的方法,也歡迎留言交流!
(程式碼不多就不再上傳了)

參考文章:
1.iOS開發筆記——PDF的顯示和瀏覽<女神的文章,特別推薦~>
2.【新增字型檔】iOS 8.1 增加使用者字型檔(不是替換),iWork套件感覺好多了

·轉載請註明出處·

相關文章