Office自動化,PowerPoint將Shape導出爲EMF之後,字體發生變化,何解?

★wingtrace發表於:2009-11-18 10:39:07:

用的是Office自動化編程,日文系統,.NET編程環境。

對Shape.TextFrame設定了AutoSize等屬性,
對Shape.TextFrame.TextRange.Text設定了文本,
對Shape.TextFrame.TextRange.Font設定了字體名稱、大小、樣式等,
※字體爲"MS Gothic",12pt,Blue,Underline。

通過Shape.Export函數將文本框導出爲EMF文件,
發現只要符合以下條件,原本設定的"MS Gothic"在實際生成的EMF中變成了"PMingLiu"。

1、Vista+Office2007
  ※Win2K+Office2003無此問題
2、至少包含一個比較複雜的漢字,例如“華”等
  ※如果都是簡單漢字的話無此問題,例如“日”等
3、字數達到或超過6個

據本人猜測,可能是內部GDI函數對文字的字符集或代碼頁的判斷有誤,
因爲"MS Gothic"針對的是CP932,"PMingLiu"針對的是CP935。。


★tttyd回覆於:2009-11-18 11:04:57
mark
這種問題原因多多,尤其是系統環境問題,不好診斷


★wingtrace回覆於:2009-11-18 11:08:45

確實,從ms和msdn的網站上也找不出什麼有用的信息。
而且通過調查發現,Shape.Export其實是一個沒有任何文檔記載的函數,
MSDN的forum上有人討論,宣稱它實際上是一個不被支持的函數。。。

 

★wingtrace回覆於:2009-11-18 21:28:20
經過調查意外地解決了。。

 

無奈之餘嘗試着DEBUG跟蹤TextRange的各種屬性,看有沒有異樣的地方,
發現在調用Shape.TextFrame.TextRange.Text設定文本之後,
TextRange.LanguageID變成了msoLanguageIDTraditionalChinese,
而設定文本前它是正常的msoLanguageIDJapanese。

 

至於爲什麼TextRange.Text接收文本之後會改變TextRange.LanguageID,
應該是對設定進來的文本的代碼頁發生了誤判,在全日文系統以及全日文輸入
的情況下不應該發生這樣的問題纔對,或許是PowerPoint2007的BUG,
或許是Vista的BUG,那就不得而知了。。

 

關於修正方法,只要在設定文本之後強行通過代碼將TextRange.LanguageID

設定回msoLanguageIDJapanese就好了,經過觀察EMF表現恢復正常。

 

btw,本次BUG調查中Feng Yuan的《Windows圖形編程》一書起了很大作用,
沒有它我也不會深入地去了解EMF的構造以及GDI關於字體和文本處理的一些
工作原理,在此聊表謝意吧。


★wingtrace回覆於:2009-12-09 09:02:45

很遺憾地說,其實那個辦法不能解決問題。。
後來客戶去諮詢了MS,MS說設定日文字體的時候用Font.Name屬性是不對的,
應該用Font.NameFarEase屬性,否則就算強行將LanguageID改成日語,
所用的也依然是日語的缺省字體(MS PGothic),而不是代碼裏面設置的
MS Gothic。MS沒說這是個BUG,只是在KB裏面也有記錄,KB號記不得了。。

※因爲MS Gothic和MS PGothic只是等寬與非等寬的區別,在文字比較少,
而且不包含空格的時候,是很難看出來差別的,但是一旦包含大量的空格,
用MS PGothic的總寬度明顯要比MS Gothic短得多。。。


★wingtrace回覆於:2009-12-09 09:04:32

該問題不僅影響PowerPoint,也影響Excel,
不止在Vista下有問題,在WindowsXP下頁有問題。

發佈了50 篇原創文章 · 獲贊 1 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章