使用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()无法完成这些逻辑,导致渲染扭曲,但文本编码本身是正确的,所以复制粘贴显示正常。
修改方式如下:
- 改用
Canvas替代直接操作PdfCanvas,Canvas内置复杂文本布局支持。 - 通过
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
相关产品推荐
相关产品推荐

