最近研究到SSRS的匯出PDF功能,由於應用平台涵蓋SSRS 2000,對於PDF的中文亂碼問題多了一點心得,特整理備忘。

首先,PDF對於字型有兩處理方式: 第一種是只記載各段文字所使用的字型,Client端讀取軟體開啟時再使用所處作業系統相同名稱的字型繪製文字。因此,Client端與製作文件端的字型檔必須100%相同,才能產生 完全一致的呈現結果。當跨越不同平台時容易衍生問題,例如Linux、Mac與Windows的標楷體不盡相同,便可能發生閱讀時看到的排程與原始設計有所出入的情況。

於是PDF提供第二種做法: 把有文件中用到的中文字向量資料從字型檔擷取出來嵌入PDF中,如此即便Client沒有安裝相同字型也能正確顯示。(也可以將整個字型檔全部嵌入,如此該PDF檔未來甚至能直接在Client端編輯,但中文字型檔常高達數十MB,實務上較少有嵌入完整中文字型的做法)

SSRS從2005起才開始支援PDF字型內嵌(SSRS 2005SSRS 2008),SSRS 2000並不支援:

Fonts

The PDF rendering extension does not embed fonts. Fonts that are used in the report must be installed on the report server and on the client computers used to view the report.
來源: http://technet.microsoft.com/en-us/library/aa178934(SQL.80).aspx

換句話說,SSRS 2000匯出的PDF檔要正確呈現,Client必須具備跟Report Server完全相同的字型。那麼如果Server跟Client都是Windows,通通用最保險的"新細明體"總行了吧?

很不幸地,答案是"未必"!

從Vista/Windows 2008起,微軟內建的新細明體(PMingLiU)字型改採Unicode 3.1標準,造成Windows 2000/XP/Windows 2003上的"新細明體"與Vista/Windows 7+/Windows 2008的"新細明體"變成兩套規格不同的字型,在Windows 2000/Windows 2003使用指定新細明體製作PDF檔,在XP上開啟還算正常,一旦改用Windows 7,照樣亂碼滿天飛。
(補充: 依維基百科,XP/Windows 2003用的是新細明體3.21-4.55,Vista/Win2008起為新細明體6.02版,開始改採Unicode 3.1標準,微軟曾出了一個新細明體更新套件試圖讓XP/2003的新細明體也改為Unicode 3.1標準,但問題不斷罵聲不絕,黯然下架...)

最後來個實驗驗證。製作一個RDL檔,放入八個TextBox分別標註成不同字體(新細明體用"PMingLiU"及"新細明體"中英文FontFamily各測一次),Value的部分則為FontFamily值加上"中文測試"四個字:

      <Textbox Name="textbox8">
        <Top>1.25in</Top>
        <Width>1.8in</Width>
        <Style>
          <FontFamily>Arial Unicode MS</FontFamily>
          <PaddingLeft>2pt</PaddingLeft>
          <PaddingRight>2pt</PaddingRight>
          <PaddingTop>2pt</PaddingTop>
          <PaddingBottom>2pt</PaddingBottom>
        </Style>
        <ZIndex>7</ZIndex>
        <CanGrow>true</CanGrow>
        <Left>1.625in</Left>
        <Height>0.25in</Height>
        <Value>Arial Unicode MS 中文測試</Value>
      </Textbox>

測試一 SSRS 2000 on Win2003,Client端為Win2003,PDF只有細明體及新細明體正確無誤

測試二 SSRS 2000 on Win2003,Client端為Win7,PDF中連新細明體都爆了

測試三 SSRS 2005 on Windows 2003,Client端為Win7,PDF顯示大致正常,只有Arial因屬純英文字型,不含中文字,故中文部分變成方塊,PDF不像Word/網頁,若該字在指定字型找不到對應時並不會改用預設字型,故Arial中大變方塊的行為還算在預期之內。

結論: SSRS 2000的PDF匯出功能在中文呈現上有嚴重缺陷,塊陶啊~


Comments

# by Alex Lee

現在都已經2013了..... 2000就如同IE6一般讓它隨風去吧

# by Phil Chen

Jeffrey大 你好 我有個問題想請教您 我把SSRS原本匯出成csv檔選項改成匯出txt檔, 但開啟txt檔後,txt檔預設的編碼是Unicode, 有辦法讓匯出後的txt檔預設的編碼是ANSI嗎? 謝謝

# by Jeffrey

to Phil Chen, 想改成ANSI是因為Excel開啟CSV時中文變亂碼嗎? 可以寫程式或用Notepad++將它轉成帶BOM的Unicode檔案就可以解決。參考:http://blog.darkthread.net/post-2009-09-06-csv-encoding-again.aspx

Post a comment