David PHAM-VAN

Add Document ID

  1 +## 1.3.14
  2 +
  3 +* Add Document ID
  4 +
1 ## 1.3.13 5 ## 1.3.13
2 6
3 * Do not modify the TTF font streams 7 * Do not modify the TTF font streams
@@ -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