Showing
4 changed files
with
89 additions
and
3 deletions
| @@ -81,11 +81,28 @@ class PdfCatalog extends PdfObjectDict { | @@ -81,11 +81,28 @@ class PdfCatalog extends PdfObjectDict { | ||
| 81 | params['/PageMode'] = PdfName(_PdfPageModes[pageMode.index]); | 81 | params['/PageMode'] = PdfName(_PdfPageModes[pageMode.index]); |
| 82 | 82 | ||
| 83 | if (pdfDocument.sign != null) { | 83 | if (pdfDocument.sign != null) { |
| 84 | + if (pdfDocument.sign!.value.hasMDP) { | ||
| 84 | params['/Perms'] = PdfDict({ | 85 | params['/Perms'] = PdfDict({ |
| 85 | '/DocMDP': pdfDocument.sign!.ref(), | 86 | '/DocMDP': pdfDocument.sign!.ref(), |
| 86 | }); | 87 | }); |
| 87 | } | 88 | } |
| 88 | 89 | ||
| 90 | + final dss = PdfDict(); | ||
| 91 | + if (pdfDocument.sign!.crl.isNotEmpty) { | ||
| 92 | + dss['/CRLs'] = PdfArray.fromObjects(pdfDocument.sign!.crl); | ||
| 93 | + } | ||
| 94 | + if (pdfDocument.sign!.cert.isNotEmpty) { | ||
| 95 | + dss['/Certs'] = PdfArray.fromObjects(pdfDocument.sign!.cert); | ||
| 96 | + } | ||
| 97 | + if (pdfDocument.sign!.ocsp.isNotEmpty) { | ||
| 98 | + dss['/OCSPs'] = PdfArray.fromObjects(pdfDocument.sign!.ocsp); | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + if (dss.values.isNotEmpty) { | ||
| 102 | + params['/DSS'] = dss; | ||
| 103 | + } | ||
| 104 | + } | ||
| 105 | + | ||
| 89 | final widgets = <PdfAnnot>[]; | 106 | final widgets = <PdfAnnot>[]; |
| 90 | for (var page in pdfDocument.pdfPageList.pages) { | 107 | for (var page in pdfDocument.pdfPageList.pages) { |
| 91 | for (var annot in page.annotations) { | 108 | for (var annot in page.annotations) { |
| @@ -100,6 +117,13 @@ class PdfCatalog extends PdfObjectDict { | @@ -100,6 +117,13 @@ class PdfCatalog extends PdfObjectDict { | ||
| 100 | '/SigFlags': PdfNum(pdfDocument.sign?.flagsValue ?? 0), | 117 | '/SigFlags': PdfNum(pdfDocument.sign?.flagsValue ?? 0), |
| 101 | '/Fields': PdfArray.fromObjects(widgets), | 118 | '/Fields': PdfArray.fromObjects(widgets), |
| 102 | }); | 119 | }); |
| 120 | + | ||
| 121 | + // final acroForm = (params['/AcroForm'] ??= PdfDict()) as PdfDict; | ||
| 122 | + // acroForm['/SigFlags'] = PdfNum(pdfDocument.sign?.flagsValue ?? 0); | ||
| 123 | + // final fields = (acroForm['/Fields'] ??= PdfArray()) as PdfArray; | ||
| 124 | + // for (final w in widgets) { | ||
| 125 | + // fields.add(w.ref()); | ||
| 126 | + // } | ||
| 103 | } | 127 | } |
| 104 | } | 128 | } |
| 105 | } | 129 | } |
| @@ -47,7 +47,9 @@ class PdfPage extends PdfObjectDict with PdfGraphicStream { | @@ -47,7 +47,9 @@ class PdfPage extends PdfObjectDict with PdfGraphicStream { | ||
| 47 | this.pageFormat = PdfPageFormat.standard, | 47 | this.pageFormat = PdfPageFormat.standard, |
| 48 | this.rotate = PdfPageRotation.none, | 48 | this.rotate = PdfPageRotation.none, |
| 49 | int? index, | 49 | int? index, |
| 50 | - }) : super(pdfDocument, type: '/Page') { | 50 | + int? objser, |
| 51 | + int objgen = 0, | ||
| 52 | + }) : super(pdfDocument, type: '/Page', objser: objser, objgen: objgen) { | ||
| 51 | if (index != null) { | 53 | if (index != null) { |
| 52 | pdfDocument.pdfPageList.pages.insert(index, this); | 54 | pdfDocument.pdfPageList.pages.insert(index, this); |
| 53 | } else { | 55 | } else { |
| @@ -14,20 +14,53 @@ | @@ -14,20 +14,53 @@ | ||
| 14 | * limitations under the License. | 14 | * limitations under the License. |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | +import 'dart:typed_data'; | ||
| 18 | + | ||
| 19 | +import 'package:pdf/src/pdf/object_stream.dart'; | ||
| 20 | + | ||
| 17 | import 'data_types.dart'; | 21 | import 'data_types.dart'; |
| 18 | import 'document.dart'; | 22 | import 'document.dart'; |
| 19 | import 'object.dart'; | 23 | import 'object.dart'; |
| 20 | import 'object_dict.dart'; | 24 | import 'object_dict.dart'; |
| 21 | import 'stream.dart'; | 25 | import 'stream.dart'; |
| 22 | 26 | ||
| 23 | -enum PdfSigFlags { signaturesExist, appendOnly } | 27 | +/// Signature flags |
| 28 | +enum PdfSigFlags { | ||
| 29 | + /// The document contains at least one signature field. | ||
| 30 | + | ||
| 31 | + signaturesExist, | ||
| 32 | + | ||
| 33 | + /// The document contains signatures that may be invalidated if the file is | ||
| 34 | + /// saved (written) in a way that alters its previous contents, as opposed | ||
| 35 | + /// to an incremental update. | ||
| 36 | + appendOnly, | ||
| 37 | +} | ||
| 24 | 38 | ||
| 25 | class PdfSignature extends PdfObjectDict { | 39 | class PdfSignature extends PdfObjectDict { |
| 26 | PdfSignature( | 40 | PdfSignature( |
| 27 | PdfDocument pdfDocument, { | 41 | PdfDocument pdfDocument, { |
| 28 | required this.value, | 42 | required this.value, |
| 29 | required this.flags, | 43 | required this.flags, |
| 30 | - }) : super(pdfDocument, type: '/Sig'); | 44 | + List<Uint8List>? crl, |
| 45 | + List<Uint8List>? cert, | ||
| 46 | + List<Uint8List>? ocsp, | ||
| 47 | + }) : super(pdfDocument, type: '/Sig') { | ||
| 48 | + if (crl != null) { | ||
| 49 | + for (final o in crl) { | ||
| 50 | + this.crl.add(PdfObjectStream(pdfDocument)..buf.putBytes(o)); | ||
| 51 | + } | ||
| 52 | + } | ||
| 53 | + if (cert != null) { | ||
| 54 | + for (final o in cert) { | ||
| 55 | + this.cert.add(PdfObjectStream(pdfDocument)..buf.putBytes(o)); | ||
| 56 | + } | ||
| 57 | + } | ||
| 58 | + if (ocsp != null) { | ||
| 59 | + for (final o in ocsp) { | ||
| 60 | + this.ocsp.add(PdfObjectStream(pdfDocument)..buf.putBytes(o)); | ||
| 61 | + } | ||
| 62 | + } | ||
| 63 | + } | ||
| 31 | 64 | ||
| 32 | final Set<PdfSigFlags> flags; | 65 | final Set<PdfSigFlags> flags; |
| 33 | 66 | ||
| @@ -39,7 +72,14 @@ class PdfSignature extends PdfObjectDict { | @@ -39,7 +72,14 @@ class PdfSignature extends PdfObjectDict { | ||
| 39 | .map<int>((PdfSigFlags e) => 1 >> e.index) | 72 | .map<int>((PdfSigFlags e) => 1 >> e.index) |
| 40 | .reduce((int a, int b) => a | b); | 73 | .reduce((int a, int b) => a | b); |
| 41 | 74 | ||
| 75 | + final crl = <PdfObjectStream>[]; | ||
| 76 | + | ||
| 77 | + final cert = <PdfObjectStream>[]; | ||
| 78 | + | ||
| 79 | + final ocsp = <PdfObjectStream>[]; | ||
| 80 | + | ||
| 42 | int? _offsetStart; | 81 | int? _offsetStart; |
| 82 | + | ||
| 43 | int? _offsetEnd; | 83 | int? _offsetEnd; |
| 44 | 84 | ||
| 45 | @override | 85 | @override |
| @@ -60,6 +100,9 @@ class PdfSignature extends PdfObjectDict { | @@ -60,6 +100,9 @@ class PdfSignature extends PdfObjectDict { | ||
| 60 | } | 100 | } |
| 61 | 101 | ||
| 62 | abstract class PdfSignatureBase { | 102 | abstract class PdfSignatureBase { |
| 103 | + /// Modification detection and prevention | ||
| 104 | + bool get hasMDP => false; | ||
| 105 | + | ||
| 63 | void preSign(PdfObject object, PdfDict params); | 106 | void preSign(PdfObject object, PdfDict params); |
| 64 | 107 | ||
| 65 | Future<void> sign(PdfObject object, PdfStream os, PdfDict params, | 108 | Future<void> sign(PdfObject object, PdfStream os, PdfDict params, |
| @@ -14,6 +14,8 @@ | @@ -14,6 +14,8 @@ | ||
| 14 | * limitations under the License. | 14 | * limitations under the License. |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | +import 'dart:typed_data'; | ||
| 18 | + | ||
| 17 | import 'package:pdf/pdf.dart'; | 19 | import 'package:pdf/pdf.dart'; |
| 18 | import 'package:vector_math/vector_math_64.dart'; | 20 | import 'package:vector_math/vector_math_64.dart'; |
| 19 | 21 | ||
| @@ -320,6 +322,9 @@ class Signature extends SingleChildWidget { | @@ -320,6 +322,9 @@ class Signature extends SingleChildWidget { | ||
| 320 | this.date, | 322 | this.date, |
| 321 | this.color, | 323 | this.color, |
| 322 | this.highlighting, | 324 | this.highlighting, |
| 325 | + this.crl, | ||
| 326 | + this.cert, | ||
| 327 | + this.ocsp, | ||
| 323 | }) : value = value ?? crypto, | 328 | }) : value = value ?? crypto, |
| 324 | super(child: child); | 329 | super(child: child); |
| 325 | 330 | ||
| @@ -346,6 +351,15 @@ class Signature extends SingleChildWidget { | @@ -346,6 +351,15 @@ class Signature extends SingleChildWidget { | ||
| 346 | /// Field highlighting | 351 | /// Field highlighting |
| 347 | final PdfAnnotHighlighting? highlighting; | 352 | final PdfAnnotHighlighting? highlighting; |
| 348 | 353 | ||
| 354 | + /// Certificate revocation lists | ||
| 355 | + final List<Uint8List>? crl; | ||
| 356 | + | ||
| 357 | + /// Additional X509 certificates | ||
| 358 | + final List<Uint8List>? cert; | ||
| 359 | + | ||
| 360 | + /// Online Certificate Status Protocol | ||
| 361 | + final List<Uint8List>? ocsp; | ||
| 362 | + | ||
| 349 | @override | 363 | @override |
| 350 | void paint(Context context) { | 364 | void paint(Context context) { |
| 351 | super.paint(context); | 365 | super.paint(context); |
| @@ -358,6 +372,9 @@ class Signature extends SingleChildWidget { | @@ -358,6 +372,9 @@ class Signature extends SingleChildWidget { | ||
| 358 | PdfSigFlags.signaturesExist, | 372 | PdfSigFlags.signaturesExist, |
| 359 | if (appendOnly) PdfSigFlags.appendOnly, | 373 | if (appendOnly) PdfSigFlags.appendOnly, |
| 360 | }, | 374 | }, |
| 375 | + crl: crl, | ||
| 376 | + cert: cert, | ||
| 377 | + ocsp: ocsp, | ||
| 361 | ); | 378 | ); |
| 362 | } else { | 379 | } else { |
| 363 | paintChild(context); | 380 | paintChild(context); |
-
Please register or login to post a comment