Showing
1 changed file
with
26 additions
and
16 deletions
@@ -21,30 +21,35 @@ import 'package:pdf/src/pdf/stream.dart'; | @@ -21,30 +21,35 @@ import 'package:pdf/src/pdf/stream.dart'; | ||
21 | import 'data_types.dart'; | 21 | import 'data_types.dart'; |
22 | import 'object.dart'; | 22 | import 'object.dart'; |
23 | 23 | ||
24 | +enum PdfCrossRefEntryType { free, inUse } | ||
25 | + | ||
24 | /// Cross-reference for a Pdf Object | 26 | /// Cross-reference for a Pdf Object |
25 | class PdfXref { | 27 | class PdfXref { |
26 | /// Creates a cross-reference for a Pdf Object | 28 | /// Creates a cross-reference for a Pdf Object |
27 | - PdfXref(this.id, this.offset, {this.generation = 0}); | 29 | + const PdfXref( |
30 | + this.id, | ||
31 | + this.offset, { | ||
32 | + this.generation = 0, | ||
33 | + this.type = PdfCrossRefEntryType.inUse, | ||
34 | + }); | ||
28 | 35 | ||
29 | /// The id of a Pdf Object | 36 | /// The id of a Pdf Object |
30 | - int id; | 37 | + final int id; |
31 | 38 | ||
32 | /// The offset within the Pdf file | 39 | /// The offset within the Pdf file |
33 | - int offset; | 40 | + final int offset; |
34 | 41 | ||
35 | /// The generation of the object, usually 0 | 42 | /// The generation of the object, usually 0 |
36 | - int generation = 0; | 43 | + final int generation; |
44 | + | ||
45 | + final PdfCrossRefEntryType type; | ||
37 | 46 | ||
38 | /// The xref in the format of the xref section in the Pdf file | 47 | /// The xref in the format of the xref section in the Pdf file |
39 | String ref() { | 48 | String ref() { |
40 | - final rs = offset.toString().padLeft(10, '0') + | 49 | + return offset.toString().padLeft(10, '0') + |
41 | ' ' + | 50 | ' ' + |
42 | - generation.toString().padLeft(5, '0'); | ||
43 | - | ||
44 | - if (generation == 65535) { | ||
45 | - return rs + ' f '; | ||
46 | - } | ||
47 | - return rs + ' n '; | 51 | + generation.toString().padLeft(5, '0') + |
52 | + (type == PdfCrossRefEntryType.inUse ? ' n ' : ' f '); | ||
48 | } | 53 | } |
49 | 54 | ||
50 | /// The xref in the format of the compressed xref section in the Pdf file | 55 | /// The xref in the format of the compressed xref section in the Pdf file |
@@ -58,7 +63,7 @@ class PdfXref { | @@ -58,7 +63,7 @@ class PdfXref { | ||
58 | } | 63 | } |
59 | } | 64 | } |
60 | 65 | ||
61 | - setVal(w[0], 1); | 66 | + setVal(w[0], type == PdfCrossRefEntryType.inUse ? 1 : 0); |
62 | setVal(w[1], offset); | 67 | setVal(w[1], offset); |
63 | setVal(w[2], generation); | 68 | setVal(w[2], generation); |
64 | 69 | ||
@@ -75,7 +80,7 @@ class PdfXref { | @@ -75,7 +80,7 @@ class PdfXref { | ||
75 | } | 80 | } |
76 | 81 | ||
77 | @override | 82 | @override |
78 | - String toString() => '$runtimeType $id $generation $offset'; | 83 | + String toString() => '$runtimeType $id $generation $offset $type'; |
79 | 84 | ||
80 | @override | 85 | @override |
81 | int get hashCode => offset; | 86 | int get hashCode => offset; |
@@ -114,7 +119,12 @@ class PdfXrefTable extends PdfDataType { | @@ -114,7 +119,12 @@ class PdfXrefTable extends PdfDataType { | ||
114 | final block = <PdfXref>[]; // xrefs in this block | 119 | final block = <PdfXref>[]; // xrefs in this block |
115 | 120 | ||
116 | // We need block 0 to exist | 121 | // We need block 0 to exist |
117 | - block.add(PdfXref(0, 0, generation: 65535)); | 122 | + block.add(const PdfXref( |
123 | + 0, | ||
124 | + 0, | ||
125 | + generation: 65535, | ||
126 | + type: PdfCrossRefEntryType.free, | ||
127 | + )); | ||
118 | 128 | ||
119 | for (var x in offsets) { | 129 | for (var x in offsets) { |
120 | // check to see if block is in range | 130 | // check to see if block is in range |
@@ -181,7 +191,7 @@ class PdfXrefTable extends PdfDataType { | @@ -181,7 +191,7 @@ class PdfXrefTable extends PdfDataType { | ||
181 | params['/W'] = PdfArray.fromNum(w); | 191 | params['/W'] = PdfArray.fromNum(w); |
182 | final wl = w.reduce((a, b) => a + b); | 192 | final wl = w.reduce((a, b) => a + b); |
183 | 193 | ||
184 | - final o = ByteData((offsets.length + 2) * wl); | 194 | + final o = ByteData((offsets.length + 1) * wl); |
185 | var ofs = 0; | 195 | var ofs = 0; |
186 | // Write offset zero, all zeros | 196 | // Write offset zero, all zeros |
187 | ofs += wl; | 197 | ofs += wl; |
@@ -194,7 +204,7 @@ class PdfXrefTable extends PdfDataType { | @@ -194,7 +204,7 @@ class PdfXrefTable extends PdfDataType { | ||
194 | PdfDictStream( | 204 | PdfDictStream( |
195 | object: object, | 205 | object: object, |
196 | data: o.buffer.asUint8List(), | 206 | data: o.buffer.asUint8List(), |
197 | - isBinary: true, | 207 | + isBinary: false, |
198 | encrypt: false, | 208 | encrypt: false, |
199 | values: params.values, | 209 | values: params.values, |
200 | ).output(s); | 210 | ).output(s); |
-
Please register or login to post a comment