David PHAM-VAN

Allow saving an unmodified document

@@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
7 - Improve PdfArray and PdfDict constructors 7 - Improve PdfArray and PdfDict constructors
8 - Fix underline on spans [RomanIvn] 8 - Fix underline on spans [RomanIvn]
9 - Improve verbose output 9 - Improve verbose output
  10 +- Allow saving an unmodified document
10 11
11 ## 3.10.1 12 ## 3.10.1
12 13
@@ -219,7 +219,7 @@ class PdfDocument { @@ -219,7 +219,7 @@ class PdfDocument {
219 Future<void> _write(PdfStream os) async { 219 Future<void> _write(PdfStream os) async {
220 PdfSignature? signature; 220 PdfSignature? signature;
221 221
222 - final xref = PdfXrefTable(); 222 + final xref = PdfXrefTable(lastObjectId: _objser);
223 223
224 for (final ob in objects.where((e) => e.inUse)) { 224 for (final ob in objects.where((e) => e.inUse)) {
225 ob.prepare(); 225 ob.prepare();
@@ -91,7 +91,7 @@ class PdfXref extends PdfIndirect { @@ -91,7 +91,7 @@ class PdfXref extends PdfIndirect {
91 } 91 }
92 92
93 class PdfXrefTable extends PdfDataType with PdfDiagnostic { 93 class PdfXrefTable extends PdfDataType with PdfDiagnostic {
94 - PdfXrefTable(); 94 + PdfXrefTable({this.lastObjectId = 0});
95 95
96 /// Document root point 96 /// Document root point
97 final params = PdfDict(); 97 final params = PdfDict();
@@ -99,6 +99,8 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { @@ -99,6 +99,8 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic {
99 /// List of objects to write 99 /// List of objects to write
100 final objects = <PdfObjectBase>{}; 100 final objects = <PdfObjectBase>{};
101 101
  102 + final int lastObjectId;
  103 +
102 /// Writes a block of references to the Pdf file 104 /// Writes a block of references to the Pdf file
103 void _writeBlock(PdfStream s, int firstId, List<PdfXref> block) { 105 void _writeBlock(PdfStream s, int firstId, List<PdfXref> block) {
104 s.putString('$firstId ${block.length}\n'); 106 s.putString('$firstId ${block.length}\n');
@@ -192,7 +194,7 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { @@ -192,7 +194,7 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic {
192 int _outputLegacy(PdfObjectBase o, PdfStream s, List<PdfXref> xrefList) { 194 int _outputLegacy(PdfObjectBase o, PdfStream s, List<PdfXref> xrefList) {
193 // Now scan through the offsets list. They should be in sequence. 195 // Now scan through the offsets list. They should be in sequence.
194 xrefList.sort((a, b) => a.ser.compareTo(b.ser)); 196 xrefList.sort((a, b) => a.ser.compareTo(b.ser));
195 - final size = xrefList.last.ser + 1; 197 + final size = math.max(lastObjectId, xrefList.last.ser + 1);
196 198
197 var firstId = 0; // First id in block 199 var firstId = 0; // First id in block
198 var lastId = 0; // The last id used 200 var lastId = 0; // The last id used
@@ -249,7 +251,7 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { @@ -249,7 +251,7 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic {
249 xrefList.sort((a, b) => a.ser.compareTo(b.ser)); 251 xrefList.sort((a, b) => a.ser.compareTo(b.ser));
250 252
251 // Write this object too 253 // Write this object too
252 - final id = xrefList.last.ser + 1; 254 + final id = math.max(lastObjectId, xrefList.last.ser + 1);
253 final size = id + 1; 255 final size = id + 1;
254 xrefList.add(PdfXref(id, offset)); 256 xrefList.add(PdfXref(id, offset));
255 257