如何用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字体对泰米尔语的支持度不如专门优化的字体完善。
修正方案
- 优先使用Noto Sans Tamil这类专门为泰米尔语优化的OpenType字体;
- 使用
ColumnText替代直接添加Paragraph,更精准控制复杂文本的渲染逻辑; - 利用
using语句自动管理资源,避免手动关闭的冗余操作; - 确保输入的泰米尔语文本是正确的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
相关产品推荐
相关产品推荐

