Showing
7 changed files
with
152 additions
and
4 deletions
@@ -40,22 +40,23 @@ part 'src/colors.dart'; | @@ -40,22 +40,23 @@ part 'src/colors.dart'; | ||
40 | part 'src/compatibility.dart'; | 40 | part 'src/compatibility.dart'; |
41 | part 'src/document.dart'; | 41 | part 'src/document.dart'; |
42 | part 'src/encryption.dart'; | 42 | part 'src/encryption.dart'; |
43 | -part 'src/font_descriptor.dart'; | ||
44 | part 'src/exif.dart'; | 43 | part 'src/exif.dart'; |
45 | -part 'src/font_metrics.dart'; | ||
46 | part 'src/font.dart'; | 44 | part 'src/font.dart'; |
45 | +part 'src/font_descriptor.dart'; | ||
46 | +part 'src/font_metrics.dart'; | ||
47 | part 'src/formxobject.dart'; | 47 | part 'src/formxobject.dart'; |
48 | +part 'src/graphic_state.dart'; | ||
48 | part 'src/graphics.dart'; | 49 | part 'src/graphics.dart'; |
49 | part 'src/image.dart'; | 50 | part 'src/image.dart'; |
50 | part 'src/info.dart'; | 51 | part 'src/info.dart'; |
51 | part 'src/names.dart'; | 52 | part 'src/names.dart'; |
52 | -part 'src/object_stream.dart'; | ||
53 | part 'src/object.dart'; | 53 | part 'src/object.dart'; |
54 | +part 'src/object_stream.dart'; | ||
54 | part 'src/outline.dart'; | 55 | part 'src/outline.dart'; |
55 | part 'src/output.dart'; | 56 | part 'src/output.dart'; |
57 | +part 'src/page.dart'; | ||
56 | part 'src/page_format.dart'; | 58 | part 'src/page_format.dart'; |
57 | part 'src/page_list.dart'; | 59 | part 'src/page_list.dart'; |
58 | -part 'src/page.dart'; | ||
59 | part 'src/point.dart'; | 60 | part 'src/point.dart'; |
60 | part 'src/polygon.dart'; | 61 | part 'src/polygon.dart'; |
61 | part 'src/rect.dart'; | 62 | part 'src/rect.dart'; |
@@ -98,6 +98,9 @@ class PdfDocument { | @@ -98,6 +98,9 @@ class PdfDocument { | ||
98 | /// Object used to sign the document | 98 | /// Object used to sign the document |
99 | PdfSignature sign; | 99 | PdfSignature sign; |
100 | 100 | ||
101 | + /// Graphics state, representing only opacity. | ||
102 | + PdfGraphicStates _graphicStates; | ||
103 | + | ||
101 | /// The PDF specification version | 104 | /// The PDF specification version |
102 | final String version = '1.7'; | 105 | final String version = '1.7'; |
103 | 106 | ||
@@ -149,6 +152,14 @@ class PdfDocument { | @@ -149,6 +152,14 @@ class PdfDocument { | ||
149 | return _outline; | 152 | return _outline; |
150 | } | 153 | } |
151 | 154 | ||
155 | + /// Graphic states for opacity and transfer modes | ||
156 | + PdfGraphicStates get graphicStates { | ||
157 | + _graphicStates ??= PdfGraphicStates(this); | ||
158 | + return _graphicStates; | ||
159 | + } | ||
160 | + | ||
161 | + bool get hasGraphicStates => _graphicStates != null; | ||
162 | + | ||
152 | /// This writes the document to an OutputStream. | 163 | /// This writes the document to an OutputStream. |
153 | /// | 164 | /// |
154 | /// Note: You can call this as many times as you wish, as long as | 165 | /// Note: You can call this as many times as you wish, as long as |
pdf/lib/src/graphic_state.dart
0 → 100644
1 | +/* | ||
2 | + * Copyright (C) 2017, David PHAM-VAN <dev.nfet.net@gmail.com> | ||
3 | + * | ||
4 | + * This library is free software; you can redistribute it and/or | ||
5 | + * modify it under the terms of the GNU Lesser General | ||
6 | + * License as published by the Free Software Foundation; either | ||
7 | + * version 2.1 of the License, or (at your option) any later version. | ||
8 | + * | ||
9 | + * This library is distributed in the hope that it will be useful, | ||
10 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | + * Lesser General License for more details. | ||
13 | + * | ||
14 | + * You should have received a copy of the GNU Lesser General | ||
15 | + * License along with this library; if not, write to the Free Software | ||
16 | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | + */ | ||
18 | + | ||
19 | +// ignore_for_file: omit_local_variable_types | ||
20 | + | ||
21 | +part of pdf; | ||
22 | + | ||
23 | +@immutable | ||
24 | +class PdfGraphicState { | ||
25 | + const PdfGraphicState({this.opacity}); | ||
26 | + | ||
27 | + final double opacity; | ||
28 | + | ||
29 | + @protected | ||
30 | + PdfStream _output() { | ||
31 | + final Map<String, PdfStream> params = <String, PdfStream>{}; | ||
32 | + | ||
33 | + if (opacity != null) { | ||
34 | + params['/CA'] = PdfStream.num(opacity); | ||
35 | + params['/ca'] = PdfStream.num(opacity); | ||
36 | + } | ||
37 | + | ||
38 | + return PdfStream.dictionary(params); | ||
39 | + } | ||
40 | + | ||
41 | + @override | ||
42 | + bool operator ==(dynamic other) { | ||
43 | + if (!other is PdfGraphicState) { | ||
44 | + return false; | ||
45 | + } | ||
46 | + return other.opacity == opacity; | ||
47 | + } | ||
48 | + | ||
49 | + @override | ||
50 | + int get hashCode => opacity.hashCode; | ||
51 | +} | ||
52 | + | ||
53 | +class PdfGraphicStates extends PdfObject { | ||
54 | + PdfGraphicStates(PdfDocument pdfDocument) : super(pdfDocument); | ||
55 | + | ||
56 | + final List<PdfGraphicState> _states = <PdfGraphicState>[]; | ||
57 | + | ||
58 | + static const String _prefix = '/a'; | ||
59 | + | ||
60 | + String stateName(PdfGraphicState state) { | ||
61 | + int index = _states.indexOf(state); | ||
62 | + if (index < 0) { | ||
63 | + index = _states.length; | ||
64 | + _states.add(state); | ||
65 | + } | ||
66 | + return '$_prefix$index'; | ||
67 | + } | ||
68 | + | ||
69 | + @override | ||
70 | + void _prepare() { | ||
71 | + super._prepare(); | ||
72 | + | ||
73 | + for (int index = 0; index < _states.length; index++) { | ||
74 | + params['$_prefix$index'] = _states[index]._output(); | ||
75 | + } | ||
76 | + } | ||
77 | +} |
@@ -320,6 +320,12 @@ class PdfGraphics { | @@ -320,6 +320,12 @@ class PdfGraphics { | ||
320 | } | 320 | } |
321 | } | 321 | } |
322 | 322 | ||
323 | + /// Set the graphic state for drawing | ||
324 | + void setGraphicState(PdfGraphicState state) { | ||
325 | + final String name = page.pdfDocument.graphicStates.stateName(state); | ||
326 | + buf.putString('$name gs\n'); | ||
327 | + } | ||
328 | + | ||
323 | /// Set the transformation Matrix | 329 | /// Set the transformation Matrix |
324 | void setTransform(Matrix4 t) { | 330 | void setTransform(Matrix4 t) { |
325 | final Float64List s = t.storage; | 331 | final Float64List s = t.storage; |
@@ -41,6 +41,18 @@ class PdfPage extends PdfObject { | @@ -41,6 +41,18 @@ class PdfPage extends PdfObject { | ||
41 | /// -1 indicates no thumbnail. | 41 | /// -1 indicates no thumbnail. |
42 | PdfObject thumbnail; | 42 | PdfObject thumbnail; |
43 | 43 | ||
44 | + /// Isolated transparency: If this flag is true, objects within the group | ||
45 | + /// shall be composited against a fully transparent initial backdrop; | ||
46 | + /// if false, they shall be composited against the group’s backdrop | ||
47 | + bool isolatedTransparency = false; | ||
48 | + | ||
49 | + /// Whether the transparency group is a knockout group. | ||
50 | + /// If this flag is false, later objects within the group shall be composited | ||
51 | + /// with earlier ones with which they overlap; if true, they shall be | ||
52 | + /// composited with the group’s initial backdrop and shall overwrite any | ||
53 | + /// earlier overlapping objects. | ||
54 | + bool knockoutTransparency = false; | ||
55 | + | ||
44 | /// This holds any Annotations contained within this page. | 56 | /// This holds any Annotations contained within this page. |
45 | List<PdfAnnot> annotations = <PdfAnnot>[]; | 57 | List<PdfAnnot> annotations = <PdfAnnot>[]; |
46 | 58 | ||
@@ -115,6 +127,20 @@ class PdfPage extends PdfObject { | @@ -115,6 +127,20 @@ class PdfPage extends PdfObject { | ||
115 | resources['/XObject'] = PdfStream()..putObjectDictionary(xObjects); | 127 | resources['/XObject'] = PdfStream()..putObjectDictionary(xObjects); |
116 | } | 128 | } |
117 | 129 | ||
130 | + if (pdfDocument.hasGraphicStates) { | ||
131 | + // Declare Transparency Group settings | ||
132 | + params['/Group'] = PdfStream() | ||
133 | + ..putDictionary(<String, PdfStream>{ | ||
134 | + '/Type': PdfStream.string('/Group'), | ||
135 | + '/S': PdfStream.string('/Transparency'), | ||
136 | + '/CS': PdfStream.string('/DeviceRGB'), | ||
137 | + '/I': PdfStream()..putBool(isolatedTransparency), | ||
138 | + '/K': PdfStream()..putBool(knockoutTransparency), | ||
139 | + }); | ||
140 | + | ||
141 | + resources['/ExtGState'] = pdfDocument.graphicStates.ref(); | ||
142 | + } | ||
143 | + | ||
118 | params['/Resources'] = PdfStream.dictionary(resources); | 144 | params['/Resources'] = PdfStream.dictionary(resources); |
119 | 145 | ||
120 | // The thumbnail | 146 | // The thumbnail |
@@ -740,3 +740,29 @@ class FullPage extends SingleChildWidget { | @@ -740,3 +740,29 @@ class FullPage extends SingleChildWidget { | ||
740 | context.canvas.restoreContext(); | 740 | context.canvas.restoreContext(); |
741 | } | 741 | } |
742 | } | 742 | } |
743 | + | ||
744 | +class Opacity extends SingleChildWidget { | ||
745 | + Opacity({ | ||
746 | + @required this.opacity, | ||
747 | + Widget child, | ||
748 | + }) : assert(opacity != null), | ||
749 | + super(child: child); | ||
750 | + | ||
751 | + final double opacity; | ||
752 | + | ||
753 | + @override | ||
754 | + void paint(Context context) { | ||
755 | + super.paint(context); | ||
756 | + | ||
757 | + if (child != null) { | ||
758 | + final Matrix4 mat = Matrix4.identity(); | ||
759 | + mat.translate(box.x, box.y); | ||
760 | + context.canvas | ||
761 | + ..saveContext() | ||
762 | + ..setTransform(mat) | ||
763 | + ..setGraphicState(PdfGraphicState(opacity: opacity)); | ||
764 | + child.paint(context); | ||
765 | + context.canvas.restoreContext(); | ||
766 | + } | ||
767 | + } | ||
768 | +} |
-
Please register or login to post a comment