[.NET]利用FO.NET將XSL-FO轉成PDF中文的解決方式

FO.NET將XSL-FO轉成PDF,如果在簡單的範例檔案中輸入中文字,然後測試,會發現中文字會變成「#」。
要如何解決呢?

FO.NET將XSL-FO轉成PDF,如果在簡單的範例檔案中輸入中文字,然後測試,會發現中文字會變成「#」。

以下使用官方網站的範例來測試,如下,

XSL-FO File (test.fo):

<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="simple"
                  page-height="29.7cm"
                  page-width="21cm"
                  margin-top="1cm"
                  margin-bottom="2cm"
                  margin-left="2.5cm"
                  margin-right="2.5cm">
      <fo:region-body margin-top="3cm"/>
      <fo:region-before extent="3cm"/>
      <fo:region-after extent="1.5cm"/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="simple">
    <fo:flow flow-name="xsl-region-body">
      <fo:block font-size="18pt" color="black" text-align="center">
        Hello, World!中文堃!
      </fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

 

C#的程式(要加入fonet.dll參考)

//using Fonet;
FonetDriver driver = FonetDriver.Make();
driver.Render("hello.fo", "hello.pdf");

 

產生出來的PDF如下,

image

 

後來有找到「FO.NET does not yet support Unicode characters」這篇討論,

於是將字型改成「Arial Unicode MS」,並將FontType 設定成 Subset ,中文就可以正常顯示出來了哦! 如下,

XSL-FO File (test.fo) (請注意,我多加入font-family="Arial Unicode MS" ) :

<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="simple"
                  page-height="29.7cm"
                  page-width="21cm"
                  margin-top="1cm"
                  margin-bottom="2cm"
                  margin-left="2.5cm"
                  margin-right="2.5cm">
      <fo:region-body margin-top="3cm"/>
      <fo:region-before extent="3cm"/>
      <fo:region-after extent="1.5cm"/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="simple">
    <fo:flow flow-name="xsl-region-body">
      <fo:block font-size="18pt" color="black" text-align="center" font-family="Arial Unicode MS">
        Hello, World!中文堃!
      </fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

 

C#的程式(要加入fonet.dll參考)(請注意,多設定Options):

FonetDriver driver = FonetDriver.Make();
driver.Options = new Fonet.Render.Pdf.PdfRendererOptions();
driver.Options.FontType = Fonet.Render.Pdf.FontType.Subset;
driver.Render(@"h:\test.fo", @"h:\test2.pdf");

 

產生出來的PDF如下(中文可順利的呈現),

image

 

另外,安裝FO.NET之後會有Fonet.exe及Fonet.dll,所以也可以透過命令視窗來產生pdf哦! 如下,

fonet –fonttype Subset –fo h:\test.fo –pdf h:\test1.pdf

image

image

 

參考資料

FO.NET

 FO.NET does not yet support Unicode characters

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^