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

C# 将HTML转换为PDF会将阿拉伯语文本呈现为问号,c#,.net,itext,pdf-generation,arabic,C#,.net,Itext,Pdf Generation,Arabic,我正在Asp.net应用程序中使用iTextsharp。将带有阿拉伯语文本的HTML转换为PDF时,生成的PDF会显示问号 如何使用iText将包含不同语言内容的HTML转换为PDF?您想使用iText for.NET将包含阿拉伯语文本的HTML转换为PDF。在这种情况下,您需要,附加组件和(*)。在你的问题中,你谈到了iTextSharp,这让人相信你使用的是旧版本的iText。确保你有正确的版本 在中,有一章是关于字体的: 在题为“国际化”的章节中有一个涉及阿拉伯语的例子: 您的HTML包

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


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

您想使用iText for.NET将包含阿拉伯语文本的HTML转换为PDF。在这种情况下,您需要,附加组件和(*)。在你的问题中,你谈到了iTextSharp,这让人相信你使用的是旧版本的iText。确保你有正确的版本

在中,有一章是关于字体的:

在题为“国际化”的章节中有一个涉及阿拉伯语的例子:

您的HTML包含阿拉伯语字符,我假设该HTML文件的编码是Unicode。可能您使用的是旧版本的iText,默认情况下使用另一种编码读取此类文件

如中所述,您需要一种支持阿拉伯字形的字体。请给我们看一些代码,以便我们可以看到您使用的字体。可能没有显示阿拉伯字符,因为您没有定义正确的字体

请查看此常见问题解答条目:

我们需要三种字体:一种用于英文文本的常规字体,一种用于阿拉伯文文本的阿拉伯文字体,以及一种用于希伯来文文本的希伯来文字体:

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代码非常相似;只需应用细微的更改):

您还要求提供“多语言”支持,但正如常见问题解答所解释的那样:所有语言都受iText支持,前提是您拥有这些语言所需的字体文件。看

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

font
表示的目录指向一个满是NOTO字体的目录(谷歌为多种语言提供的免费字体)

(*)重要提示:

iText和pdfHTML附加组件作为AGPL软件提供(就像您可能正在使用的旧iTextSharp版本一样)。这意味着您可以免费使用此软件,条件是您也可以在AGPL下以自由软件的形式发布您的软件

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


制作这个特定的附加组件的另一个原因是,我们不知道有任何开源库支持所有这些语言和编写系统。我删除了你关于替代开源库的问题,因为你不允许使用堆栈溢出来寻求其他工具或库的建议,但这个问题的答案很简单:没有支持HTML到PDF转换并支持阿拉伯语、希伯来语、德瓦纳加里语、泰米尔语、泰卢古语、,卡纳达,。。。支持这些语言需要知道很少有开发人员拥有的知识。如果我们免费赠送这些技术,那就太愚蠢了(我们还得付工资)。

你想用iText for.NET将带有阿拉伯文本的HTML转换成PDF。在这种情况下,您需要,附加组件和(*)。在你的问题中,你谈到了iTextSharp,这让人相信你使用的是旧版本的iText。确保你有正确的版本

在中,有一章是关于字体的:

在题为“国际化”的章节中有一个涉及阿拉伯语的例子:

您的HTML包含阿拉伯语字符,我假设该HTML文件的编码是Unicode。可能您使用的是旧版本的iText,默认情况下使用另一种编码读取此类文件

如中所述,您需要一种支持阿拉伯字形的字体。请给我们看一些代码,以便我们可以看到您使用的字体。可能没有显示阿拉伯字符,因为您没有定义正确的字体

请查看此常见问题解答条目:

我们需要三种字体:一种用于英文文本的常规字体,一种用于阿拉伯文文本的阿拉伯文字体,以及一种用于希伯来文文本的希伯来文字体:

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代码非常相似;只需应用细微的更改):

您还要求提供“多语言”支持,但正如常见问题解答所解释的那样:所有语言都受iText支持,前提是您拥有这些语言所需的字体文件。看

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

font
表示的目录指向一个满是NOTO字体的目录(谷歌为多种语言提供的免费字体)

(*)重要提示:

iText和pdfHTML附加组件作为AGPL软件提供(就像您可能正在使用的旧iTextSharp版本一样)。这意味着您可以免费使用此软件,条件是您也可以在AGPL下以自由软件的形式发布您的软件

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

制作这个特定的附加组件的另一个原因是,我们不知道有任何开源库支持所有这些语言和编写系统。我把你的问题删除了
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);