@@ -12,6 +12,7 @@ namespace Synercoding.FileFormats.Pdf
12
12
/// </summary>
13
13
public class PdfWriter : IDisposable
14
14
{
15
+ private readonly bool _ownsStream ;
15
16
private readonly Stream _stream ;
16
17
private readonly TableBuilder _tableBuilder = new TableBuilder ( ) ;
17
18
@@ -25,12 +26,23 @@ public class PdfWriter : IDisposable
25
26
/// </summary>
26
27
/// <param name="stream">The <see cref="Stream"/> to write the PDF file</param>
27
28
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 )
28
38
{
29
39
_stream = stream ;
30
40
( new Header ( ) ) . WriteToStream ( stream ) ;
31
41
32
42
_pageTreeNode = _tableBuilder . ReserveId ( ) ;
33
43
_catalog = _tableBuilder . ReserveId ( ) ;
44
+
45
+ _ownsStream = ownsStream ;
34
46
}
35
47
36
48
/// <summary>
@@ -66,12 +78,15 @@ public void Dispose()
66
78
67
79
_stream . Flush ( ) ;
68
80
69
- _stream . Dispose ( ) ;
81
+ if ( _ownsStream )
82
+ {
83
+ _stream . Dispose ( ) ;
84
+ }
70
85
}
71
86
72
87
private void _writePageTree ( )
73
88
{
74
- _tableBuilder . SetPosition ( _pageTreeNode , ( uint ) _stream . Position ) ;
89
+ _tableBuilder . SetPosition ( _pageTreeNode , ( uint ) _stream . Position ) ;
75
90
76
91
var tree = new PageTree ( _pageTreeNode , _pageReferences ) ;
77
92
tree . WriteToStream ( _stream ) ;
@@ -87,13 +102,13 @@ private void _writeCatalog()
87
102
88
103
private void _writePdfEnding ( )
89
104
{
90
- if ( ! _tableBuilder . Validate ( ) )
105
+ if ( ! _tableBuilder . Validate ( ) )
91
106
{
92
107
throw new InvalidOperationException ( "XRef table is invalid." ) ;
93
108
}
94
109
95
110
var xRefTable = _tableBuilder . GetXRefTable ( ) ;
96
- var xRefPosition = xRefTable . WriteToStream ( _stream ) ;
111
+ uint xRefPosition = xRefTable . WriteToStream ( _stream ) ;
97
112
98
113
var trailer = new Trailer ( xRefPosition , xRefTable . Section . ObjectCount , _catalog . ObjectId ) ;
99
114
trailer . WriteToStream ( _stream ) ;
0 commit comments