使用C# iTextSharp生成PDF写入波斯文显示异常求助
解决iTextSharp生成PDF时波斯文显示为分离字符的问题
波斯文属于从右到左的复杂脚本,需要字符连写(ligatures)和字形组合才能正常显示,默认的Paragraph组件无法处理这些逻辑,导致字符分离。以下是具体解决方案:
核心修改思路
- 使用
PdfPTable+PdfPCell或ColumnText组件,它们支持设置文本运行方向,触发iTextSharp对复杂脚本的布局处理 - 明确设置文本运行方向为从右到左(RTL)
- 确保使用的字体完整支持波斯文连字特性
修改后的代码示例(推荐用PdfPTable方案)
private void BtnPrint_Click(object sender, RoutedEventArgs e) { Document doc = new Document(); PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream("output.pdf", FileMode.Create)); doc.Open(); // 加载波斯字体,替换为你实际的字体路径 BaseFont persianBaseFont = BaseFont.CreateFont(@"C:\Images\B-Nazanin.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); Font persianFont = new Font(persianBaseFont, 12); // 创建单列表格承载文本,确保布局正确 PdfPTable table = new PdfPTable(1); table.WidthPercentage = 100; PdfPCell cell = new PdfPCell(new Phrase("این یک متن فارسی است", persianFont)); cell.HorizontalAlignment = Element.ALIGN_RIGHT; // 关键:设置文本运行方向为从右到左 cell.RunDirection = PdfWriter.RUN_DIRECTION_RTL; cell.Border = PdfPCell.NO_BORDER; // 可选:去掉表格边框 table.AddCell(cell); doc.Add(table); doc.Close(); Process.Start("output.pdf"); }
关键细节说明
- 字体验证:确保使用的字体(如B-Nazanin、IranNastaliq)是完整支持波斯文连字的版本,避免使用仅包含字符但无连写逻辑的字体
- 路径处理:字体路径用
@前缀避免转义问题,或使用双斜杠\\ - 运行方向设置:
RunDirection = PdfWriter.RUN_DIRECTION_RTL是解决字符分离的核心,它会让iTextSharp按照波斯文的书写规则处理字符组合 - 版本要求:建议使用iTextSharp 5.5.x及以上版本,旧版本对复杂脚本的支持有限
备选方案(ColumnText)
如果不想用表格,也可以用ColumnText组件:
private void BtnPrint_Click(object sender, RoutedEventArgs e) { Document doc = new Document(); PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream("output.pdf", FileMode.Create)); doc.Open(); BaseFont persianBaseFont = BaseFont.CreateFont(@"C:\Images\B-Nazanin.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); Font persianFont = new Font(persianBaseFont, 12); Phrase persianPhrase = new Phrase("این یک متن فارسی است", persianFont); ColumnText column = new ColumnText(writer.DirectContent); column.SetSimpleColumn(doc.LeftMargin, doc.BottomMargin, doc.RightMargin, doc.TopMargin); column.AddElement(persianPhrase); column.RunDirection = PdfWriter.RUN_DIRECTION_RTL; column.Go(); doc.Close(); Process.Start("output.pdf"); }
内容的提问来源于stack exchange,提问作者abdul wahid
相关产品推荐
相关产品推荐

