2010-06-14 73 views
6

我想呈現PDF內容到GDI設備上下文(準確地說是一個24位位圖)。將PDF流解析爲PDF對象,並從內容字典中呈現PDF命令的效果很好,包括字體渲染。改變一個嵌入的TrueType字體,使它可以被Windows使用GDI

嵌入字體從其FontFile流中解壓縮,並使用AddFontMemResourceEx「加載」。現在,一些嵌入字體刪除了GDI所需的一些TrueType表,如'name'表。因此,我試圖通過將TrueType子集字體解析到其表中來修改字體,並修改具有數據缺失/丟失表的表格,並使用盡可能正確的信息重新生成。

我使用Microsoft Font Validator工具來查看生成的字體是如何「正確」的。我仍然會遇到一些錯誤,比如對於maxp表,最大值通常太大(它是一個子集),或者xAvgCharWidth字段不等於'OS/2'表的計算值不正確,但這不會停止其他嵌入字體的使用。使用PDFCreator嵌入的字體是有問題的字體。

問題:

  1. 我如何確定什麼,我需要 改變字體文件,以便 GDI能夠使用它?
  2. 是否有任何其他字體驗證 工具,可能會讓我洞察 什麼仍然是錯誤的 fontfile?

如果需要的話:我可以讓原始fontfile與變異fontfile可供下載的地方。

是迄今取得了哪些修改:

  • 確保有一個 '頭', 'hhea', 'MAXP' 和 'OS/2' 部分。
  • 如果我們有符號字體,請清除'OS/2'部分中的Panose和Unicode字段
  • 如果我們爲零,請爲WInAscent/Desc和TypoAsc/Desc填寫正確的值。
  • 填寫超/下標/下劃線位置和大小的可接受值。
  • 掃描剩下的所有字形填充頭部中的X/Y最小/最大值。
  • 使用來自PDF文件的信息重建名稱部分。
+0

PDFCreator依靠Ghostscript來生成PDF。 PDFCreator的輸入是PostScript,它(在Windows上)通常起源於PostScript打印機驅動程序(大部分時間是Adobe的PS Driver)的輸出。 所以,問題是:你是否完全控制了你的工作流程?或者,您是否需要處理由PDFCreator生成的某些PDF文件,而這些文件有時無法控制? 如果您完全控制,則可以設置PDFCreator工作流程以嵌入原始(非PostScript)文檔格式使用的原始TrueType字體,而不是讓工作流程將字體轉換爲PS Type1。 – 2010-07-06 12:35:55

+0

@皮皮塔斯:源PDF被視爲「超出我們的控制」。目前我們的指導原則是:使用PDFCreator時,請勿使用嵌入字體。我*真正想要解決這個問題的主要原因是對Windows上truetype字體加載要求的充分理解。如果我可以使用GDI來繪製我的文本,我可以避免依賴於其他dll,具有許可證和專利問題的圖書館等。但最終我真的很想解決這個嘮叨的問題,儘管它現在在prio列表中較低指導方針。 – 2010-07-06 22:15:59

+0

好吧,如果你的問題主要出現在PDFCreator的輸出中,但你不能從根本上「解決」這個問題的原因(通過一個愚蠢的指導說:「不要爲你的PDF做什麼,所有最近的標準化工作[ PDF/X,PDF/A]推薦[即嵌入字體]!「,然後我難住... – 2010-07-07 00:18:27

回答

3

幾乎晚了一年,但我找到了答案:

字體種類(符號或沒有)應該是「CMAP」表和「名稱」表中的相同。因此,如果cmap包含3,0,4 cmap(MS,符號,段delta編碼)並且名稱表包含3,1,0 0409(MS,Unicode,ENUS)條目,則字體將不會加載。

它看起來像'符號cmap'的存在確定該字體是否被Windows視爲符號字體; 'OS/2'中的標誌似乎並不重要。

因此,如果使用'Microsoft Font Validator'使字體看起來正確,請檢查'cmap'和'name'表中的符號/ unicode字段是否對齊。

+0

我只是環顧四周,看起來WPF也可以在.NET 4.0中使用'PresentationCore'作爲參考:http://msdn.microsoft.com/en-us/library/system.windows.media.glyphtypeface .symbol.aspx – 2011-07-04 06:47:05

+0

我對WPF沒有豐富的經驗,但看起來/您可以使用沒有cmap的OpenType字體,並且可以處理glyphid上的字形。如果你嘗試在GDI中這樣做,它將無法工作。感謝您指出。 – 2011-07-05 09:08:48

+0

我還沒有深入研究這一切,但我確實遇到了[這篇WPF中的字體選擇白皮書](http://blogs.msdn.com/b/text/archive/2007/04/23/wpf -font-selection-model.aspx),它非常詳細地介紹了WPF如何確定表中的字體。這是一個有趣的閱讀。 – 2011-07-05 09:25:30

3

隨着GDI + AddMemoryFont你可以檢查它的Status在內存字體任何錯誤,像NotTrueTypeFont例如。

GDI的一個選項可能是嘗試使用TTLoadEmbeddedFont自己將嵌入字體加載到文檔/表單中,然後檢查從error messages返回的任何錯誤。提供比這個更多的信息的唯一功能是CreateFontPackage/MergeFontPackage,和他們的error codes,但我沒有看到他們如何在您的情況下使用。

除了這些,你有沒有機會查看PDFCreator的source code(假設你使用的是開源軟件而不是商業軟件)?

+0

此功能/狀態代碼不能提供足夠的信息來了解爲什麼它不被視爲truetype有效字體。我嘗試提供一個符合要求的truetype字體程序(所有必需的表格等等),但不知何故,我看不見什麼是缺失/錯誤。另外,我使用GDI,而不是GDI +,但是如果我可以獲取信息,我需要更改字體並使其正常工作...... GDI實現中用於加載truetype字體的某處是字體程序被拒絕,我想知道爲什麼所以我可以改變它並使用嵌入的字體。 – 2010-06-18 11:23:17

+0

啊,對GDI +抱歉。是的,GDI只檢查一定數量的東西。我已經更新了上面的答案。 – 2010-06-18 14:02:10

+0

我試着用MergeFontPackage來製作一個正確的字體,或者得到一些方向,它有什麼問題。瞧...沒有錯誤,我們得到了一個新的字體文件。不幸的是它不起作用;更好的是,它創建的字體包是字節相同的字節。所以這並沒有讓我知道字體程序有什麼問題,並且沒有產生可讀的字體程序。我會嘗試TTLoadEmbedded,看看明天帶給我什麼。 – 2010-06-19 18:53:06

相關問題