You need to enable JavaScript to run this app. C# PdfStamper运行抛出“未将对象引用设置到对象的实例”错误求解
优惠活动
大模型
产品
解决方案
定价
更多

C# PdfStamper运行抛出“未将对象引用设置到对象的实例”错误求解

问题根因排查

  • 第一是空值校验逻辑和顺序完全错误:你把路径空校验放在了PdfReader实例化之后,要是pdfTemplate本身为空,在执行new PdfReader(pdfTemplate)的时候就已经可能触发空引用;且你的校验条件用了&&逻辑与,只有两个路径同时为空才会拦截,只要其中一个不为空代码就会继续执行,完全起不到校验作用。
  • 第二是PdfStamper构造的入参没有做有效性校验:你直接把new FileStream(...)的返回值传入构造方法,要是FileStream创建失败(比如路径无写入权限、文件被占用),就会把空引用传入PdfStamper触发报错。
  • 第三是你贴出的代码中pdfTemplate、newFile看起来是类全局变量,存在被其他逻辑意外修改、或者多线程场景下被篡改的可能。

修复方案

调整后的代码参考如下:

private void FillFormChg()
{
    // 方法内局部变量存储路径,避免全局变量被篡改
    string pdfTemplate = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Slip.pdf");
    string newFile = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "SlipTemp.pdf");

    try
    {
        // 先做路径和文件存在性校验,再使用路径
        if (string.IsNullOrWhiteSpace(pdfTemplate) || string.IsNullOrWhiteSpace(newFile))
        {
            MessageBox.Show("路径参数为空!");
            return;
        }
        if (!System.IO.File.Exists(pdfTemplate))
        {
            MessageBox.Show("模板文件不存在!");
            return;
        }

        using (PdfReader pdfReader = new PdfReader(pdfTemplate))
        using (FileStream fs = new FileStream(newFile, FileMode.OpenOrCreate, FileAccess.ReadWrite))
        {
            PdfStamper pdfStamper = new PdfStamper(pdfReader, fs);
            pdfStamper.Writer.CloseStream = false;
            AcroFields pdfFormFields = pdfStamper.AcroFields;
            // 后续业务逻辑
        }
    }
    catch (Exception ex)
    {
        // 打印完整异常和内部异常,定位具体空对象
        MessageBox.Show($"报错信息:{ex.Message}\n内部异常:{ex.InnerException?.Message}\n堆栈:{ex.StackTrace}");
    }
}

如果调整后还是报错,直接看捕获到的内部异常信息,就能精准定位到底是哪个对象为空。

内容的提问来源于stack exchange,提问作者s.d.c321

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 04:15:03