diff --git a/EnvelopeGenerator.PdfEditor/Pdf.cs b/EnvelopeGenerator.PdfEditor/Pdf.cs index 8b1d39ac..325c2775 100644 --- a/EnvelopeGenerator.PdfEditor/Pdf.cs +++ b/EnvelopeGenerator.PdfEditor/Pdf.cs @@ -24,7 +24,7 @@ namespace EnvelopeGenerator.PdfEditor #endif outputStream = null) { - return new Pdf(stream, outputStream ?? new MemoryStream(), disposeInputStream: false); + return new Pdf(stream, outputStream ?? new MemoryStream(), disposeInputStream: false, disposeOutputStream: outputStream is null); } } @@ -39,8 +39,9 @@ namespace EnvelopeGenerator.PdfEditor private readonly PdfWriter _writer; private readonly bool _disposeInputStream; + private readonly bool _disposeOutputStream; - public Pdf(TInputStream inputStream, TOutputStream outputStream, bool disposeInputStream = true) + public Pdf(TInputStream inputStream, TOutputStream outputStream, bool disposeInputStream = true, bool disposeOutputStream = true) { _inputStream = inputStream; _outputStream = outputStream; @@ -48,6 +49,7 @@ namespace EnvelopeGenerator.PdfEditor _writer = new PdfWriter(outputStream); _doc = new PdfDocument(_reader, _writer); _disposeInputStream = disposeInputStream; + _disposeOutputStream = disposeOutputStream; } /// @@ -160,7 +162,7 @@ namespace EnvelopeGenerator.PdfEditor // Managed resources _doc?.Close(); if (_disposeInputStream) _inputStream?.Dispose(); - _outputStream?.Dispose(); + if(_disposeOutputStream) _outputStream?.Dispose(); } else { @@ -168,7 +170,7 @@ namespace EnvelopeGenerator.PdfEditor // Unmanaged resources such as PdfDocument, PdfReader, and PdfWriter are already IDisposable; we close them here try { _doc?.Close(); } catch { } try { if(_disposeInputStream) _inputStream?.Dispose(); } catch { } - try { _outputStream?.Dispose(); } catch { } + try { if (_disposeOutputStream) _outputStream?.Dispose(); } catch { } } _disposed = true; @@ -188,10 +190,13 @@ namespace EnvelopeGenerator.PdfEditor _inputStream.Dispose(); } - if (_outputStream is IAsyncDisposable asyncOutput) - await asyncOutput.DisposeAsync(); - else - _outputStream?.Dispose(); + if (_disposeOutputStream) + { + if (_outputStream is IAsyncDisposable asyncOutput) + await asyncOutput.DisposeAsync(); + else + _outputStream?.Dispose(); + } _disposed = true; GC.SuppressFinalize(this);