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

使用iText7生成PDF时古吉拉特语文本渲染异常但复制正常

古吉拉特语文本在iText7生成PDF中渲染异常问题

我正在使用iText7向PDF中添加古吉拉特语文本,但遇到了文本渲染异常的问题。不过,从生成的PDF中复制文本并粘贴到其他地方时,显示是正常的。此外,英文文本渲染没有任何问题——该问题仅出现在古吉拉特语(复杂)词汇上。

代码示例

private void AddTextToPdf()
{
    string inputPdfPath = @"C:\Users\Desktop\Eventi\dummy.pdf";
    string outputPdfPath = @"C:\Users\Desktop\Eventi\output.pdf";
    string nameToAdd = "સંસ્કૃતિ અને વારસો";

    float xPos = 10;
    float yPos = 600;
    PdfReader reader = new PdfReader(inputPdfPath);
    PdfWriter writer = new PdfWriter(outputPdfPath);
    PdfDocument pdfDoc = new PdfDocument(reader, writer);
    var page = pdfDoc.GetPage(1);

    PdfCanvas canvas = new PdfCanvas(page);
    string fontPath = @"C:\Users\Desktop\Eventi\BalooBhai2-Bold.ttf";
    byte[] fontData = File.ReadAllBytes(fontPath);
    PdfFont font = PdfFontFactory.CreateFont(fontPath, PdfEncodings.IDENTITY_H, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);

    canvas.SetFontAndSize(font, 12);
    canvas.BeginText();
    canvas.MoveText(xPos, yPos);
    canvas.ShowText(nameToAdd);
    canvas.EndText();
    pdfDoc.Close();
}

问题

  • PDF中的古吉拉特语文本渲染异常,显示扭曲或破碎。
  • 然而,从PDF中复制文本并粘贴到其他文档时,显示正常。
  • 英文文本渲染正常,但该问题仅出现在古吉拉特语复杂词汇上。

已尝试方案

  • 使用了不同的古吉拉特语字体(Shruti、NotoSansGujarati、BalooBhai2),但问题仍然存在。
  • 尝试了不同的编码格式(PdfEncodings.IDENTITY_H、PdfEncodings.UTF8、PdfEncodings.WINANSI),但均无效。
  • 验证了字体支持古吉拉特语字符。
  • 检查了iText是否正确在PDF中嵌入字体。

解决方案

问题根源在于PdfCanvas.ShowText()方法仅支持简单文本绘制,无法处理古吉拉特语这类需要**复杂文本布局(CTL)**的语言。这类语言的字符需要重排、连字或字形组合,ShowText()无法完成这些逻辑,导致渲染扭曲,但文本编码本身是正确的,所以复制粘贴显示正常。

修改方式如下:

  1. 改用Canvas替代直接操作PdfCanvas,Canvas内置复杂文本布局支持。
  2. 通过Paragraph组件添加文本,它会自动处理古吉拉特语的字符排版逻辑。

修改后的代码:

private void AddTextToPdf()
{
    string inputPdfPath = @"C:\Users\Desktop\Eventi\dummy.pdf";
    string outputPdfPath = @"C:\Users\Desktop\Eventi\output.pdf";
    string nameToAdd = "સંસ્કૃતિ અને વારસો";

    float xPos = 10;
    float yPos = 600;
    PdfReader reader = new PdfReader(inputPdfPath);
    PdfWriter writer = new PdfWriter(outputPdfPath);
    PdfDocument pdfDoc = new PdfDocument(reader, writer);
    var page = pdfDoc.GetPage(1);

    // 使用Canvas替代PdfCanvas,支持复杂文本布局
    Canvas canvas = new Canvas(page, pdfDoc.GetDefaultPageSize());
    string fontPath = @"C:\Users\Desktop\Eventi\BalooBhai2-Bold.ttf";
    PdfFont font = PdfFontFactory.CreateFont(fontPath, PdfEncodings.IDENTITY_H, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);

    // 创建Paragraph并设置位置、字体,添加到Canvas
    Paragraph para = new Paragraph(nameToAdd)
        .SetFont(font)
        .SetFontSize(12)
        .SetFixedPosition(xPos, yPos, pdfDoc.GetDefaultPageSize().GetWidth() - xPos * 2);
    canvas.Add(para);

    pdfDoc.Close();
}

关键说明

  • Canvas和Paragraph会自动处理古吉拉特语的字符重排、字形组合等复杂布局逻辑。
  • SetFixedPosition()用于指定文本位置,替代原代码中的MoveText()。
  • 保持使用IDENTITY_H编码,这是处理非西方语言的正确选择,确保字体嵌入正常。

内容的提问来源于stack exchange,提问作者Savan Gangani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:33:24