ItextSharp-LGPL-Core绘制图形后PDF文本无法显示问题
问题:iTextSharp绘制图形后文本无法显示(本地环境异常,生产正常)
- 涉事NuGet包:Ben Meredith开发的ItextSharp-LGPL-Core、Vahid Nasiri的iTextSharp.LGPLv2.Core均出现相同问题
- 核心现象:PDF生成时,首次绘制线条/矩形前的文本正常显示,之后所有文本输出消失;注释图形代码后文本恢复正常,但业务需要保留图形元素
- 环境差异:
- 异常环境:Windows 11 Pro(10.0.22631 Build 22631)+ VS 17.13.0,.NET 6/.NET 8项目均复现
- 正常环境:DevOps构建的x64版本在Windows Server 2022运行无异常
- 触发时机:操作系统及Visual Studio重装后首次出现
复现代码
using iTextSharp; using iTextSharp.text; using iTextSharp.text.pdf; using System.Text.RegularExpressions; namespace ConsoleApp1 { internal class Program { static void Main(string[] args) { Program p = new Program(); p.CreatePDFDocument("Hello World"); } string destinationDirectory = "c:\\temp\\"; string filename = ""; public void CreatePDFDocument(string input) { if (!Directory.Exists(destinationDirectory)) { Directory.CreateDirectory(destinationDirectory); } filename = destinationDirectory + "test_pdf.pdf"; System.IO.FileStream fs = new FileStream(filename, FileMode.Create); Document document = new Document(PageSize.A4, 25, 25, 30, 30); PdfWriter writer = PdfWriter.GetInstance(document, fs); document.Open(); document.Add(new Paragraph("Hello World!")); // 初始化字体 BaseFont f_cb = BaseFont.CreateFont("c:\\windows\\fonts\\calibrib.ttf", BaseFont.CP1252, BaseFont.NOT_EMBEDDED); BaseFont f_cn = BaseFont.CreateFont("c:\\windows\\fonts\\calibri.ttf", BaseFont.CP1252, BaseFont.NOT_EMBEDDED); // 启用精确定位 PdfContentByte cb = writer.DirectContent; cb.BeginText(); cb.SetFontAndSize(f_cn, 9); cb.SetTextMatrix(20, 700); cb.ShowText("Hello exact position"); // 绘制线条:取消注释后,下方文本消失 cb.SetLineWidth(0f); cb.MoveTo(30, 650); cb.LineTo(570, 650); cb.Stroke(); cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "This text is left aligned", 200, 800, 0); // 绘制矩形:取消注释后,下方文本消失 cb.Rectangle(300, 600, 100, 100); cb.Stroke(); cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT, "This text is right aligned", 200, 788, 0); // 绘制圆形 cb.SetCMYKColorStroke(255, 255, 0, 0); cb.SetCMYKColorFill(0, 255, 255, 0); cb.SetLineWidth(2f); cb.Circle(120f, 250f, 50f); cb.Fill(); cb.EndText(); document.Close(); writer.Close(); fs.Close(); Console.WriteLine("PDF created successfully."); } } }
解决方案
问题根源
iTextSharp的文本绘制上下文(BeginText()/EndText())内不允许调用图形绘制方法(如Stroke()、Fill())。这些图形操作会自动退出文本模式,后续的文本绘制指令因不在有效文本上下文内,不会被PDF阅读器渲染。
修复步骤
将图形绘制代码移出BeginText()和EndText()的范围,或在每次图形操作后重新进入文本模式并重置字体、文本矩阵等参数:
修复后代码示例
// 启用精确定位 PdfContentByte cb = writer.DirectContent; // 第一部分文本:先绘制文本,再退出文本模式 cb.BeginText(); cb.SetFontAndSize(f_cn, 9); cb.SetTextMatrix(20, 700); cb.ShowText("Hello exact position"); cb.EndText(); // 绘制线条(无需文本模式) cb.SetLineWidth(0f); cb.MoveTo(30, 650); cb.LineTo(570, 650); cb.Stroke(); // 重新进入文本模式绘制下一段文本,需重置字体参数 cb.BeginText(); cb.SetFontAndSize(f_cn, 9); cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "This text is left aligned", 200, 800, 0); cb.EndText(); // 绘制矩形(无需文本模式) cb.Rectangle(300, 600, 100, 100); cb.Stroke(); // 再次进入文本模式绘制文本,重置字体参数 cb.BeginText(); cb.SetFontAndSize(f_cn, 9); cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT, "This text is right aligned", 200, 788, 0); cb.EndText(); // 绘制圆形(无需文本模式) cb.SetCMYKColorStroke(255, 255, 0, 0); cb.SetCMYKColorFill(0, 255, 255, 0); cb.SetLineWidth(2f); cb.Circle(120f, 250f, 50f); cb.Fill();
环境差异说明
生产环境(Windows Server 2022)正常是因为部分PDF阅读器对不符合规范的PDF兼容性更强,但不符合规范的代码存在跨环境失效风险,修复后可确保本地调试与生产环境表现一致。
内容的提问来源于stack exchange,提问作者CppDev
相关产品推荐
相关产品推荐

