Showing
6 changed files
with
110 additions
and
89 deletions
@@ -417,8 +417,9 @@ class PdfAnnotSign extends PdfAnnotWidget { | @@ -417,8 +417,9 @@ class PdfAnnotSign extends PdfAnnotWidget { | ||
417 | @override | 417 | @override |
418 | void build(PdfPage page, PdfObject object, PdfDict params) { | 418 | void build(PdfPage page, PdfObject object, PdfDict params) { |
419 | super.build(page, object, params); | 419 | super.build(page, object, params); |
420 | - assert(page.pdfDocument.sign != null); | ||
421 | - params['/V'] = page.pdfDocument.sign!.ref(); | 420 | + if (page.pdfDocument.sign != null) { |
421 | + params['/V'] = page.pdfDocument.sign!.ref(); | ||
422 | + } | ||
422 | } | 423 | } |
423 | } | 424 | } |
424 | 425 |
@@ -25,25 +25,26 @@ enum PdfSigFlags { signaturesExist, appendOnly } | @@ -25,25 +25,26 @@ enum PdfSigFlags { signaturesExist, appendOnly } | ||
25 | class PdfSignature extends PdfObjectDict { | 25 | class PdfSignature extends PdfObjectDict { |
26 | PdfSignature( | 26 | PdfSignature( |
27 | PdfDocument pdfDocument, { | 27 | PdfDocument pdfDocument, { |
28 | - required this.crypto, | ||
29 | - Set<PdfSigFlags>? flags, | ||
30 | - }) : flags = flags ?? const <PdfSigFlags>{PdfSigFlags.signaturesExist}, | ||
31 | - super(pdfDocument, type: '/Sig'); | 28 | + required this.value, |
29 | + required this.flags, | ||
30 | + }) : super(pdfDocument, type: '/Sig'); | ||
32 | 31 | ||
33 | final Set<PdfSigFlags> flags; | 32 | final Set<PdfSigFlags> flags; |
34 | 33 | ||
35 | - final PdfSignatureBase crypto; | 34 | + final PdfSignatureBase value; |
36 | 35 | ||
37 | - int get flagsValue => flags | ||
38 | - .map<int>((PdfSigFlags e) => 1 >> e.index) | ||
39 | - .reduce((int a, int b) => a | b); | 36 | + int get flagsValue => flags.isEmpty |
37 | + ? 0 | ||
38 | + : flags | ||
39 | + .map<int>((PdfSigFlags e) => 1 >> e.index) | ||
40 | + .reduce((int a, int b) => a | b); | ||
40 | 41 | ||
41 | int? _offsetStart; | 42 | int? _offsetStart; |
42 | int? _offsetEnd; | 43 | int? _offsetEnd; |
43 | 44 | ||
44 | @override | 45 | @override |
45 | void write(PdfStream os) { | 46 | void write(PdfStream os) { |
46 | - crypto.preSign(this, params); | 47 | + value.preSign(this, params); |
47 | 48 | ||
48 | _offsetStart = os.offset + '$objser $objgen obj\n'.length; | 49 | _offsetStart = os.offset + '$objser $objgen obj\n'.length; |
49 | super.write(os); | 50 | super.write(os); |
@@ -54,7 +55,7 @@ class PdfSignature extends PdfObjectDict { | @@ -54,7 +55,7 @@ class PdfSignature extends PdfObjectDict { | ||
54 | assert(_offsetStart != null && _offsetEnd != null, | 55 | assert(_offsetStart != null && _offsetEnd != null, |
55 | 'Must reserve the object space before signing the document'); | 56 | 'Must reserve the object space before signing the document'); |
56 | 57 | ||
57 | - await crypto.sign(this, os, params, _offsetStart, _offsetEnd); | 58 | + await value.sign(this, os, params, _offsetStart, _offsetEnd); |
58 | } | 59 | } |
59 | } | 60 | } |
60 | 61 |
@@ -100,57 +100,6 @@ class AnnotationUrl extends AnnotationBuilder { | @@ -100,57 +100,6 @@ class AnnotationUrl extends AnnotationBuilder { | ||
100 | } | 100 | } |
101 | } | 101 | } |
102 | 102 | ||
103 | -class AnnotationSignature extends AnnotationBuilder { | ||
104 | - AnnotationSignature( | ||
105 | - this.crypto, { | ||
106 | - this.name, | ||
107 | - this.signFlags, | ||
108 | - this.border, | ||
109 | - this.flags, | ||
110 | - this.date, | ||
111 | - this.color, | ||
112 | - this.highlighting, | ||
113 | - }); | ||
114 | - | ||
115 | - final Set<PdfSigFlags>? signFlags; | ||
116 | - | ||
117 | - final PdfSignatureBase crypto; | ||
118 | - | ||
119 | - final String? name; | ||
120 | - | ||
121 | - final PdfBorder? border; | ||
122 | - | ||
123 | - final Set<PdfAnnotFlags>? flags; | ||
124 | - | ||
125 | - final DateTime? date; | ||
126 | - | ||
127 | - final PdfColor? color; | ||
128 | - | ||
129 | - final PdfAnnotHighlighting? highlighting; | ||
130 | - | ||
131 | - @override | ||
132 | - void build(Context context, PdfRect? box) { | ||
133 | - context.document.sign ??= PdfSignature( | ||
134 | - context.document, | ||
135 | - crypto: crypto, | ||
136 | - flags: signFlags, | ||
137 | - ); | ||
138 | - | ||
139 | - PdfAnnot( | ||
140 | - context.page, | ||
141 | - PdfAnnotSign( | ||
142 | - rect: context.localToGlobal(box!), | ||
143 | - fieldName: name, | ||
144 | - border: border, | ||
145 | - flags: flags, | ||
146 | - date: date, | ||
147 | - color: color, | ||
148 | - highlighting: highlighting, | ||
149 | - ), | ||
150 | - ); | ||
151 | - } | ||
152 | -} | ||
153 | - | ||
154 | class AnnotationTextField extends AnnotationBuilder { | 103 | class AnnotationTextField extends AnnotationBuilder { |
155 | AnnotationTextField({ | 104 | AnnotationTextField({ |
156 | this.name, | 105 | this.name, |
@@ -259,31 +208,6 @@ class UrlLink extends Annotation { | @@ -259,31 +208,6 @@ class UrlLink extends Annotation { | ||
259 | }) : super(child: child, builder: AnnotationUrl(destination)); | 208 | }) : super(child: child, builder: AnnotationUrl(destination)); |
260 | } | 209 | } |
261 | 210 | ||
262 | -class Signature extends Annotation { | ||
263 | - Signature({ | ||
264 | - required Widget child, | ||
265 | - required PdfSignatureBase crypto, | ||
266 | - required String name, | ||
267 | - Set<PdfSigFlags>? signFlags, | ||
268 | - PdfBorder? border, | ||
269 | - Set<PdfAnnotFlags>? flags, | ||
270 | - DateTime? date, | ||
271 | - PdfColor? color, | ||
272 | - PdfAnnotHighlighting? highlighting, | ||
273 | - }) : super( | ||
274 | - child: child, | ||
275 | - builder: AnnotationSignature( | ||
276 | - crypto, | ||
277 | - signFlags: signFlags, | ||
278 | - name: name, | ||
279 | - border: border, | ||
280 | - flags: flags, | ||
281 | - date: date, | ||
282 | - color: color, | ||
283 | - highlighting: highlighting, | ||
284 | - )); | ||
285 | -} | ||
286 | - | ||
287 | class Outline extends Anchor { | 211 | class Outline extends Anchor { |
288 | Outline({ | 212 | Outline({ |
289 | Widget? child, | 213 | Widget? child, |
@@ -307,3 +307,94 @@ class TextField extends StatelessWidget { | @@ -307,3 +307,94 @@ class TextField extends StatelessWidget { | ||
307 | PdfAnnot(context.page, tf); | 307 | PdfAnnot(context.page, tf); |
308 | } | 308 | } |
309 | } | 309 | } |
310 | + | ||
311 | +class Signature extends SingleChildWidget { | ||
312 | + Signature({ | ||
313 | + Widget? child, | ||
314 | + @Deprecated('Use value instead') PdfSignatureBase? crypto, | ||
315 | + PdfSignatureBase? value, | ||
316 | + required this.name, | ||
317 | + this.appendOnly = false, | ||
318 | + this.border, | ||
319 | + this.flags, | ||
320 | + this.date, | ||
321 | + this.color, | ||
322 | + this.highlighting, | ||
323 | + }) : value = value ?? crypto, | ||
324 | + super(child: child); | ||
325 | + | ||
326 | + /// Field name | ||
327 | + final String name; | ||
328 | + | ||
329 | + /// Digital signature | ||
330 | + final PdfSignatureBase? value; | ||
331 | + | ||
332 | + /// Append | ||
333 | + final bool appendOnly; | ||
334 | + | ||
335 | + final PdfBorder? border; | ||
336 | + | ||
337 | + /// Flags for this field | ||
338 | + final Set<PdfAnnotFlags>? flags; | ||
339 | + | ||
340 | + /// Date metadata | ||
341 | + final DateTime? date; | ||
342 | + | ||
343 | + /// Field color | ||
344 | + final PdfColor? color; | ||
345 | + | ||
346 | + /// Field highlighting | ||
347 | + final PdfAnnotHighlighting? highlighting; | ||
348 | + | ||
349 | + @override | ||
350 | + void paint(Context context) { | ||
351 | + super.paint(context); | ||
352 | + | ||
353 | + if (value != null) { | ||
354 | + context.document.sign ??= PdfSignature( | ||
355 | + context.document, | ||
356 | + value: value!, | ||
357 | + flags: { | ||
358 | + PdfSigFlags.signaturesExist, | ||
359 | + if (appendOnly) PdfSigFlags.appendOnly, | ||
360 | + }, | ||
361 | + ); | ||
362 | + } else { | ||
363 | + paintChild(context); | ||
364 | + } | ||
365 | + | ||
366 | + final bf = PdfAnnotSign( | ||
367 | + rect: context.localToGlobal(box!), | ||
368 | + fieldName: name, | ||
369 | + border: border, | ||
370 | + flags: flags, | ||
371 | + date: date, | ||
372 | + color: color, | ||
373 | + highlighting: highlighting, | ||
374 | + ); | ||
375 | + | ||
376 | + if (child != null && value != null) { | ||
377 | + final mat = context.canvas.getTransform(); | ||
378 | + final translation = Vector3(0, 0, 0); | ||
379 | + final rotation = Quaternion(0, 0, 0, 0); | ||
380 | + final scale = Vector3(0, 0, 0); | ||
381 | + mat | ||
382 | + ..decompose(translation, rotation, scale) | ||
383 | + ..leftTranslate(-translation.x, -translation.y) | ||
384 | + ..translate(box!.x, box!.y); | ||
385 | + | ||
386 | + final canvas = bf.appearance(context.document, PdfAnnotAppearance.normal, | ||
387 | + matrix: mat); | ||
388 | + Widget.draw( | ||
389 | + child!, | ||
390 | + offset: PdfPoint.zero, | ||
391 | + canvas: canvas, | ||
392 | + page: context.page, | ||
393 | + constraints: | ||
394 | + BoxConstraints.tightFor(width: box!.width, height: box!.height), | ||
395 | + ); | ||
396 | + } | ||
397 | + | ||
398 | + PdfAnnot(context.page, bf); | ||
399 | + } | ||
400 | +} |
@@ -4,7 +4,7 @@ description: A pdf producer for Dart. It can create pdf files for both web or fl | @@ -4,7 +4,7 @@ description: A pdf producer for Dart. It can create pdf files for both web or fl | ||
4 | homepage: https://github.com/DavBfr/dart_pdf/tree/master/pdf | 4 | homepage: https://github.com/DavBfr/dart_pdf/tree/master/pdf |
5 | repository: https://github.com/DavBfr/dart_pdf | 5 | repository: https://github.com/DavBfr/dart_pdf |
6 | issue_tracker: https://github.com/DavBfr/dart_pdf/issues | 6 | issue_tracker: https://github.com/DavBfr/dart_pdf/issues |
7 | -version: 3.2.0 | 7 | +version: 3.3.0 |
8 | 8 | ||
9 | environment: | 9 | environment: |
10 | sdk: ">=2.12.0-0 <3.0.0" | 10 | sdk: ">=2.12.0-0 <3.0.0" |
-
Please register or login to post a comment