我想呈現PDF內容到GDI設備上下文(準確地說是一個24位位圖)。將PDF流解析爲PDF對象,並從內容字典中呈現PDF命令的效果很好,包括字體渲染。改變一個嵌入的TrueType字體,使它可以被Windows使用GDI
嵌入字體從其FontFile流中解壓縮,並使用AddFontMemResourceEx
「加載」。現在,一些嵌入字體刪除了GDI所需的一些TrueType表,如'name'表。因此,我試圖通過將TrueType子集字體解析到其表中來修改字體,並修改具有數據缺失/丟失表的表格,並使用盡可能正確的信息重新生成。
我使用Microsoft Font Validator工具來查看生成的字體是如何「正確」的。我仍然會遇到一些錯誤,比如對於maxp表,最大值通常太大(它是一個子集),或者xAvgCharWidth
字段不等於'OS/2'表的計算值不正確,但這不會停止其他嵌入字體的使用。使用PDFCreator嵌入的字體是有問題的字體。
問題:
- 我如何確定什麼,我需要 改變字體文件,以便 GDI能夠使用它?
- 是否有任何其他字體驗證 工具,可能會讓我洞察 什麼仍然是錯誤的 fontfile?
如果需要的話:我可以讓原始fontfile與變異fontfile可供下載的地方。
是迄今取得了哪些修改:
- 確保有一個 '頭', 'hhea', 'MAXP' 和 'OS/2' 部分。
- 如果我們有符號字體,請清除'OS/2'部分中的Panose和Unicode字段
- 如果我們爲零,請爲WInAscent/Desc和TypoAsc/Desc填寫正確的值。
- 填寫超/下標/下劃線位置和大小的可接受值。
- 掃描剩下的所有字形填充頭部中的X/Y最小/最大值。
- 使用來自PDF文件的信息重建名稱部分。
PDFCreator依靠Ghostscript來生成PDF。 PDFCreator的輸入是PostScript,它(在Windows上)通常起源於PostScript打印機驅動程序(大部分時間是Adobe的PS Driver)的輸出。 所以,問題是:你是否完全控制了你的工作流程?或者,您是否需要處理由PDFCreator生成的某些PDF文件,而這些文件有時無法控制? 如果您完全控制,則可以設置PDFCreator工作流程以嵌入原始(非PostScript)文檔格式使用的原始TrueType字體,而不是讓工作流程將字體轉換爲PS Type1。 – 2010-07-06 12:35:55
@皮皮塔斯:源PDF被視爲「超出我們的控制」。目前我們的指導原則是:使用PDFCreator時,請勿使用嵌入字體。我*真正想要解決這個問題的主要原因是對Windows上truetype字體加載要求的充分理解。如果我可以使用GDI來繪製我的文本,我可以避免依賴於其他dll,具有許可證和專利問題的圖書館等。但最終我真的很想解決這個嘮叨的問題,儘管它現在在prio列表中較低指導方針。 – 2010-07-06 22:15:59
好吧,如果你的問題主要出現在PDFCreator的輸出中,但你不能從根本上「解決」這個問題的原因(通過一個愚蠢的指導說:「不要爲你的PDF做什麼,所有最近的標準化工作[ PDF/X,PDF/A]推薦[即嵌入字體]!「,然後我難住... – 2010-07-07 00:18:27