PDFSharp WPF 1.32私人字体不会Azure的Blob存储工作(PDFSharp WPF

2019-10-22 13:41发布

我有一些代码,使用专用字体使用PDFSharp PDF文件添加文本。 如果字体位于本地文件系统上,但是当我给它提供一个URL存储在Azure的博客存储字体不工作时,此工作的成功。 我用自己的CDN,这也没有工作一个谷歌的字体也试过。 是有一些问题,从Web URL加载字体?

样本代码如下。 请注意,我已经解决了CORS问题在Azure Blob存储所以它不是。

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
}    

另外,在上述如果我使用的示例fontUrl在URI用于将字体则代码失败在其中XFont创建(第六从底部)的行。 如果在另一方面,我用localFontPath然后它工作。

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

:我已经下载并编辑了1.32 PDFSharp代码替换Debugger.Break在这一点例外声明。 该版本的NuGet有Debugger.Break这将导致在发布代码挂-看到我的SO问题有关的问题。

UPDATE

最后我换到PDFsharp WPF 1.50 beta版的字体处理是好多了,我是不是通过HTTP链接加载字体的问题,任何地方获得。 似乎运作得很好。

Answer 1:

要将呼叫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)是晦涩的,最小的错误会导致“未找到”。



文章来源: PDFSharp WPF 1.32 private fonts will not work with Azure Blob storage