首页 文章

PDFSharp WPF 1.32私有字体不适用于Azure Blob存储

提问于
浏览
1

我有一些代码使用PDFSharp使用私有字体将文本添加到PDF文件 . 如果字体位于本地文件系统上,但是当我向其提供存储在Azure博客存储上的字体的URL时不起作用,则此方法成功 . 我也尝试在他们的CDN上使用谷歌字体,这也没有用 . 从网址加载字体有问题吗?

示例代码如下 . 请注意,我已经解决了Azure blob存储上的CORS issue,所以不是这样 .

private readonly XPdfFontOptions _fontOptions = 
    new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always);
private static readonly XPrivateFontCollection PrivateFontCollection =
    XPrivateFontCollection.Global;

[Test]
public async Task Test01RawPdfSharp()
{
    //SETUP 
    var account = "labelapptest";
    var fs = new FileStore(account);
    var fontUrl =
        "http://labelapptest.blob.core.windows.net/designernospamcom/justyna sokolowska - erazm-regular.otf";
    var pdfUrl =
        "https://labelapptest.blob.core.windows.net/label-highrez-blank/blank-label00001.pdf";
    var fontFamily = "Erazm Regular";
    var localFontPath = Path.Combine(TestFileHelpers.GetTestDataFileDirectory(@"\TestFonts"),
        "Justyna Sokolowska - Erazm-Regular.otf");

    //ATTEMPT
    var sFontFamilyname = "./#" + fontFamily;
    var uri = new Uri(fontUrl);
    PrivateFontCollection.Add(uri, sFontFamilyname);

    var readDirStatus = await fs.GetDirHandleAsync(FileStorageTypes.LabelHighRezBlank);
    using (var readStream = new MemoryStream())
    {
        await readDirStatus.Result.ReadFileAsync(readStream, pdfUrl);
        readStream.Seek(0, SeekOrigin.Begin);
        var document = PdfReader.Open(readStream);
        var gfx = XGraphics.FromPdfPage(document.Pages[0]);

        var font = new XFont(fontFamily, new XUnit(12, XGraphicsUnit.Point), XFontStyle.Regular, _fontOptions);
        var brush = new XSolidBrush(XColor.FromKnownColor(XKnownColor.Red));
        gfx.DrawString("Hello world", font, brush, 10, 10);
    }
    //VERIFY
}

在上面的例子中,如果我在uri中使用 fontUrl 来添加字体,那么代码将在创建XFont的行中失败(从底部开始的第6个) . 如果另一方面我使用 localFontPath 然后它的工作原理 .

错误是: Cannot get a matching glyph typeface for font 'Erazm Regular' 在XFont.cs中的PdfSharp.Drawing.XFont.Initialize()行:第234行 .

NOTE :我已经下载并编辑了1.32 PDFSharp代码以替换 Debugger.Break 语句,此时有例外 . NuGet版本有 Debugger.Break 导致已发布代码挂起 - 请参阅my SO question有关该问题 .

更新

最后我交换到了PDFsharp WPF 1.50 beta,因为它的字体处理要好得多,而且我没有遇到通过http链接加载字体的问题 . 似乎工作得很好 .

1 回答

  • 2

    PrivateFontCollection.Add(uri, sFontFamilyname) 的调用只是将URI传递给 new System.Windows.Media.FontFamily(baseUri, familyName) . 我不知道Media.FontFamily是否可以处理Azure存储的URI .

    我们将PrivateFontCollection与资源中的字体一起使用 - 从资源加载字体是 FontFamily Constructor (Uri, String) 帮助中给出的唯一示例 . 这是已知可与PDFsharp一起使用的URI类型 .

    FontFamily Constructor (Uri, String) 的语法有点神秘,最小的错误将导致"not found" .

相关问题