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