Showing
6 changed files
with
42 additions
and
4 deletions
| @@ -21,6 +21,7 @@ import 'dart:convert'; | @@ -21,6 +21,7 @@ import 'dart:convert'; | ||
| 21 | import 'dart:math' as math; | 21 | import 'dart:math' as math; |
| 22 | import 'dart:typed_data'; | 22 | import 'dart:typed_data'; |
| 23 | 23 | ||
| 24 | +import 'package:crypto/crypto.dart'; | ||
| 24 | import 'package:meta/meta.dart'; | 25 | import 'package:meta/meta.dart'; |
| 25 | import 'package:utf/utf.dart'; | 26 | import 'package:utf/utf.dart'; |
| 26 | import 'package:vector_math/vector_math_64.dart'; | 27 | import 'package:vector_math/vector_math_64.dart'; |
| @@ -34,21 +35,21 @@ part 'src/color.dart'; | @@ -34,21 +35,21 @@ part 'src/color.dart'; | ||
| 34 | part 'src/colors.dart'; | 35 | part 'src/colors.dart'; |
| 35 | part 'src/compatibility.dart'; | 36 | part 'src/compatibility.dart'; |
| 36 | part 'src/document.dart'; | 37 | part 'src/document.dart'; |
| 37 | -part 'src/font.dart'; | ||
| 38 | part 'src/font_descriptor.dart'; | 38 | part 'src/font_descriptor.dart'; |
| 39 | part 'src/font_metrics.dart'; | 39 | part 'src/font_metrics.dart'; |
| 40 | +part 'src/font.dart'; | ||
| 40 | part 'src/formxobject.dart'; | 41 | part 'src/formxobject.dart'; |
| 41 | part 'src/graphics.dart'; | 42 | part 'src/graphics.dart'; |
| 42 | part 'src/image.dart'; | 43 | part 'src/image.dart'; |
| 43 | part 'src/info.dart'; | 44 | part 'src/info.dart'; |
| 44 | part 'src/names.dart'; | 45 | part 'src/names.dart'; |
| 45 | -part 'src/object.dart'; | ||
| 46 | part 'src/object_stream.dart'; | 46 | part 'src/object_stream.dart'; |
| 47 | +part 'src/object.dart'; | ||
| 47 | part 'src/outline.dart'; | 48 | part 'src/outline.dart'; |
| 48 | part 'src/output.dart'; | 49 | part 'src/output.dart'; |
| 49 | -part 'src/page.dart'; | ||
| 50 | part 'src/page_format.dart'; | 50 | part 'src/page_format.dart'; |
| 51 | part 'src/page_list.dart'; | 51 | part 'src/page_list.dart'; |
| 52 | +part 'src/page.dart'; | ||
| 52 | part 'src/point.dart'; | 53 | part 'src/point.dart'; |
| 53 | part 'src/polygon.dart'; | 54 | part 'src/polygon.dart'; |
| 54 | part 'src/rect.dart'; | 55 | part 'src/rect.dart'; |
| @@ -97,6 +97,20 @@ class PdfDocument { | @@ -97,6 +97,20 @@ class PdfDocument { | ||
| 97 | /// This holds the current fonts | 97 | /// This holds the current fonts |
| 98 | final Set<PdfFont> fonts = Set<PdfFont>(); | 98 | final Set<PdfFont> fonts = Set<PdfFont>(); |
| 99 | 99 | ||
| 100 | + /// Generates the document ID | ||
| 101 | + List<int> _documentID; | ||
| 102 | + List<int> get documentID { | ||
| 103 | + if (_documentID == null) { | ||
| 104 | + final math.Random rnd = math.Random(); | ||
| 105 | + _documentID = sha256 | ||
| 106 | + .convert(DateTime.now().toIso8601String().codeUnits + | ||
| 107 | + List<int>.generate(32, (_) => rnd.nextInt(256))) | ||
| 108 | + .bytes; | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | + return _documentID; | ||
| 112 | + } | ||
| 113 | + | ||
| 100 | /// Creates a new serial number | 114 | /// Creates a new serial number |
| 101 | int _genSerial() => _objser++; | 115 | int _genSerial() => _objser++; |
| 102 | 116 |
| @@ -106,6 +106,8 @@ class PdfOutput { | @@ -106,6 +106,8 @@ class PdfOutput { | ||
| 106 | // the /Root catalog indirect reference (REQUIRED) | 106 | // the /Root catalog indirect reference (REQUIRED) |
| 107 | if (rootID != null) { | 107 | if (rootID != null) { |
| 108 | params['/Root'] = rootID.ref(); | 108 | params['/Root'] = rootID.ref(); |
| 109 | + final PdfStream id = PdfStream.binary(rootID.pdfDocument.documentID); | ||
| 110 | + params['/ID'] = PdfStream.array(<PdfStream>[id, id]); | ||
| 109 | } else { | 111 | } else { |
| 110 | throw Exception('Root object is not present in document'); | 112 | throw Exception('Root object is not present in document'); |
| 111 | } | 113 | } |
| @@ -122,6 +122,22 @@ class PdfStream { | @@ -122,6 +122,22 @@ class PdfStream { | ||
| 122 | putString(value ? 'true' : 'false'); | 122 | putString(value ? 'true' : 'false'); |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | + /// Returns the ASCII/Unicode code unit corresponding to the hexadecimal digit | ||
| 126 | + /// [digit]. | ||
| 127 | + int _codeUnitForDigit(int digit) => | ||
| 128 | + digit < 10 ? digit + 0x30 : digit + 0x61 - 10; | ||
| 129 | + | ||
| 130 | + void putBinary(List<int> s) { | ||
| 131 | + _stream.add(0x3c); | ||
| 132 | + for (int byte in s) { | ||
| 133 | + _stream.add(_codeUnitForDigit((byte & 0xF0) >> 4)); | ||
| 134 | + _stream.add(_codeUnitForDigit(byte & 0x0F)); | ||
| 135 | + } | ||
| 136 | + _stream.add(0x3e); | ||
| 137 | + } | ||
| 138 | + | ||
| 139 | + static PdfStream binary(List<int> s) => PdfStream()..putBinary(s); | ||
| 140 | + | ||
| 125 | void putArray(List<PdfStream> values) { | 141 | void putArray(List<PdfStream> values) { |
| 126 | putString('['); | 142 | putString('['); |
| 127 | for (PdfStream val in values) { | 143 | for (PdfStream val in values) { |
| @@ -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: 1.3.13 | 7 | +version: 1.3.14 |
| 8 | 8 | ||
| 9 | environment: | 9 | environment: |
| 10 | sdk: ">=2.1.0 <3.0.0" | 10 | sdk: ">=2.1.0 <3.0.0" |
| @@ -13,6 +13,7 @@ dependencies: | @@ -13,6 +13,7 @@ dependencies: | ||
| 13 | meta: "^1.1.5" | 13 | meta: "^1.1.5" |
| 14 | vector_math: "^2.0.0" | 14 | vector_math: "^2.0.0" |
| 15 | utf: "^0.9.0" | 15 | utf: "^0.9.0" |
| 16 | + crypto: "^2.0.6" | ||
| 16 | 17 | ||
| 17 | dev_dependencies: | 18 | dev_dependencies: |
| 18 | test: any | 19 | test: any |
-
Please register or login to post a comment