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

PdfStamper无法向现有PDF添加文本:代码无报错未生效求助

排查iTextSharp PdfStamper添加文本不显示的问题

我帮你梳理下代码里的几个关键问题,这些就是导致文本没成功添加的核心原因:

  • 内存流作用域错误:你在using块内创建了memoryStream,但在块外尝试调用memoryStream.ToArray()——当using块执行完毕,内存流已经被自动释放,根本拿不到写入后的PDF内容,这是最致命的问题。
  • 字体初始化存在隐患:new iTextSharp.text.Font(null, 10, ...)传入null作为字体参数,可能导致iTextSharp无法正确加载字体,进而无法渲染文本。
  • 页面选择逻辑混乱:你先获取了总页数numberOfPages,又调用reader.SelectPages("1-100")筛选页面,但最终只给numberOfPages对应的单页添加内容,如果你的目标是给所有选中页面加文本,这个逻辑完全不对;如果只是想给某一页(比如第一页)加文本,应该直接指定页码。
  • 对齐常量混用:代码里同时用了Element.ALIGN_LEFT和PdfContentByte.ALIGN_LEFT,虽然数值相同,但统一用Element类的常量更规范,避免潜在的兼容性问题。

修正后的代码示例

else {
    if (document.State != DocumentState.Signed)
        document.State = DocumentState.Signed;
    document.ActionedUser = user;
    document.ActionDate = DateTime.Now;
    document.SignedFileData = response.Document.SignedFileBytes;
    
    #region 添加文本到PDF
    byte[] stampedPdfBytes;
    // 创建MemoryStream并在using块内完成所有操作,最后直接获取字节数组
    using (MemoryStream memoryStream = new MemoryStream())
    {
        using (PdfReader reader = new PdfReader(document.EditedFileData))
        using (PdfStamper stamper = new PdfStamper(reader, memoryStream))
        {
            // 如果你想给所有页面加文本,可以循环遍历页码
            int totalPages = reader.NumberOfPages;
            // 初始化正确的字体,避免null参数问题
            BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, 10, iTextSharp.text.Font.NORMAL, BaseColor.RED);
            
            string FirstName = "Testing";
            string Position = "Testing";
            string Signature = "Testing";
            string SignatureDate = DateTime.Now.ToString();
            
            // 示例:给最后一页添加文本,如果你想给所有页面加,改成循环for(int i=1; i<=totalPages; i++)
            int targetPage = totalPages;
            PdfContentByte pbover = stamper.GetOverContent(targetPage);
            
            // 统一使用Element.ALIGN_LEFT常量
            ColumnText.ShowTextAligned(pbover, Element.ALIGN_LEFT, new Phrase(FirstName, font), 240, 715, 0);
            ColumnText.ShowTextAligned(pbover, Element.ALIGN_LEFT, new Phrase(Position, font), 230, 628, 0);
            ColumnText.ShowTextAligned(pbover, Element.ALIGN_LEFT, new Phrase(Signature, font), 230, 600, 0);
            ColumnText.ShowTextAligned(pbover, Element.ALIGN_LEFT, new Phrase(SignatureDate, font), 230, 574, 0);
        }
        // 在using块内(memoryStream未释放时)获取字节数组
        stampedPdfBytes = memoryStream.ToArray();
    }
    #endregion
    
    // 保存处理后的PDF字节数组
    document.SignedFileData = stampedPdfBytes;
    Context.SaveChanges();
    return new SignatureSoapResponse() { Success = true, Message = document.Id.ToString() };
}

关键修改说明

  1. 将stampedPdfBytes作为外部变量,在memoryStream的using块内获取字节数组,确保流未被释放时读取内容。
  2. 使用BaseFont.CreateFont()初始化字体,避免传入null导致的字体加载失败。
  3. 明确目标页面(示例为最后一页),如果需要给所有页面添加文本,只需改成循环遍历页码即可。
  4. 统一使用Element.ALIGN_LEFT作为对齐常量,保持代码规范。

内容的提问来源于stack exchange,提问作者IT Forward

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:12:49