Showing
3 changed files
with
28 additions
and
6 deletions
| @@ -9,6 +9,7 @@ | @@ -9,6 +9,7 @@ | ||
| 9 | - Improve verbose output | 9 | - Improve verbose output |
| 10 | - Import already defined form | 10 | - Import already defined form |
| 11 | - Add support for deleted objects | 11 | - Add support for deleted objects |
| 12 | +- Draw page content only if not empty | ||
| 12 | 13 | ||
| 13 | ## 3.9.0 | 14 | ## 3.9.0 |
| 14 | 15 |
| @@ -123,6 +123,9 @@ class PdfGraphics { | @@ -123,6 +123,9 @@ class PdfGraphics { | ||
| 123 | /// Default font if none selected | 123 | /// Default font if none selected |
| 124 | PdfFont? get defaultFont => _page.getDefaultFont(); | 124 | PdfFont? get defaultFont => _page.getDefaultFont(); |
| 125 | 125 | ||
| 126 | + bool _altered = false; | ||
| 127 | + bool get altered => _altered; | ||
| 128 | + | ||
| 126 | /// Draw a surface on the previously defined shape | 129 | /// Draw a surface on the previously defined shape |
| 127 | /// set evenOdd to false to use the nonzero winding number rule to determine the region to fill and to true to use the even-odd rule to determine the region to fill | 130 | /// set evenOdd to false to use the nonzero winding number rule to determine the region to fill and to true to use the even-odd rule to determine the region to fill |
| 128 | void fillPath({bool evenOdd = false}) { | 131 | void fillPath({bool evenOdd = false}) { |
| @@ -136,6 +139,7 @@ class PdfGraphics { | @@ -136,6 +139,7 @@ class PdfGraphics { | ||
| 136 | }()); | 139 | }()); |
| 137 | 140 | ||
| 138 | _buf.putString('f${evenOdd ? '*' : ''} '); | 141 | _buf.putString('f${evenOdd ? '*' : ''} '); |
| 142 | + _altered = true; | ||
| 139 | 143 | ||
| 140 | assert(() { | 144 | assert(() { |
| 141 | if (_page.pdfDocument.verbose) { | 145 | if (_page.pdfDocument.verbose) { |
| @@ -158,6 +162,7 @@ class PdfGraphics { | @@ -158,6 +162,7 @@ class PdfGraphics { | ||
| 158 | }()); | 162 | }()); |
| 159 | 163 | ||
| 160 | _buf.putString('${close ? 's' : 'S'} '); | 164 | _buf.putString('${close ? 's' : 'S'} '); |
| 165 | + _altered = true; | ||
| 161 | 166 | ||
| 162 | assert(() { | 167 | assert(() { |
| 163 | if (_page.pdfDocument.verbose) { | 168 | if (_page.pdfDocument.verbose) { |
| @@ -178,6 +183,7 @@ class PdfGraphics { | @@ -178,6 +183,7 @@ class PdfGraphics { | ||
| 178 | }()); | 183 | }()); |
| 179 | 184 | ||
| 180 | _buf.putString('h '); | 185 | _buf.putString('h '); |
| 186 | + _altered = true; | ||
| 181 | 187 | ||
| 182 | assert(() { | 188 | assert(() { |
| 183 | if (_page.pdfDocument.verbose) { | 189 | if (_page.pdfDocument.verbose) { |
| @@ -224,6 +230,7 @@ class PdfGraphics { | @@ -224,6 +230,7 @@ class PdfGraphics { | ||
| 224 | }()); | 230 | }()); |
| 225 | 231 | ||
| 226 | _buf.putString('${close ? 'b' : 'B'}${evenOdd ? '*' : ''} '); | 232 | _buf.putString('${close ? 'b' : 'B'}${evenOdd ? '*' : ''} '); |
| 233 | + _altered = true; | ||
| 227 | 234 | ||
| 228 | assert(() { | 235 | assert(() { |
| 229 | if (_page.pdfDocument.verbose) { | 236 | if (_page.pdfDocument.verbose) { |
| @@ -248,6 +255,7 @@ class PdfGraphics { | @@ -248,6 +255,7 @@ class PdfGraphics { | ||
| 248 | // The shader needs to be registered in the page resources | 255 | // The shader needs to be registered in the page resources |
| 249 | _page.addShader(shader); | 256 | _page.addShader(shader); |
| 250 | _buf.putString('${shader.name} sh '); | 257 | _buf.putString('${shader.name} sh '); |
| 258 | + _altered = true; | ||
| 251 | 259 | ||
| 252 | assert(() { | 260 | assert(() { |
| 253 | if (_page.pdfDocument.verbose) { | 261 | if (_page.pdfDocument.verbose) { |
| @@ -354,7 +362,7 @@ class PdfGraphics { | @@ -354,7 +362,7 @@ class PdfGraphics { | ||
| 354 | } | 362 | } |
| 355 | 363 | ||
| 356 | _buf.putString(' cm ${img.name} Do Q '); | 364 | _buf.putString(' cm ${img.name} Do Q '); |
| 357 | - } | 365 | + _altered = true; |
| 358 | 366 | ||
| 359 | assert(() { | 367 | assert(() { |
| 360 | if (_page.pdfDocument.verbose) { | 368 | if (_page.pdfDocument.verbose) { |
| @@ -571,6 +579,7 @@ class PdfGraphics { | @@ -571,6 +579,7 @@ class PdfGraphics { | ||
| 571 | return true; | 579 | return true; |
| 572 | }()); | 580 | }()); |
| 573 | 581 | ||
| 582 | + _altered = true; | ||
| 574 | } | 583 | } |
| 575 | 584 | ||
| 576 | void reset() { | 585 | void reset() { |
| @@ -20,6 +20,7 @@ import '../graphics.dart'; | @@ -20,6 +20,7 @@ import '../graphics.dart'; | ||
| 20 | import '../page_format.dart'; | 20 | import '../page_format.dart'; |
| 21 | import 'annotation.dart'; | 21 | import 'annotation.dart'; |
| 22 | import 'graphic_stream.dart'; | 22 | import 'graphic_stream.dart'; |
| 23 | +import 'object.dart'; | ||
| 23 | import 'object_dict.dart'; | 24 | import 'object_dict.dart'; |
| 24 | import 'object_stream.dart'; | 25 | import 'object_stream.dart'; |
| 25 | 26 | ||
| @@ -64,11 +65,13 @@ class PdfPage extends PdfObjectDict with PdfGraphicStream { | @@ -64,11 +65,13 @@ class PdfPage extends PdfObjectDict with PdfGraphicStream { | ||
| 64 | PdfPageRotation rotate; | 65 | PdfPageRotation rotate; |
| 65 | 66 | ||
| 66 | /// This holds the contents of the page. | 67 | /// This holds the contents of the page. |
| 67 | - final contents = <PdfObjectStream>[]; | 68 | + final contents = <PdfObject>[]; |
| 68 | 69 | ||
| 69 | /// This holds any Annotations contained within this page. | 70 | /// This holds any Annotations contained within this page. |
| 70 | final annotations = <PdfAnnot>[]; | 71 | final annotations = <PdfAnnot>[]; |
| 71 | 72 | ||
| 73 | + final _contentGraphics = <PdfObject, PdfGraphics>{}; | ||
| 74 | + | ||
| 72 | /// This returns a [PdfGraphics] object, which can then be used to render | 75 | /// This returns a [PdfGraphics] object, which can then be used to render |
| 73 | /// on to this page. If a previous [PdfGraphics] object was used, this object | 76 | /// on to this page. If a previous [PdfGraphics] object was used, this object |
| 74 | /// is appended to the page, and will be drawn over the top of any previous | 77 | /// is appended to the page, and will be drawn over the top of any previous |
| @@ -76,6 +79,7 @@ class PdfPage extends PdfObjectDict with PdfGraphicStream { | @@ -76,6 +79,7 @@ class PdfPage extends PdfObjectDict with PdfGraphicStream { | ||
| 76 | PdfGraphics getGraphics() { | 79 | PdfGraphics getGraphics() { |
| 77 | final stream = PdfObjectStream(pdfDocument); | 80 | final stream = PdfObjectStream(pdfDocument); |
| 78 | final g = PdfGraphics(this, stream.buf); | 81 | final g = PdfGraphics(this, stream.buf); |
| 82 | + _contentGraphics[stream] = g; | ||
| 79 | contents.add(stream); | 83 | contents.add(stream); |
| 80 | return g; | 84 | return g; |
| 81 | } | 85 | } |
| @@ -100,8 +104,15 @@ class PdfPage extends PdfObjectDict with PdfGraphicStream { | @@ -100,8 +104,15 @@ class PdfPage extends PdfObjectDict with PdfGraphicStream { | ||
| 100 | params['/MediaBox'] = | 104 | params['/MediaBox'] = |
| 101 | PdfArray.fromNum(<double>[0, 0, pageFormat.width, pageFormat.height]); | 105 | PdfArray.fromNum(<double>[0, 0, pageFormat.width, pageFormat.height]); |
| 102 | 106 | ||
| 107 | + for (final content in contents) { | ||
| 108 | + if (!_contentGraphics[content]!.altered) { | ||
| 109 | + content.inUse = false; | ||
| 110 | + } | ||
| 111 | + } | ||
| 112 | + | ||
| 103 | // The graphic operations to draw the page | 113 | // The graphic operations to draw the page |
| 104 | - final contentList = PdfArray.fromObjects(contents); | 114 | + final contentList = |
| 115 | + PdfArray.fromObjects(contents.where((e) => e.inUse).toList()); | ||
| 105 | 116 | ||
| 106 | if (params.containsKey('/Contents')) { | 117 | if (params.containsKey('/Contents')) { |
| 107 | final prevContent = params['/Contents']!; | 118 | final prevContent = params['/Contents']!; |
| @@ -124,9 +135,10 @@ class PdfPage extends PdfObjectDict with PdfGraphicStream { | @@ -124,9 +135,10 @@ class PdfPage extends PdfObjectDict with PdfGraphicStream { | ||
| 124 | // The /Annots object | 135 | // The /Annots object |
| 125 | if (annotations.isNotEmpty) { | 136 | if (annotations.isNotEmpty) { |
| 126 | if (params.containsKey('/Annots')) { | 137 | if (params.containsKey('/Annots')) { |
| 127 | - final annotsList = params['/Annots']; | ||
| 128 | - if (annotsList is PdfArray) { | ||
| 129 | - annotsList.values.addAll(PdfArray.fromObjects(annotations).values); | 138 | + final annotationList = params['/Annots']; |
| 139 | + if (annotationList is PdfArray) { | ||
| 140 | + annotationList.values | ||
| 141 | + .addAll(PdfArray.fromObjects(annotations).values); | ||
| 130 | } | 142 | } |
| 131 | } else { | 143 | } else { |
| 132 | params['/Annots'] = PdfArray.fromObjects(annotations); | 144 | params['/Annots'] = PdfArray.fromObjects(annotations); |
-
Please register or login to post a comment