Itextsharp生成阿拉伯字体

时间:2016-07-26 17:51:25

标签: c# asp.net-mvc itext

我有一个包含ASP WEB API项目的解决方案

我有一个使用ItextSharp创建PDF文档的方法 本文档包含法语和阿拉伯语文本 我使用此代码获取阿拉伯语字体:

    public static BaseFont GetArabicFont()
    {

        var appDomain = System.AppDomain.CurrentDomain;
        var basePath = appDomain.BaseDirectory;
        var fontPath = Path.Combine(basePath, "fonts", "pdf", "ARIALUNI.TTF");

        try
        {
            BaseFont bf = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            return bf;
        }
        catch (Exception ex)
        {

            return BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

        }
   }

当我执行应用程序时,我可以正确生成pdf文档(包括法语和阿拉伯语文本) 在我调用生成pdf但没有响应的方法时,在IIS 7中部署web api项目之后 当我使用Postmane直接调用api时,我看到这样的消息: “消息”:“发生错误。”, “ExceptionMessage”:Identity-H不是受支持的编码名称“

我不知道问题是在IIS中还是我必须更改IDENTITY_H字体? 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

这没有意义:

BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

如果您使用BaseFont.IDENTITY_H,iText将始终嵌入字体。如果没有,iText将创建不符合ISO-32000-1的PDF。对此更为正确:

BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

这并不重要,因为iText会忽略您的错误并嵌入字体,即使您告诉iText不要嵌入它。这就是您的代码在您的计算机上正常运行的原因。

您说相同的代码在IIS上不起作用。我假设fontPathARIALUNI.TTF不会在IIS上产生字体。也许字体丢失了;也许IIS无法访问该字体。在这种情况下,会抛出错误并遇到以下行:

return BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

这一行也没有意义,因为BaseFont.IDENTITY_H不能与BaseFont.TIMES_ROMAN结合使用。此外:Times-Roman不包含任何阿拉伯字形,除非您提供PFB文件以及AFM文件,否则您不能嵌入Times-Roman。

您的问题的解决方案是确保服务器上存在ArialUni.ttf,或者您提供另一种支持阿拉伯语的字体。