Showing
6 changed files
with
62 additions
and
70 deletions
@@ -6,6 +6,7 @@ | @@ -6,6 +6,7 @@ | ||
6 | - Implement table row vertical alignment | 6 | - Implement table row vertical alignment |
7 | - Improve Internal data structure | 7 | - Improve Internal data structure |
8 | - Remove deprecated functions | 8 | - Remove deprecated functions |
9 | +- Optimize file size | ||
9 | 10 | ||
10 | ## 1.5.0 | 11 | ## 1.5.0 |
11 | 12 |
@@ -72,17 +72,26 @@ class PdfString extends PdfDataType { | @@ -72,17 +72,26 @@ class PdfString extends PdfDataType { | ||
72 | const PdfString(this.value, [this.format = PdfStringFormat.litteral]); | 72 | const PdfString(this.value, [this.format = PdfStringFormat.litteral]); |
73 | 73 | ||
74 | factory PdfString.fromString(String value) { | 74 | factory PdfString.fromString(String value) { |
75 | + return PdfString(_string(value), PdfStringFormat.litteral); | ||
76 | + } | ||
77 | + | ||
78 | + factory PdfString.fromDate(DateTime date) { | ||
79 | + return PdfString(_date(date)); | ||
80 | + } | ||
81 | + | ||
82 | + final Uint8List value; | ||
83 | + | ||
84 | + final PdfStringFormat format; | ||
85 | + | ||
86 | + static Uint8List _string(String value) { | ||
75 | try { | 87 | try { |
76 | - return PdfString(latin1.encode(value), PdfStringFormat.litteral); | 88 | + return latin1.encode(value); |
77 | } catch (e) { | 89 | } catch (e) { |
78 | - return PdfString( | ||
79 | - Uint8List.fromList(<int>[0xfe, 0xff] + encodeUtf16be(value)), | ||
80 | - PdfStringFormat.litteral, | ||
81 | - ); | 90 | + return Uint8List.fromList(<int>[0xfe, 0xff] + encodeUtf16be(value)); |
82 | } | 91 | } |
83 | } | 92 | } |
84 | 93 | ||
85 | - factory PdfString.fromDate(DateTime date) { | 94 | + static Uint8List _date(DateTime date) { |
86 | final DateTime utcDate = date.toUtc(); | 95 | final DateTime utcDate = date.toUtc(); |
87 | final String year = utcDate.year.toString().padLeft(4, '0'); | 96 | final String year = utcDate.year.toString().padLeft(4, '0'); |
88 | final String month = utcDate.month.toString().padLeft(2, '0'); | 97 | final String month = utcDate.month.toString().padLeft(2, '0'); |
@@ -90,20 +99,15 @@ class PdfString extends PdfDataType { | @@ -90,20 +99,15 @@ class PdfString extends PdfDataType { | ||
90 | final String hour = utcDate.hour.toString().padLeft(2, '0'); | 99 | final String hour = utcDate.hour.toString().padLeft(2, '0'); |
91 | final String minute = utcDate.minute.toString().padLeft(2, '0'); | 100 | final String minute = utcDate.minute.toString().padLeft(2, '0'); |
92 | final String second = utcDate.second.toString().padLeft(2, '0'); | 101 | final String second = utcDate.second.toString().padLeft(2, '0'); |
93 | - return PdfString.fromString('D:$year$month$day$hour$minute${second}Z'); | 102 | + return _string('D:$year$month$day$hour$minute${second}Z'); |
94 | } | 103 | } |
95 | 104 | ||
96 | - final Uint8List value; | ||
97 | - | ||
98 | - final PdfStringFormat format; | ||
99 | - | ||
100 | /// Returns the ASCII/Unicode code unit corresponding to the hexadecimal digit | 105 | /// Returns the ASCII/Unicode code unit corresponding to the hexadecimal digit |
101 | /// [digit]. | 106 | /// [digit]. |
102 | int _codeUnitForDigit(int digit) => | 107 | int _codeUnitForDigit(int digit) => |
103 | digit < 10 ? digit + 0x30 : digit + 0x61 - 10; | 108 | digit < 10 ? digit + 0x30 : digit + 0x61 - 10; |
104 | 109 | ||
105 | - @override | ||
106 | - void output(PdfStream s) { | 110 | + void _output(PdfStream s, Uint8List value) { |
107 | switch (format) { | 111 | switch (format) { |
108 | case PdfStringFormat.binary: | 112 | case PdfStringFormat.binary: |
109 | s.putByte(0x3c); | 113 | s.putByte(0x3c); |
@@ -121,6 +125,11 @@ class PdfString extends PdfDataType { | @@ -121,6 +125,11 @@ class PdfString extends PdfDataType { | ||
121 | break; | 125 | break; |
122 | } | 126 | } |
123 | } | 127 | } |
128 | + | ||
129 | + @override | ||
130 | + void output(PdfStream s) { | ||
131 | + _output(s, value); | ||
132 | + } | ||
124 | } | 133 | } |
125 | 134 | ||
126 | class PdfSecString extends PdfString { | 135 | class PdfSecString extends PdfString { |
@@ -129,28 +138,11 @@ class PdfSecString extends PdfString { | @@ -129,28 +138,11 @@ class PdfSecString extends PdfString { | ||
129 | : super(value, format); | 138 | : super(value, format); |
130 | 139 | ||
131 | factory PdfSecString.fromString(PdfObject object, String value) { | 140 | factory PdfSecString.fromString(PdfObject object, String value) { |
132 | - try { | ||
133 | - return PdfSecString( | ||
134 | - object, latin1.encode(value), PdfStringFormat.litteral); | ||
135 | - } catch (e) { | ||
136 | - return PdfSecString( | ||
137 | - object, | ||
138 | - Uint8List.fromList(<int>[0xfe, 0xff] + encodeUtf16be(value)), | ||
139 | - PdfStringFormat.litteral, | ||
140 | - ); | ||
141 | - } | 141 | + return PdfSecString(object, PdfString._string(value)); |
142 | } | 142 | } |
143 | 143 | ||
144 | factory PdfSecString.fromDate(PdfObject object, DateTime date) { | 144 | factory PdfSecString.fromDate(PdfObject object, DateTime date) { |
145 | - final DateTime utcDate = date.toUtc(); | ||
146 | - final String year = utcDate.year.toString().padLeft(4, '0'); | ||
147 | - final String month = utcDate.month.toString().padLeft(2, '0'); | ||
148 | - final String day = utcDate.day.toString().padLeft(2, '0'); | ||
149 | - final String hour = utcDate.hour.toString().padLeft(2, '0'); | ||
150 | - final String minute = utcDate.minute.toString().padLeft(2, '0'); | ||
151 | - final String second = utcDate.second.toString().padLeft(2, '0'); | ||
152 | - return PdfSecString.fromString( | ||
153 | - object, 'D:$year$month$day$hour$minute${second}Z'); | 145 | + return PdfSecString(object, PdfString._date(date)); |
154 | } | 146 | } |
155 | 147 | ||
156 | final PdfObject object; | 148 | final PdfObject object; |
@@ -162,22 +154,7 @@ class PdfSecString extends PdfString { | @@ -162,22 +154,7 @@ class PdfSecString extends PdfString { | ||
162 | } | 154 | } |
163 | 155 | ||
164 | final List<int> enc = object.pdfDocument.encryption.encrypt(value, object); | 156 | final List<int> enc = object.pdfDocument.encryption.encrypt(value, object); |
165 | - switch (format) { | ||
166 | - case PdfStringFormat.binary: | ||
167 | - s.putByte(0x3c); | ||
168 | - for (int byte in enc) { | ||
169 | - s.putByte(_codeUnitForDigit((byte & 0xF0) >> 4)); | ||
170 | - s.putByte(_codeUnitForDigit(byte & 0x0F)); | ||
171 | - } | ||
172 | - s.putByte(0x3e); | ||
173 | - | ||
174 | - break; | ||
175 | - case PdfStringFormat.litteral: | ||
176 | - s.putByte(40); | ||
177 | - s.putTextBytes(enc); | ||
178 | - s.putByte(41); | ||
179 | - break; | ||
180 | - } | 157 | + _output(s, Uint8List.fromList(enc)); |
181 | } | 158 | } |
182 | } | 159 | } |
183 | 160 | ||
@@ -231,11 +208,6 @@ class PdfArray extends PdfDataType { | @@ -231,11 +208,6 @@ class PdfArray extends PdfDataType { | ||
231 | return PdfArray(list.map<PdfNum>((num e) => PdfNum(e)).toList()); | 208 | return PdfArray(list.map<PdfNum>((num e) => PdfNum(e)).toList()); |
232 | } | 209 | } |
233 | 210 | ||
234 | - // factory PdfArray.fromStrings(List<String> list) { | ||
235 | - // return PdfArray( | ||
236 | - // list.map<PdfString>((String e) => PdfString.fromString(e)).toList()); | ||
237 | - // } | ||
238 | - | ||
239 | final List<PdfDataType> values = <PdfDataType>[]; | 211 | final List<PdfDataType> values = <PdfDataType>[]; |
240 | 212 | ||
241 | void add(PdfDataType v) { | 213 | void add(PdfDataType v) { |
@@ -246,12 +218,17 @@ class PdfArray extends PdfDataType { | @@ -246,12 +218,17 @@ class PdfArray extends PdfDataType { | ||
246 | void output(PdfStream s) { | 218 | void output(PdfStream s) { |
247 | s.putString('['); | 219 | s.putString('['); |
248 | if (values.isNotEmpty) { | 220 | if (values.isNotEmpty) { |
249 | - for (int n = 0; n < values.length - 1; n++) { | 221 | + for (int n = 0; n < values.length; n++) { |
250 | final PdfDataType val = values[n]; | 222 | final PdfDataType val = values[n]; |
223 | + if (n > 0 && | ||
224 | + !(val is PdfName || | ||
225 | + val is PdfString || | ||
226 | + val is PdfArray || | ||
227 | + val is PdfDict)) { | ||
228 | + s.putByte(0x20); | ||
229 | + } | ||
251 | val.output(s); | 230 | val.output(s); |
252 | - s.putString(' '); | ||
253 | } | 231 | } |
254 | - values.last.output(s); | ||
255 | } | 232 | } |
256 | s.putString(']'); | 233 | s.putString(']'); |
257 | } | 234 | } |
@@ -283,13 +260,15 @@ class PdfDict extends PdfDataType { | @@ -283,13 +260,15 @@ class PdfDict extends PdfDataType { | ||
283 | 260 | ||
284 | @override | 261 | @override |
285 | void output(PdfStream s) { | 262 | void output(PdfStream s) { |
286 | - s.putString('<< '); | 263 | + s.putBytes(const <int>[0x3c, 0x3c]); |
287 | values.forEach((String k, PdfDataType v) { | 264 | values.forEach((String k, PdfDataType v) { |
288 | - s.putString('$k '); | 265 | + s.putString(k); |
266 | + if (v is PdfNum || v is PdfBool || v is PdfNull || v is PdfIndirect) { | ||
267 | + s.putByte(0x20); | ||
268 | + } | ||
289 | v.output(s); | 269 | v.output(s); |
290 | - s.putString('\n'); | ||
291 | }); | 270 | }); |
292 | - s.putString('>>'); | 271 | + s.putBytes(const <int>[0x3e, 0x3e]); |
293 | } | 272 | } |
294 | 273 | ||
295 | bool containsKey(String key) { | 274 | bool containsKey(String key) { |
@@ -163,9 +163,9 @@ See https://github.com/DavBfr/dart_pdf/wiki/Fonts-Management | @@ -163,9 +163,9 @@ See https://github.com/DavBfr/dart_pdf/wiki/Fonts-Management | ||
163 | @override | 163 | @override |
164 | String toString() => 'Font($fontName)'; | 164 | String toString() => 'Font($fontName)'; |
165 | 165 | ||
166 | - PdfStream putText(String text) { | 166 | + void putText(PdfStream stream, String text) { |
167 | try { | 167 | try { |
168 | - return PdfStream() | 168 | + stream |
169 | ..putByte(40) | 169 | ..putByte(40) |
170 | ..putTextBytes(latin1.encode(text)) | 170 | ..putTextBytes(latin1.encode(text)) |
171 | ..putByte(41); | 171 | ..putByte(41); |
@@ -280,7 +280,7 @@ class PdfGraphics { | @@ -280,7 +280,7 @@ class PdfGraphics { | ||
280 | buf.putString('${mode.index} Tr '); | 280 | buf.putString('${mode.index} Tr '); |
281 | } | 281 | } |
282 | buf.putString('['); | 282 | buf.putString('['); |
283 | - buf.putStream(font.putText(s)); | 283 | + font.putText(buf, s); |
284 | buf.putString(']TJ ET\n'); | 284 | buf.putString(']TJ ET\n'); |
285 | } | 285 | } |
286 | 286 |
@@ -135,13 +135,13 @@ class PdfTtfFont extends PdfFont { | @@ -135,13 +135,13 @@ class PdfTtfFont extends PdfFont { | ||
135 | } | 135 | } |
136 | 136 | ||
137 | @override | 137 | @override |
138 | - PdfStream putText(String text) { | 138 | + void putText(PdfStream stream, String text) { |
139 | if (!font.unicode) { | 139 | if (!font.unicode) { |
140 | - return super.putText(text); | 140 | + super.putText(stream, text); |
141 | } | 141 | } |
142 | 142 | ||
143 | final Runes runes = text.runes; | 143 | final Runes runes = text.runes; |
144 | - final PdfStream stream = PdfStream(); | 144 | + |
145 | stream.putByte(0x3c); | 145 | stream.putByte(0x3c); |
146 | for (int rune in runes) { | 146 | for (int rune in runes) { |
147 | int char = unicodeCMap.cmap.indexOf(rune); | 147 | int char = unicodeCMap.cmap.indexOf(rune); |
@@ -153,7 +153,6 @@ class PdfTtfFont extends PdfFont { | @@ -153,7 +153,6 @@ class PdfTtfFont extends PdfFont { | ||
153 | stream.putBytes(latin1.encode(char.toRadixString(16).padLeft(4, '0'))); | 153 | stream.putBytes(latin1.encode(char.toRadixString(16).padLeft(4, '0'))); |
154 | } | 154 | } |
155 | stream.putByte(0x3e); | 155 | stream.putByte(0x3e); |
156 | - return stream; | ||
157 | } | 156 | } |
158 | 157 | ||
159 | @override | 158 | @override |
@@ -70,15 +70,28 @@ void main() { | @@ -70,15 +70,28 @@ void main() { | ||
70 | }); | 70 | }); |
71 | 71 | ||
72 | test('PdfDataTypes Array', () { | 72 | test('PdfDataTypes Array', () { |
73 | - expect(PdfArray(<PdfDataType>[]).toString(), '[]'); | 73 | + expect(PdfArray().toString(), '[]'); |
74 | expect( | 74 | expect( |
75 | PdfArray(<PdfDataType>[const PdfNum(1), const PdfNum(2)]).toString(), | 75 | PdfArray(<PdfDataType>[const PdfNum(1), const PdfNum(2)]).toString(), |
76 | '[1 2]', | 76 | '[1 2]', |
77 | ); | 77 | ); |
78 | + expect( | ||
79 | + PdfArray(<PdfDataType>[ | ||
80 | + const PdfName('/Name'), | ||
81 | + const PdfName('/Other'), | ||
82 | + const PdfBool(false), | ||
83 | + const PdfNum(2.5), | ||
84 | + const PdfNull(), | ||
85 | + PdfString.fromString('helło'), | ||
86 | + PdfArray(), | ||
87 | + PdfDict(), | ||
88 | + ]).toString(), | ||
89 | + '[/Name/Other false 2.50000 null(þÿ\x00h\x00e\x00l\x01B\x00o)[]<<>>]', | ||
90 | + ); | ||
78 | }); | 91 | }); |
79 | 92 | ||
80 | test('PdfDataTypes Dict', () { | 93 | test('PdfDataTypes Dict', () { |
81 | - expect(PdfDict(<String, PdfDataType>{}).toString(), '<< >>'); | 94 | + expect(PdfDict().toString(), '<<>>'); |
82 | 95 | ||
83 | expect( | 96 | expect( |
84 | PdfDict(<String, PdfDataType>{ | 97 | PdfDict(<String, PdfDataType>{ |
@@ -91,7 +104,7 @@ void main() { | @@ -91,7 +104,7 @@ void main() { | ||
91 | '/Array': PdfArray(<PdfDataType>[]), | 104 | '/Array': PdfArray(<PdfDataType>[]), |
92 | '/Dict': PdfDict(<String, PdfDataType>{}), | 105 | '/Dict': PdfDict(<String, PdfDataType>{}), |
93 | }).toString(), | 106 | }).toString(), |
94 | - '<< /Name /Value\n/Bool true\n/Num 42\n/String (hello)\n/Null null\n/Indirect 55 0 R\n/Array []\n/Dict << >>\n>>', | 107 | + '<</Name/Value/Bool true/Num 42/String(hello)/Null null/Indirect 55 0 R/Array[]/Dict<<>>>>', |
95 | ); | 108 | ); |
96 | }); | 109 | }); |
97 | } | 110 | } |
-
Please register or login to post a comment