refactor(pdf): add output stream disposal management to Pdf class

- Added `disposeOutputStream` parameter to Pdf constructor
- Updated `FromMemory` to set output stream disposal based on null value
- Ensured proper cleanup of output stream in Dispose and DisposeAsync methods
- Improved resource management to prevent potential memory leaks
This commit is contained in:
tekh 2025-10-23 14:34:57 +02:00
parent 75d975223e
commit 7912469709

View File

@ -24,7 +24,7 @@ namespace EnvelopeGenerator.PdfEditor
#endif
outputStream = null)
{
return new Pdf<MemoryStream, MemoryStream>(stream, outputStream ?? new MemoryStream(), disposeInputStream: false);
return new Pdf<MemoryStream, MemoryStream>(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;
}
/// <summary>
@ -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);