簡體   English   中英

如何在PDFSharp中使用私有字體

[英]How to use private fonts in PDFSharp

我試圖使用私有文本添加文本到PDF文檔,即沒有安裝在系統上,TrueType字體和麻煩。 我正在使用NuGet的PDFSharp + MigraDoc WPF版本1.32.2608.0。

我在論壇和StackOverFlow上找到了很多項目。 最新的是這篇stackoverflow文章,它引用了PdfSharp網站上的這個例子 但是,此示例包含以下代碼:

this.fontFamilies.Add(key, fontFamily);

在第22行,但我在匯編中找不到任何對fontFamilies的引用。

因此,我遵循了一個看起來很好的例子 ,但它對我不起作用。 當我使用這種方法時,我可以成功添加字體但是當我來使用命令時:

var font = new XFont(fontStyle.Name, new XUnit(fontStyle.SizePt, XGraphicsUnit.Point), XFontStyle.Regular, _fontOptions);

其中fontStyle.Name是前面沒有#的字體名稱。 此時,PdfSharp在PdfSharp.Drawing命名空間內的private void Initialise()方法內部中斷。

此時檢查Initialise方法中的變量它具有:

  1. 找到了字體系列,即this.family != null
  2. 找到了字體,即this.typeface != null

我假設它在線上斷開if (!typeface2.TryGetGlyphTypeface(out typeface))但我不能確定。

注意:我已經嘗試過.ttf和.otf字體無濟於事。

有人能指出我正確的方向嗎?

更新

最后我換成了PDFSharp WPF 1.50 beta,因為它的字體處理要好得多。 請參閱我在第二期的SO帖子以及解決我的問題的新字體解析器的信息。 現在一切都運轉良好。

好吧,對此的答案相當復雜,但如果它對其他人有幫助,那么這就是答案。

如果您想使用私有字體,即您系統上尚未安裝的字體,使用PDFSharp,則需要執行以下操作。

目前,2015年3月,唯一發布的使用私有字體的NuGet庫是PDFsharp + MigraDoc(WPF)1.32.2608版本。 1.50有很多beta版本,但這個答案大約是1.32版本。

  1. 您必須使用1.32的WPF版本,而不是GDI +版本。
  2. 我在PDFSharp頁面中找到了名為“ Private Fonts ”的代碼,這些代碼具有誤導性。 根據ThomasH的說法,PDFSharp團隊希望人們下載樣本,樣本中的代碼片段非常不同。
  3. 有關如何編寫代碼的最佳示例,請訪問http://forum.pdfsharp.net/viewtopic.php?f=2&t=1880#p5395
    注意:作者關於加載字體兩次的注釋會導致異常是正確的。 他的處理方法很有效,但速度很慢。 我預掃描所有字體並按名稱對它們進行分組,以便只添加一次。
  4. 非常小心字體的名稱 (請參閱結尾處的注釋)。 很容易讓名字出錯,如果你這樣做,你會遇到各種各樣的麻煩。 發布的NuGet版本有一個討厭的Debugger.Break而不是異常,在發布的代碼中它只是停頓 - 在我的單元測試中我必須關閉Visual Studio才能擺脫它!
  5. 請注意,TrueType(.ttf)字體可以采用MAC或Windows格式 - 這讓我感到震驚。 OpenType(.otf)字體很好。

注意:在字體名稱上,在Windows中找到它的最佳方法是雙擊字體文件。 Windows然后會在第一行顯示名稱中帶有名稱的字體。 正如我所說,做錯了,你可以得到一個停滯不前的系統。

最后,我要感謝@ThomasH,他指導我使用PDFSharp 1.32源代碼。 這有私有字體的“正確”示例,並且沒有那個討厭的Debugger.Break但是當您要求的字體名稱不存在時,這是正確的異常。

更新

最后我換成了PDFSharp WPF 1.50 beta,因為它的字體處理要好得多。 關於我的問題和有關幫助的字體解析器的信息,請參閱此SO帖子

對於PDFsharp 1.50,您必須實現IFontResolver接口並將實現分配給全局PDFsharp屬性。

GlobalFontSettings.FontResolver = new DemoFontResolver();

PDFsharp提供了一個FontResolverBase類,您可以使用它來派生自己的類。 只需為您的私有字體添加代碼,並將調用傳遞給其他字體的基類。

IFontResolver接口需要兩個方法: ResolveTypefaceGetFont

更多信息可以在我的博客文章中找到:
http://developer.th-soft.com/developer/?p=11

這里提供了一個完整的解決方案作為ZIP文件。

重新“第22行”:PDFsharp論壇只顯示示例中的一個片段。

對於PDFsharp 1.3x:您可以從CodePlex或SourceForge下載完整的示例代碼,其中包含完整的工作示例(包括項目,解決方案,示例TTF文件)。

也可以看看:
https://stackoverflow.com/a/21545488/1015447

版本1.32的完整源代碼:
http://pdfsharp.codeplex.com/releases

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM