将HTML转换为PDF会将阿拉伯文本呈现为问号

时间:2018-04-10 11:57:23

标签: c# .net itext pdf-generation arabic

我在Asp.net应用程序中使用iTextsharp。将带有阿拉伯文文本的HTML转换为PDF时,生成的PDF会显示问号。

如何使用iText将包含不同语言内容的HTML转换为PDF?

1 个答案:

答案 0 :(得分:3)

您希望使用iText for .NET将带有阿拉伯语文本的HTML转换为PDF。在这种情况下,您需要iText 7pdfHTML加载项和pdfCalligraph add-on(*)。在你的问题中,你谈到了iTextSharp,这导致你相信你正在使用旧版的iText。确保您的版本正确。

HTML to PDF tutorial中,有关于字体的章节:Using fonts in pdfHTML

在题为"国际化"

的章节中,有一个涉及阿拉伯语的例子。

enter image description here

您的HTML包含阿拉伯字符,我认为该HTML文件的编码是Unicode。也许您正在使用旧版iText,默认使用其他编码来读取此类文件。

How to display Arabic strings from RTL in PDF generated using itext 7 API?中所述,您需要一种支持阿拉伯字形的字体。请向我们展示一些代码,以便我们可以看到您使用的是哪种字体。也许没有显示阿拉伯字符,因为您没有定义正确的字体。

请查看此常见问题解答条目:How to convert HTML containing Arabic/Hebrew characters to PDF?

enter image description here

我们需要三种字体:一种是英文文本,一种是阿拉伯文字的阿拉伯字体,另一种是希伯来文的希伯来字体:

public static final String[] FONTS = {
    "src/main/resources/fonts/noto/NotoSans-Regular.ttf",
    "src/main/resources/fonts/noto/NotoNaskhArabic-Regular.ttf",
    "src/main/resources/fonts/noto/NotoSansHebrew-Regular.ttf"
};

将左边的HTML转换为此图右侧的PDF的代码在Java中看起来像这样(C#代码非常相似;只需要应用微小的更改):

public void createPdf(String src, String[] fonts, String dest) throws IOException {
    ConverterProperties properties = new ConverterProperties();
    FontProvider fontProvider = new DefaultFontProvider(false, false, false);
    for (String font : fonts) {
        FontProgram fontProgram = FontProgramFactory.createFont(font);
        fontProvider.addFont(fontProgram);
    }
    properties.setFontProvider(fontProvider);
    HtmlConverter.convertToPdf(new File(src), new File(dest), properties);
}

你也要求多种语言"支持,但正如常见问题解答所述:iText 支持所有语言,前提是您拥有这些语言所需的字体文件。请参阅Which languages are supported in pdfHTML?

此示例的Java代码如下所示(C#开发人员将此代码移植到C#不应该是一个问题):

PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
pdf.setDefaultPageSize(PageSize.A4.rotate());
ConverterProperties properties = new ConverterProperties();
FontProvider fontProvider = new DefaultFontProvider(false, false, false);
fontProvider.addDirectory(fonts);
properties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(new FileInputStream(src), pdf, properties);

fonts指示的目录指向一个充满NOTO字体的目录(Google提供的免费字体,用于丰富的语言)。

(*)重要提示:

iText和pdfHTML插件可作为AGPL软件使用(就像您可能正在使用的旧iTextSharp版本一样)。这意味着您可以免费使用此软件,条件是您还可以根据AGPL将您的软件作为免费软件发布。

不幸的是,我们注意到许多开发人员忽略了AGPL许可,并在没有购买商业许可的情况下在封闭的源环境中使用了iText。有时,开发人员是出于无知而做到这一点的。为了避免无知,我们决定将pdfCalligraph插件(支持阿拉伯语,希伯来语和印度语所需的插件)仅作为封闭源产品提供。\

制作这个特定的附加封闭源的另一个原因是我们不知道任何支持所有这些语言和编写系统的开源库。我删除了你的问题,要求提供替代的开源库,因为你不允许使用Stack Overflow来请求推荐其他工具或库,但这个问题的答案很简单:没有支持HTML的开源库支持阿拉伯语,希伯来语,梵文,泰米尔语,泰卢固语,卡纳达语的PDF转换......支持这些语言需要知道很少有开发人员拥有。如果我们放弃知道如何免费(我们也要支付工资)那将是愚蠢的。