使用iText html2pdf实现HTML转PDF时阿拉伯文本反转问题如何解决?
解决方案
问题原因
iText默认未启用复杂脚本(包括阿拉伯语等RTL从右到左语言)的排版支持,仅配置CSS的direction: rtl和添加支持阿拉伯语的字体不足以完成正确排版:
- 阿拉伯语字符需要做字形变形处理,同一字母在词首、词中、词尾写法不同,默认模式不会做该转换
- 包含
#等中性字符的双向文本没有经过双向算法(BIDI)处理,会出现顺序反转、符号位置错误的问题
操作步骤
步骤1:引入必要依赖
需要额外引入RTL排版支持包和ICU双向文本处理库,Maven坐标如下(版本需和你使用的iText主版本一致,以下为7.2.x版本示例):
<dependencies> <!-- iText html2pdf核心包 --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>html2pdf</artifactId> <version>7.2.5</version> </dependency> <!-- RTL语言支持扩展包 --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>html2pdf-rtl</artifactId> <version>7.2.5</version> </dependency> <!-- 双向文本处理依赖 --> <dependency> <groupId>com.ibm.icu</groupId> <artifactId>icu4j</artifactId> <version>72.1</version> </dependency> </dependencies>
步骤2:修改转换配置
在原有转换代码的ConverterProperties配置中,开启复杂脚本支持即可:
@Test public void convert() { File htmlFile = new File("/Users/scott/Downloads/pdf/test.html"); File pdfFile = new File("/Users/scott/Downloads/pdf/test.pdf"); try { PdfWriter writer = new PdfWriter(pdfFile.getPath()); PdfDocument pdfDoc = new PdfDocument(writer); pdfDoc.setTagged(); pdfDoc.setDefaultPageSize(PageSize.A4.rotate()); ConverterProperties converterProperties = new ConverterProperties(); converterProperties.setCharset(StandardCharsets.UTF_8.name()); // 新增:开启复杂脚本排版支持,自动处理RTL语言和双向文本 converterProperties.setComplexScriptFeaturesEnabled(true); FontProvider fontProvider = new DefaultFontProvider(false, false, false); fontProvider.addFont("/Users/scott/Downloads/pdf/Amiri-Regular.ttf"); converterProperties.setFontProvider(fontProvider); HtmlConverter.convertToPdf(new FileInputStream(htmlFile), pdfDoc, converterProperties); } catch (IOException e) { log.error("Render PDF failed, ", e); } }
可选优化:完善HTML声明
在HTML的根标签添加阿拉伯语语言声明,提升排版兼容性:
<html lang="ar">
内容的提问来源于stack exchange,提问作者Scott Lau
相关产品推荐
相关产品推荐

