itextsharp 生成阿拉伯语字体
Itextsharp Generate arabic font
我有一个包含 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 文档(包括法语和阿拉伯语文本)
在 IIS 7 中部署 web api 项目后,当我调用生成 pdf 的方法时,但没有响应
当我使用 Postmane 直接调用 api 时,我看到了这条消息:
"Message": "An error has occurred.",
"ExceptionMessage": Identity-H 不是受支持的编码名称
我不知道问题出在 IIS 上还是我必须更改 IDENTITY_H 字体?
有人可以帮忙吗?
这没有意义:
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 上不起作用。我假设 fontPath
到 ARIALUNI.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
存在于您的服务器上,或者您提供另一种支持阿拉伯语的字体。
我有一个包含 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 文档(包括法语和阿拉伯语文本) 在 IIS 7 中部署 web api 项目后,当我调用生成 pdf 的方法时,但没有响应 当我使用 Postmane 直接调用 api 时,我看到了这条消息: "Message": "An error has occurred.", "ExceptionMessage": Identity-H 不是受支持的编码名称
我不知道问题出在 IIS 上还是我必须更改 IDENTITY_H 字体? 有人可以帮忙吗?
这没有意义:
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 上不起作用。我假设 fontPath
到 ARIALUNI.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
存在于您的服务器上,或者您提供另一种支持阿拉伯语的字体。