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

使用iTextSharp解密PDF生产环境异常求助:IIS重启后短时可用

解决iTextSharp生产环境PDF解密失效问题

问题核心分析

你的代码在本地正常但生产环境短期失效,大概率是资源泄漏或线程安全问题导致——iTextSharp的PdfReader、PdfStamper未正确释放,长期运行耗尽IIS进程资源;同时多线程环境下非线程安全的对象共享会导致状态混乱。

修正后的代码

首先修复资源释放逻辑,用using包裹所有实现IDisposable的对象,确保资源自动回收,同时显式清除加密标识:

string InputFile = @"C:\Users\Pro.pdf";
string OutputFile = @"C:\Users\DecPro.pdf";
string password = @"pswd123"; // 你的密码
try
{
    // 使用using自动释放PdfReader,避免资源泄漏
    using (PdfReader reader = new PdfReader(InputFile, ASCIIEncoding.ASCII.GetBytes(password)))
    {
        // 显式去除PDF的使用权限限制(如果有)
        reader.RemoveUsageRights();
        reader.SetUnethicalReading(true);

        using (MemoryStream memoryStream = new MemoryStream())
        {
            // 使用using自动释放PdfStamper
            using (PdfStamper stamper = new PdfStamper(reader, memoryStream))
            {
                // 强制设置输出PDF不加密
                stamper.Writer.SetEncryption(null, null, 0, 0);
            }

            // 重置内存流位置后再写入文件,避免空内容
            memoryStream.Position = 0;
            File.WriteAllBytes(OutputFile, memoryStream.ToArray());
        }
    }
}
catch (Exception err)
{
    // 生产环境建议记录完整异常堆栈,而非仅消息
    Console.WriteLine($"错误详情:{err.Message}\n堆栈:{err.StackTrace}");
}

额外排查与修复步骤

  1. 权限检查

    • 确认IIS应用程序池身份(如IIS AppPool\你的池名称)对输入/输出文件路径有读写权限,避免因权限不足导致写入失败,表现为解密失效。
  2. 线程安全验证

    • iTextSharp的PdfReader、PdfStamper不是线程安全对象,确保每个请求都创建独立实例,不要在全局或静态变量中共享这些对象。
  3. 资源监控

    • 问题出现后,查看任务管理器中w3wp.exe的内存、句柄数,如果持续增长,说明资源泄漏未彻底解决,需进一步检查代码中其他未释放的资源。
  4. 版本升级

    • 若使用旧版iTextSharp,尝试升级到5.5.13.3等稳定版本,旧版本存在已知的内存泄漏和线程安全bug。

内容的提问来源于stack exchange,提问作者Prachi Dabholkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:25:46