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
相关产品推荐
相关产品推荐

