【问题标题】:PDFSharp private fonts for azure 1.50适用于 azure 1.50 的 PDFSharp 私有字体
【发布时间】:2014-12-22 16:47:19
【问题描述】:

我已经下载并安装了 PDFSharp 1.5,但在使用私有字体时遇到了问题。我在测试 pdf 创建器时创建了它,它工作得很好。当我将它加载到 Azure 中时,它给了我无法加载字体的错误。做了研究,发现他们没有任何加载的字体,所以我必须使用私有字体。我只能找到较旧的 1.3 版本的示例,并且方法已更改为新的方法。有人可以给我看一个使用新版 PDFSharp 的简单示例吗?

谢谢约翰

【问题讨论】:

  • 1.50 版的更新示例尚未发布 - 它们应该在一月份发布。 1.50 版目前处于测试阶段。您仍然可以获得 PDFsharp 1.32 版(源和 NuGet 包)。
  • 我已经下载了1.32版和1.3版,我还是一头雾水。我的困惑是,我在所有示例中都看到他们使用 xprivateFontCollection pfc = new xPrivateFontCollection(); pfc.Add(XXXXXX);我得到 pfc.AddFont(XXX) 他们使用什么版本来获取 pfc.Add 以便我可以使用示例?
  • 确定了为什么我没有看到 .Add,因为我使用的是 GDI 而不是 WPF。仍然无法正常工作,但我离我更近了一点。
  • PDFsharp 包含一个使用私有字体的工作示例。您没有显示任何代码,因此我们无法为您提供帮助。

标签: fonts private pdfsharp


【解决方案1】:

这是针对 PdfSharp 1.5 beta3b 的。这是基于其他答案和其他问题的链接的完整且固定的示例 - 但针对 Arial。

将您想要的字体添加到您的项目中 - 在下面的示例中,我将 Arial 放入 MyProject\fonts\arial\arial.ttf 等。将每个字体文件设置为嵌入式资源(属性 -> 构建操作)。

使用这样的静态调用应用字体解析器:

MyFontResolver.Apply(); // Ensures it's only applied once

这是字体解析器类:

class MyFontResolver : IFontResolver
{
    public FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic)
    {
        // Ignore case of font names.
        var name = familyName.ToLower().TrimEnd('#');

        // Deal with the fonts we know.
        switch (name)
        {
            case "arial":
                if (isBold)
                {
                    if (isItalic)
                        return new FontResolverInfo("Arial#bi");
                    return new FontResolverInfo("Arial#b");
                }
                if (isItalic)
                    return new FontResolverInfo("Arial#i");
                return new FontResolverInfo("Arial#");
        }

        // We pass all other font requests to the default handler.
        // When running on a web server without sufficient permission, you can return a default font at this stage.
        return PlatformFontResolver.ResolveTypeface(familyName, isBold, isItalic);
    }

    public byte[] GetFont(string faceName)
    {
        switch (faceName)
        {
            case "Arial#":
                return LoadFontData("MyProject.fonts.arial.arial.ttf");;

            case "Arial#b":
                return LoadFontData("MyProject.fonts.arial.arialbd.ttf");;

            case "Arial#i":
                return LoadFontData("MyProject.fonts.arial.ariali.ttf");

            case "Arial#bi":
                return LoadFontData("MyProject.fonts.arial.arialbi.ttf");
        }

        return null;
    }

    /// <summary>
    /// Returns the specified font from an embedded resource.
    /// </summary>
    private byte[] LoadFontData(string name)
    {
        var assembly = Assembly.GetExecutingAssembly();

        // Test code to find the names of embedded fonts - put a watch on "ourResources"
        //var ourResources = assembly.GetManifestResourceNames();

        using (Stream stream = assembly.GetManifestResourceStream(name))
        {
            if (stream == null)
                throw new ArgumentException("No resource with name " + name);

            int count = (int)stream.Length;
            byte[] data = new byte[count];
            stream.Read(data, 0, count);
            return data;
        }
    }

    internal static MyFontResolver OurGlobalFontResolver = null;

    /// <summary>
    /// Ensure the font resolver is only applied once (or an exception is thrown)
    /// </summary>
    internal static void Apply()
    {
        if (OurGlobalFontResolver == null || GlobalFontSettings.FontResolver == null)
        {
            if (OurGlobalFontResolver == null)
                OurGlobalFontResolver = new MyFontResolver();

            GlobalFontSettings.FontResolver = OurGlobalFontResolver;
        }
    }
}

【讨论】:

  • 这基本上是另一个答案中链接的论坛帖子中的代码(没有任何学分)。
  • 你拯救了我的一天。
  • 我有这个错误:'没有名为 Psidar.WebAPI.Content.Fonts.arial.arial.ttf 的资源'
  • @Jen143 您是否按照描述嵌入了资源?如果是这样,您想找出您的资源在项目中的名称 - 我之前通过在调试器中查询资源名称来完成此操作(再次 - 请参阅答案,特别是“assembly.GetManifestResourceNames()”。
  • 有效!您节省了我的时间 - 谢谢!
【解决方案2】:

使用 PDFsharp 1.50 的 WPF 构建时,您可以在自己的类中实现 IFontResolver,并将该类的实例分配给 GlobalFontSettings.FontResolver

PDFsharp 1.50 仍在构建中。当它完成时,它应该包含 FontResolver 示例。

示例代码可在 PDFsharp 论坛上找到:
http://forum.pdfsharp.net/viewtopic.php?p=8961#p8961

注意: XPrivateFontCollection 应该适用于 GDI 和 WPF 构建。如果您使用 DocumentPreview 并希望在那里查看您的字体,则必须使用 XPrivateFontCollection。
IFontResolver 可能是没有用户界面的进程的最佳选择(例如在 Web 服务器上生成 PDF),但它不适用于 GDI 构建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2016-07-10
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多