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

iText 7异常场景下资源如何正确释放?改写CreatePdf方案咨询

iText7 PDF合并代码的资源可靠性优化

原代码存在明显的资源泄漏风险:一旦CreatePdf方法执行过程中抛出异常(比如源PDF读取失败、合并操作出错),后续的Close()调用都不会触发,打开的文件句柄、内存资源无法被正确释放,这种写法不适合生产环境使用。

改写方案(使用using块实现自动资源清理)

利用C#的using块可以自动处理实现了IDisposable接口对象的资源释放,即使发生异常也能保证资源被正确清理,改写后的代码如下:

using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Kernel.Utils;

namespace Tutorial.Chapter06 {
    public class C06E04_88th_Oscar_Combine {
        public const string SRC1 = "../../../resources/pdf/88th_reminder_list.pdf";
        public const string SRC2 = "../../../resources/pdf/88th_noms_announcement.pdf";
        public const string DEST = "../../../results/chapter06/88th_oscar_combined_documents.pdf";

        public static void Main(string[] args) {
            FileInfo file = new FileInfo(DEST);
            file.Directory.Create();
            new C06E04_88th_Oscar_Combine().CreatePdf(DEST);
        }

        public virtual void CreatePdf(string dest) {
            // 使用using包裹所有实现IDisposable的对象,自动完成资源释放
            using (PdfDocument pdf = new PdfDocument(new PdfWriter(dest)))
            using (PdfMerger merger = new PdfMerger(pdf))
            using (PdfDocument firstSourcePdf = new PdfDocument(new PdfReader(SRC1)))
            {
                merger.Merge(firstSourcePdf, 1, firstSourcePdf.GetNumberOfPages());
                
                // 第二个源PDF单独用using块,确保其资源在使用后立即释放
                using (PdfDocument secondSourcePdf = new PdfDocument(new PdfReader(SRC2)))
                {
                    merger.Merge(secondSourcePdf, 1, secondSourcePdf.GetNumberOfPages());
                }
            }
            // 所有资源会在对应using块结束时自动释放,无需手动调用Close()
        }
    }
}

优化说明

  • iText7中的PdfDocument、PdfReader、PdfWriter、PdfMerger均实现了IDisposable接口,using块会在代码块执行完成(包括异常场景)时自动调用Dispose()方法,该方法内部会完成文件关闭、内存释放等清理操作,比手动调用Close()更可靠。
  • 嵌套的using块可以精准控制每个资源的生命周期,避免资源长时间占用或交叉泄漏。

内容的提问来源于stack exchange,提问作者Moe Sisko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:45:37