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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:40:56