@@ -12,6 +12,7 @@ namespace Synercoding.FileFormats.Pdf
1212 /// </summary>
1313 public class PdfWriter : IDisposable
1414 {
15+ private readonly bool _ownsStream ;
1516 private readonly Stream _stream ;
1617 private readonly TableBuilder _tableBuilder = new TableBuilder ( ) ;
1718
@@ -25,12 +26,23 @@ public class PdfWriter : IDisposable
2526 /// </summary>
2627 /// <param name="stream">The <see cref="Stream"/> to write the PDF file</param>
2728 public PdfWriter ( Stream stream )
29+ : this ( stream , true )
30+ { }
31+
32+ /// <summary>
33+ /// Constructor for <see cref="PdfWriter"/>
34+ /// </summary>
35+ /// <param name="stream">The <see cref="Stream"/> to write the PDF file</param>
36+ /// <param name="ownsStream">If the stream is owned, then when this <see cref="PdfWriter"/> is disposed, the stream is also disposed.</param>
37+ public PdfWriter ( Stream stream , bool ownsStream )
2838 {
2939 _stream = stream ;
3040 ( new Header ( ) ) . WriteToStream ( stream ) ;
3141
3242 _pageTreeNode = _tableBuilder . ReserveId ( ) ;
3343 _catalog = _tableBuilder . ReserveId ( ) ;
44+
45+ _ownsStream = ownsStream ;
3446 }
3547
3648 /// <summary>
@@ -66,12 +78,15 @@ public void Dispose()
6678
6779 _stream . Flush ( ) ;
6880
69- _stream . Dispose ( ) ;
81+ if ( _ownsStream )
82+ {
83+ _stream . Dispose ( ) ;
84+ }
7085 }
7186
7287 private void _writePageTree ( )
7388 {
74- _tableBuilder . SetPosition ( _pageTreeNode , ( uint ) _stream . Position ) ;
89+ _tableBuilder . SetPosition ( _pageTreeNode , ( uint ) _stream . Position ) ;
7590
7691 var tree = new PageTree ( _pageTreeNode , _pageReferences ) ;
7792 tree . WriteToStream ( _stream ) ;
@@ -87,13 +102,13 @@ private void _writeCatalog()
87102
88103 private void _writePdfEnding ( )
89104 {
90- if ( ! _tableBuilder . Validate ( ) )
105+ if ( ! _tableBuilder . Validate ( ) )
91106 {
92107 throw new InvalidOperationException ( "XRef table is invalid." ) ;
93108 }
94109
95110 var xRefTable = _tableBuilder . GetXRefTable ( ) ;
96- var xRefPosition = xRefTable . WriteToStream ( _stream ) ;
111+ uint xRefPosition = xRefTable . WriteToStream ( _stream ) ;
97112
98113 var trailer = new Trailer ( xRefPosition , xRefTable . Section . ObjectCount , _catalog . ObjectId ) ;
99114 trailer . WriteToStream ( _stream ) ;
0 commit comments