You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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");
}

关键细节说明

  1. 字体验证:确保使用的字体(如B-Nazanin、IranNastaliq)是完整支持波斯文连字的版本,避免使用仅包含字符但无连写逻辑的字体
  2. 路径处理:字体路径用@前缀避免转义问题,或使用双斜杠\\
  3. 运行方向设置:RunDirection = PdfWriter.RUN_DIRECTION_RTL是解决字符分离的核心,它会让iTextSharp按照波斯文的书写规则处理字符组合
  4. 版本要求:建议使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:07:05