如何在Java/Spring Boot中用OpenPDF生成含阿拉伯文的PDF
在Spring Boot/Java 17中用OpenPDF正确渲染阿拉伯文的方案
一、关于阿拉伯文转Unicode的误区
- Java字符串本质上就是Unicode编码,你输入的阿拉伯文
الاسم本身就是Unicode格式,不需要额外转换。所谓的"Unicode形式"其实是字符串的转义表示(比如\u0627\u0644\u0627\u0633\u0645),但OpenPDF直接支持原生Unicode字符串,转义反而没必要。
二、OpenPDF渲染阿拉伯文的核心方案
阿拉伯文不显示的核心问题是缺少支持阿拉伯文的字体,以及没有设置正确的文字方向(RTL,从右到左)。以下是具体实现步骤:
1. 引入支持阿拉伯文的字体
把支持阿拉伯文的字体文件(比如NotoSansArabic-Regular.ttf)放到项目的resources/fonts目录下。
2. 在代码中加载字体并配置RTL方向
import com.lowagie.text.Document; import com.lowagie.text.Font; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.PdfWriter; import org.springframework.core.io.ClassPathResource; import java.io.FileOutputStream; public class ArabicPdfGenerator { public void generateArabicPdf() throws Exception { Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("arabic_test.pdf")); document.open(); // 加载阿拉伯文字体 ClassPathResource fontResource = new ClassPathResource("fonts/NotoSansArabic-Regular.ttf"); BaseFont baseFont = BaseFont.createFont( fontResource.getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED ); Font arabicFont = new Font(baseFont, 12); // 创建阿拉伯文段落,设置RTL方向 Paragraph arabicParagraph = new Paragraph("الاسم", arabicFont); arabicParagraph.setAlignment(Paragraph.ALIGN_RIGHT); // 右对齐 writer.setRunDirection(PdfWriter.RUN_DIRECTION_RTL); // 设置整个文档的文字方向为RTL document.add(arabicParagraph); document.close(); } }
3. 关键注意点
- 必须使用支持阿拉伯文的字体,否则即使编码正确也无法显示。推荐使用Google的Noto Sans Arabic,完全免费且支持所有阿拉伯文字符。
- 务必设置
RUN_DIRECTION_RTL,否则阿拉伯文会显示为反向的乱序字符。 - 字体要嵌入到PDF中(
BaseFont.EMBEDDED),避免在没有安装该字体的设备上显示异常。
三、额外提示
如果只需要局部段落使用RTL,不需要设置整个文档的方向,而是给单个段落单独配置:
arabicParagraph.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
内容的提问来源于stack exchange,提问作者ayada
相关产品推荐
相关产品推荐

