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

时间:2015-04-08 08:15:43

标签: c# .net fonts azure-storage-blobs pdfsharp

我有一些代码使用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()第23行:

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

更新

最后我换成了PDFsharp WPF 1.50 beta,因为它的字体处理要好得多,而且我无法通过http链接加载字体。似乎工作得很好。

1 个答案:

答案 0 :(得分: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)的语法有点神秘,最小的错误会导致“找不到”。