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

如何用C#结合iTextSharp生成无排版拼写错误的泰米尔语PDF

解决iTextSharp生成泰米尔语PDF的排版错误问题

我需要用C#结合iTextSharp库生成包含泰米尔语的PDF文件,要求无排版错误及拼写问题。当前实现生成的PDF存在泰米尔语字符排版错乱(字符拆分、连写错误),期望生成符合泰米尔语书写规范的正确排版PDF。

原实现代码

string OutputPdffile = Path.Combine(pdfpath, language + "_" + DateTime.Now.ToString("ddMMyyyy_HHmmss")) + ".pdf";
using (System.IO.FileStream fs = new FileStream(OutputPdffile, FileMode.CreateNew))
{
    Document document = new Document(PageSize.A4, 25, 25, 30, 30);
    PdfWriter writer = PdfWriter.GetInstance(document, fs);
    // 添加文档元信息
    document.AddAuthor("Micke Blomquist");
    document.AddCreator("Sample application using iTextSharp");
    document.AddKeywords("PDF tutorial education");
    document.AddSubject("Document subject - Describing the steps creating a PDF document");
    document.AddTitle("The document title - PDF creation using iTextSharp");
    // 打开文档以写入内容
    document.Open();
  
    if (language == "Tamil")
    {
        string fontpath = AppDomain.CurrentDomain.BaseDirectory + "/Fonts/Tamil/Nirmala.ttf";                       
        string fontpath1 = AppDomain.CurrentDomain.BaseDirectory + "/Fonts/Tamil/NotoSansTamil.ttf";                       
        BaseFont bf = BaseFont.CreateFont(fontpath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        BaseFont bf1 = BaseFont.CreateFont(fontpath1, BaseFont.IDENTITY_H , BaseFont.EMBEDDED);                       
        iTextSharp.text.Font font = new iTextSharp.text.Font(bf, 12);
        iTextSharp.text.Font font1 = new iTextSharp.text.Font(bf1, 12);                      

        // 添加泰米尔语文本
        document.Add(new Paragraph(PrintInTamil(content), font));
        
    }
    else
    {
        // 添加其他语言文本
        document.Add(new Paragraph(content));
    }
    
    // 关闭文档和相关资源
    document.Close();
    writer.Close();
    fs.Close(); 
}

问题分析

泰米尔语属于复杂文种(Complex Script),需要支持Unicode复杂文本排版(CTL)才能正确渲染字符连写、字形变换等规则。旧版iTextSharp对CTL的原生支持有限,直接使用Paragraph可能无法正确处理泰米尔语的字形组合,导致排版错乱。此外,Nirmala字体对泰米尔语的支持度不如专门优化的字体完善。

修正方案

  1. 优先使用Noto Sans Tamil这类专门为泰米尔语优化的OpenType字体;
  2. 使用ColumnText替代直接添加Paragraph,更精准控制复杂文本的渲染逻辑;
  3. 利用using语句自动管理资源,避免手动关闭的冗余操作;
  4. 确保输入的泰米尔语文本是正确的Unicode编码,无需额外转义处理。

修正后的代码

string OutputPdffile = Path.Combine(pdfpath, language + "_" + DateTime.Now.ToString("ddMMyyyy_HHmmss")) + ".pdf";
using (var fs = new FileStream(OutputPdffile, FileMode.CreateNew))
using (var document = new Document(PageSize.A4, 25, 25, 30, 30))
{
    var writer = PdfWriter.GetInstance(document, fs);
    // 添加文档元信息
    document.AddAuthor("Micke Blomquist");
    document.AddCreator("Sample application using iTextSharp");
    document.AddKeywords("PDF tutorial education");
    document.AddSubject("Document subject - Describing the steps creating a PDF document");
    document.AddTitle("The document title - PDF creation using iTextSharp");
    
    document.Open();

    if (language.Equals("Tamil", StringComparison.OrdinalIgnoreCase))
    {
        // 使用Noto Sans Tamil字体(确保字体文件存在于指定路径)
        string tamilFontPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Fonts", "Tamil", "NotoSansTamil.ttf");
        BaseFont tamilBaseFont = BaseFont.CreateFont(tamilFontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        var tamilFont = new iTextSharp.text.Font(tamilBaseFont, 12);

        // 使用ColumnText确保复杂文本正确渲染
        var columnText = new ColumnText(writer.DirectContent);
        columnText.SetSimpleColumn(document.LeftMargin, document.BottomMargin, document.RightMargin, document.TopMargin);
        columnText.AddElement(new Paragraph(content, tamilFont)); // 确保content为正确的Unicode泰米尔语文本
        columnText.Go();
    }
    else
    {
        document.Add(new Paragraph(content));
    }
}
// using语句会自动关闭document、writer和fs,无需手动调用Close()

关键说明

  • 字体选择:Noto Sans Tamil由Google开发,完全支持泰米尔语的所有字形和排版规则,避免因字体缺失字形导致的错误;
  • ColumnText:相比直接添加Paragraph,ColumnText能更好地处理复杂文本的换行和字形组合,确保泰米尔语的连写规则被正确应用;
  • 资源管理:嵌套的using语句会自动释放所有实现IDisposable的资源,避免资源泄漏;
  • 文本编码:确保content变量直接存储正确的Unicode泰米尔语字符,若原PrintInTamil方法是做编码转换,需确认其输出为标准Unicode格式。

内容的提问来源于stack exchange,提问作者Silambarasan K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:09:55