Showing
2 changed files
with
28 additions
and
46 deletions
@@ -15,6 +15,7 @@ | @@ -15,6 +15,7 @@ | ||
15 | - Improve Documents conformity | 15 | - Improve Documents conformity |
16 | - Make PdfXref a PdfIndirect descendent | 16 | - Make PdfXref a PdfIndirect descendent |
17 | - Move Pdf generation settings to PdfSettings | 17 | - Move Pdf generation settings to PdfSettings |
18 | +- Improve PdfXrefTable output | ||
18 | 19 | ||
19 | ## 3.9.0 | 20 | ## 3.9.0 |
20 | 21 |
@@ -99,9 +99,6 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | @@ -99,9 +99,6 @@ 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 | - /// Contains the offset of each objects | ||
103 | - final _offsets = <PdfXref>[]; | ||
104 | - | ||
105 | /// Writes a block of references to the Pdf file | 102 | /// Writes a block of references to the Pdf file |
106 | void _writeBlock(PdfStream s, int firstId, List<PdfXref> block) { | 103 | void _writeBlock(PdfStream s, int firstId, List<PdfXref> block) { |
107 | s.putString('$firstId ${block.length}\n'); | 104 | s.putString('$firstId ${block.length}\n'); |
@@ -137,21 +134,34 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | @@ -137,21 +134,34 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | ||
137 | return true; | 134 | return true; |
138 | }()); | 135 | }()); |
139 | 136 | ||
137 | + final xrefList = <PdfXref>[]; | ||
140 | for (final ob in objects) { | 138 | for (final ob in objects) { |
141 | final offset = ob.output(s); | 139 | final offset = ob.output(s); |
142 | - _offsets.add(PdfXref(ob.objser, offset, gen: ob.objgen)); | 140 | + xrefList.add(PdfXref(ob.objser, offset, gen: ob.objgen)); |
143 | } | 141 | } |
144 | 142 | ||
143 | + assert(() { | ||
144 | + if (o.settings.verbose) { | ||
145 | + s.putComment(''); | ||
146 | + s.putComment('-' * 78); | ||
147 | + s.putComment('$runtimeType ${o.settings.version.name}'); | ||
148 | + for (final x in xrefList) { | ||
149 | + s.putComment(' $x'); | ||
150 | + } | ||
151 | + } | ||
152 | + return true; | ||
153 | + }()); | ||
154 | + | ||
145 | final int xrefOffset; | 155 | final int xrefOffset; |
146 | 156 | ||
147 | params['/Root'] = o.ref(); | 157 | params['/Root'] = o.ref(); |
148 | 158 | ||
149 | switch (o.settings.version) { | 159 | switch (o.settings.version) { |
150 | case PdfVersion.pdf_1_4: | 160 | case PdfVersion.pdf_1_4: |
151 | - xrefOffset = outputLegacy(o, s); | 161 | + xrefOffset = _outputLegacy(o, s, xrefList); |
152 | break; | 162 | break; |
153 | case PdfVersion.pdf_1_5: | 163 | case PdfVersion.pdf_1_5: |
154 | - xrefOffset = outputCompressed(o, s); | 164 | + xrefOffset = _outputCompressed(o, s, xrefList); |
155 | break; | 165 | break; |
156 | } | 166 | } |
157 | 167 | ||
@@ -159,7 +169,6 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | @@ -159,7 +169,6 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | ||
159 | if (o.settings.verbose) { | 169 | if (o.settings.verbose) { |
160 | s.putComment(''); | 170 | s.putComment(''); |
161 | s.putComment('-' * 78); | 171 | s.putComment('-' * 78); |
162 | - s.putComment('$runtimeType'); | ||
163 | } | 172 | } |
164 | return true; | 173 | return true; |
165 | }()); | 174 | }()); |
@@ -180,28 +189,10 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | @@ -180,28 +189,10 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | ||
180 | }()); | 189 | }()); |
181 | } | 190 | } |
182 | 191 | ||
183 | - @override | ||
184 | - String toString() { | ||
185 | - final s = StringBuffer(); | ||
186 | - for (final x in _offsets) { | ||
187 | - s.writeln(' $x'); | ||
188 | - } | ||
189 | - return s.toString(); | ||
190 | - } | ||
191 | - | ||
192 | - int outputLegacy(PdfObjectBase o, PdfStream s) { | 192 | + int _outputLegacy(PdfObjectBase o, PdfStream s, List<PdfXref> xrefList) { |
193 | // Now scan through the offsets list. They should be in sequence. | 193 | // Now scan through the offsets list. They should be in sequence. |
194 | - _offsets.sort((a, b) => a.ser.compareTo(b.ser)); | ||
195 | - final size = _offsets.last.ser + 1; | ||
196 | - | ||
197 | - assert(() { | ||
198 | - if (o.settings.verbose) { | ||
199 | - s.putComment(''); | ||
200 | - s.putComment('-' * 78); | ||
201 | - s.putComment('$runtimeType ${o.settings.version.name}\n$this'); | ||
202 | - } | ||
203 | - return true; | ||
204 | - }()); | 194 | + xrefList.sort((a, b) => a.ser.compareTo(b.ser)); |
195 | + final size = xrefList.last.ser + 1; | ||
205 | 196 | ||
206 | var firstId = 0; // First id in block | 197 | var firstId = 0; // First id in block |
207 | var lastId = 0; // The last id used | 198 | var lastId = 0; // The last id used |
@@ -218,7 +209,7 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | @@ -218,7 +209,7 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | ||
218 | final objOffset = s.offset; | 209 | final objOffset = s.offset; |
219 | s.putString('xref\n'); | 210 | s.putString('xref\n'); |
220 | 211 | ||
221 | - for (final x in _offsets) { | 212 | + for (final x in xrefList) { |
222 | // check to see if block is in range | 213 | // check to see if block is in range |
223 | if (x.ser != (lastId + 1)) { | 214 | if (x.ser != (lastId + 1)) { |
224 | // no, so write this block, and reset | 215 | // no, so write this block, and reset |
@@ -251,16 +242,16 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | @@ -251,16 +242,16 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | ||
251 | } | 242 | } |
252 | 243 | ||
253 | /// Output a compressed cross-reference table | 244 | /// Output a compressed cross-reference table |
254 | - int outputCompressed(PdfObjectBase o, PdfStream s) { | 245 | + int _outputCompressed(PdfObjectBase o, PdfStream s, List<PdfXref> xrefList) { |
255 | final offset = s.offset; | 246 | final offset = s.offset; |
256 | 247 | ||
257 | // Sort all references | 248 | // Sort all references |
258 | - _offsets.sort((a, b) => a.ser.compareTo(b.ser)); | 249 | + xrefList.sort((a, b) => a.ser.compareTo(b.ser)); |
259 | 250 | ||
260 | // Write this object too | 251 | // Write this object too |
261 | - final id = _offsets.last.ser + 1; | 252 | + final id = xrefList.last.ser + 1; |
262 | final size = id + 1; | 253 | final size = id + 1; |
263 | - _offsets.add(PdfXref(id, offset)); | 254 | + xrefList.add(PdfXref(id, offset)); |
264 | 255 | ||
265 | params['/Type'] = const PdfName('/XRef'); | 256 | params['/Type'] = const PdfName('/XRef'); |
266 | params['/Size'] = PdfNum(size); | 257 | params['/Size'] = PdfNum(size); |
@@ -272,7 +263,7 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | @@ -272,7 +263,7 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | ||
272 | // We need block 0 to exist | 263 | // We need block 0 to exist |
273 | blocks.add(firstId); | 264 | blocks.add(firstId); |
274 | 265 | ||
275 | - for (final x in _offsets) { | 266 | + for (final x in xrefList) { |
276 | // check to see if block is in range | 267 | // check to see if block is in range |
277 | if (x.ser != (lastId + 1)) { | 268 | if (x.ser != (lastId + 1)) { |
278 | // no, so store this block, and reset | 269 | // no, so store this block, and reset |
@@ -293,25 +284,15 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | @@ -293,25 +284,15 @@ class PdfXrefTable extends PdfDataType with PdfDiagnostic { | ||
293 | params['/W'] = PdfArray.fromNum(w); | 284 | params['/W'] = PdfArray.fromNum(w); |
294 | final wl = w.reduce((a, b) => a + b); | 285 | final wl = w.reduce((a, b) => a + b); |
295 | 286 | ||
296 | - final binOffsets = ByteData((_offsets.length + 1) * wl); | 287 | + final binOffsets = ByteData((xrefList.length + 1) * wl); |
297 | var ofs = 0; | 288 | var ofs = 0; |
298 | // Write offset zero, all zeros | 289 | // Write offset zero, all zeros |
299 | ofs += wl; | 290 | ofs += wl; |
300 | 291 | ||
301 | - for (final x in _offsets) { | 292 | + for (final x in xrefList) { |
302 | ofs = x._compressedRef(binOffsets, ofs, w); | 293 | ofs = x._compressedRef(binOffsets, ofs, w); |
303 | } | 294 | } |
304 | 295 | ||
305 | - // Write the object | ||
306 | - assert(() { | ||
307 | - if (o.settings.verbose) { | ||
308 | - s.putComment(''); | ||
309 | - s.putComment('-' * 78); | ||
310 | - s.putComment('$runtimeType ${o.settings.version.name}\n$this'); | ||
311 | - } | ||
312 | - return true; | ||
313 | - }()); | ||
314 | - | ||
315 | final objOffset = s.offset; | 296 | final objOffset = s.offset; |
316 | 297 | ||
317 | PdfObjectBase( | 298 | PdfObjectBase( |
-
Please register or login to post a comment