2016-01-30 48 views
1

我有一個包含名稱,其中的一些使用未在缺省PDF字體(黑體/ Arial字體)表示的字符/字形的列表的XML文件:在PDF顯示Unicode字符被Apache產生FOP

<name>Paul</name> 
<name>你好</name> 

我正在使用XSLT和Apache FOP處理此文件以生成列出名稱的PDF文件。目前,我得到以下警告在控制檯上和中國字符由##在PDF代替:

Jan 30, 2016 11:30:56 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "你" (0x4f60) not available in font "Helvetica". 
Jan 30, 2016 11:30:56 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "好" (0x597d) not available in font "Helvetica". 

我看過的文檔,它似乎表明,可用的選項有:

  1. 使用OpenType字體 - 除FOP不支持此外。
  2. 僅針對文本的非ASCII部分切換爲其他字體。

我不想爲每種語言使用不同的字體,因爲會出現中英文混合的PDF,而且據我所知,無法計算出哪些是XSLT中的哪一種/ XSL-FO。

是否可以嵌入單個字體來覆蓋所有情況?目前我只需要英文和中文,但未來我可能需要延長這一點。

我在Ubuntu上使用Apache FOP 2.1和Java 1.7.0_91。我已經看到了一些類似主題的早期問題,但大多數似乎都使用了Apache FOP的更老版本(例如0.95或1.1),並且我不知道在此期間是否有任何更改/改進。

編輯:我的問題是不同的(我認爲)建議的副本。我切換到我的FOP配置使用下面的代碼使用Ubuntu Font Family

<font kerning="yes" embed-url="../fonts/ubuntu/Ubuntu-R.ttf" embedding-mode="full"> 
    <font-triplet name="Ubuntu" style="normal" weight="normal"/> 
</font> 

<font kerning="yes" embed-url="../fonts/ubuntu/Ubuntu-B.ttf" embedding-mode="subset"> 
    <font-triplet name="Ubuntu" style="normal" weight="bold"/> 
</font> 

不過,我仍然得到「字形不可用」警告:

Jan 31, 2016 10:22:59 AM org.apache.fop.events.LoggingEventListener processEvent 
WARNING: Glyph "你" (0x4f60) not available in font "Ubuntu". 
Jan 31, 2016 10:22:59 AM org.apache.fop.events.LoggingEventListener processEvent 
WARNING: Glyph "好" (0x597d) not available in font "Ubuntu". 

我知道Ubuntu的常規有這兩個字形,因爲它是我的標準系統字體。

編輯2:如果我使用GNU Unifont,字形顯示正確。但是,它似乎是一種更專注於控制檯而不是文檔的字體。

+0

如何爲2與1有什麼不同? https://xmlgraphics.apache.org/fop/2.0/fonts.html建議OpenType ttf/otf字體支持得很好,所以你應該先嚐試一下。您可能無法使用所有OpenType功能,但如果您首先依賴這些功能,那麼FOP不會是您選擇的技術。 –

+0

在類似的問題中,用戶使用Arial Unicode成功報告包含不同語言的文檔(我確信其他字體也是)。 – lfurini

+1

Arial Unicode由於許可限制(我需要能夠將任何嵌入字體用於該軟件)發佈給我。我嘗試過使用Ubuntu Regular,當我在我的系統上使用它時,它肯定會正確顯示它,但我仍然收到有關字形不可用的警告。 – pwaring

回答

0

回答我的問題是,無論是使用GNU Unifont,其中:

  1. 支持中國和英語。
  2. 根據免費許可可以獲得。
  3. 如果將它添加到FOP配置文件中,「Just works」。

或者爲英文和中文PDF生成單獨的模板,併爲每個PDF使用不同的字體。

2

如果你不能找到一個合適的字體支持中國和英語(或者你發現一個,但你不很喜歡它的拉丁字形),請記住,font-family可以包含以逗號分隔的名字列表,按照該順序使用。

所以,你可以先列出英文文本所需的字體,然後一個爲中國文字:

<!-- this has # instead of the missing Chinese glyphs --> 
<fo:block font-family="Helvetica" space-after="1em" background-color="#AAFFFF"> 
    Paul 你好</fo:block> 

<!-- this has all the glyphs, but I don't like its latin glyphs --> 
<fo:block font-family="SimSun" space-after="1em" background-color="#FFAAFF"> 
    Paul 你好</fo:block> 

<!-- the best of both worlds! --> 
<fo:block font-family="Helvetica, SimSun" space-after="1em" background-color="#FFFFAA"> 
    Paul 你好</fo:block> 

輸出看起來是這樣的:

screenshot of PDF output

+0

我不知道你可以使用那種字體,我認爲這是在列表中使用第一種字體的情況,而第二種只在第一種字體沒有安裝/嵌入時才使用。 – pwaring