hexapdf 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -2
  3. data/lib/hexapdf/cli/command.rb +7 -1
  4. data/lib/hexapdf/content/canvas.rb +2 -2
  5. data/lib/hexapdf/content/graphics_state.rb +144 -21
  6. data/lib/hexapdf/dictionary_fields.rb +1 -1
  7. data/lib/hexapdf/task/optimize.rb +46 -3
  8. data/lib/hexapdf/version.rb +1 -1
  9. data/test/data/cert/create.sh +171 -0
  10. data/test/data/cert/root-ca/certs/84E66B6F4C359E741C0AFA014790DF39.pem +119 -0
  11. data/test/data/cert/root-ca/certs/84E66B6F4C359E741C0AFA014790DF3A.pem +125 -0
  12. data/test/data/cert/root-ca/db/crlnumber +1 -0
  13. data/test/data/cert/root-ca/db/index +2 -0
  14. data/test/data/cert/root-ca/db/index.attr +1 -0
  15. data/test/data/cert/root-ca/db/index.attr.old +1 -0
  16. data/test/data/cert/root-ca/db/index.old +1 -0
  17. data/test/data/cert/root-ca/db/serial +1 -0
  18. data/test/data/cert/root-ca/db/serial.old +1 -0
  19. data/test/data/cert/root-ca/private/root-ca.key +52 -0
  20. data/test/data/cert/root-ca/root-ca.conf +65 -0
  21. data/test/data/cert/root-ca/root-ca.crt +119 -0
  22. data/test/data/cert/root-ca/root-ca.csr +28 -0
  23. data/test/data/cert/signature-1-pkcs7-detached.pdf +182 -0
  24. data/test/data/cert/sub-ca/certs/453FF080E3EDCD6A388D5368DFC320D9.pem +125 -0
  25. data/test/data/cert/sub-ca/db/crlnumber +1 -0
  26. data/test/data/cert/sub-ca/db/index +1 -0
  27. data/test/data/cert/sub-ca/db/index.attr +1 -0
  28. data/test/data/cert/sub-ca/db/index.old +0 -0
  29. data/test/data/cert/sub-ca/db/serial +1 -0
  30. data/test/data/cert/sub-ca/db/serial.old +1 -0
  31. data/test/data/cert/sub-ca/private/signing.key +52 -0
  32. data/test/data/cert/sub-ca/private/sub-ca.key +52 -0
  33. data/test/data/cert/sub-ca/signing.crt +125 -0
  34. data/test/data/cert/sub-ca/signing.csr +28 -0
  35. data/test/data/cert/sub-ca/signing.p12 +0 -0
  36. data/test/data/cert/sub-ca/sub-ca.conf +65 -0
  37. data/test/data/cert/sub-ca/sub-ca.crt +125 -0
  38. data/test/data/cert/sub-ca/sub-ca.csr +28 -0
  39. data/test/hexapdf/task/test_optimize.rb +26 -0
  40. data/test/hexapdf/test_dictionary_fields.rb +1 -0
  41. data/test/hexapdf/test_writer.rb +2 -2
  42. metadata +32 -2
@@ -0,0 +1,125 @@
1
+ Certificate:
2
+ Data:
3
+ Version: 3 (0x2)
4
+ Serial Number:
5
+ 45:3f:f0:80:e3:ed:cd:6a:38:8d:53:68:df:c3:20:d9
6
+ Signature Algorithm: sha256WithRSAEncryption
7
+ Issuer: C=AT, O=HexaPDF, CN=HexaPDF Test Subordinate CA
8
+ Validity
9
+ Not Before: Nov 8 06:10:03 2021 GMT
10
+ Not After : Oct 15 06:10:03 2121 GMT
11
+ Subject: C=AT, O=HexaPDF, CN=HexaPDF Test Certifcate
12
+ Subject Public Key Info:
13
+ Public Key Algorithm: rsaEncryption
14
+ RSA Public-Key: (4096 bit)
15
+ Modulus:
16
+ 00:c6:06:9a:58:e1:b2:f9:5e:61:3b:30:e0:88:5f:
17
+ 11:ff:33:b9:1b:2b:94:f8:ad:02:fa:d2:53:62:74:
18
+ f7:71:6a:b9:ca:08:2c:e8:8e:21:41:b3:66:3a:dd:
19
+ c2:1f:a6:49:12:6e:d7:ca:df:5a:77:a4:d0:88:aa:
20
+ 8d:88:43:b1:3f:f4:67:3d:c7:9b:9e:54:d8:50:59:
21
+ ac:a5:99:b6:39:f6:d5:5c:e5:c6:5e:1d:d7:dc:4f:
22
+ 4c:55:d5:d8:e6:5a:82:d0:1e:51:53:c8:92:b9:35:
23
+ 56:3d:61:d0:ed:dc:b7:4d:2b:e4:af:b7:c3:72:7a:
24
+ ec:3e:d6:78:2c:83:2b:c9:1b:a0:67:f0:b0:3b:25:
25
+ 0f:d7:54:f5:0d:b4:8e:88:fe:e5:fa:53:36:d5:f3:
26
+ 77:e7:15:fe:83:3d:03:d1:99:bf:b9:39:3d:ca:1b:
27
+ fe:b1:0e:33:44:5f:81:47:6f:d9:eb:ca:12:e5:e8:
28
+ 78:7f:1a:59:fe:52:ef:21:a5:71:97:b1:51:f1:96:
29
+ e7:13:af:e7:bd:95:2d:4b:35:94:23:e6:aa:73:22:
30
+ c8:83:58:61:4a:a9:a1:7d:d9:71:fa:f3:b9:fb:89:
31
+ 1d:1e:5c:be:f9:e1:8b:7b:66:95:45:25:94:4f:53:
32
+ 63:8e:34:20:dc:de:a7:20:0f:6a:34:f2:23:1d:51:
33
+ 8c:21:06:4d:36:34:88:43:18:8e:b7:1e:e7:e4:49:
34
+ 4a:e6:53:43:67:bf:fc:4e:db:41:54:da:56:b6:6a:
35
+ 6d:0e:02:d9:be:1a:38:5e:62:ca:2e:a3:f3:af:1f:
36
+ a8:a4:f1:b7:04:92:91:0f:01:08:81:94:18:d2:39:
37
+ d8:aa:20:0a:76:a4:c2:71:ce:ef:06:cd:19:d4:58:
38
+ 25:28:aa:86:a3:ab:44:74:6b:46:c8:57:04:37:0c:
39
+ 61:20:5f:24:fc:07:9b:81:13:76:1d:76:77:89:e2:
40
+ 04:25:c1:c2:13:4c:80:22:ec:10:c1:05:aa:f7:ca:
41
+ c6:08:5f:87:c1:e3:6e:e7:ab:eb:6b:c3:61:9d:90:
42
+ 01:5f:19:16:a3:6d:64:6d:d3:f6:90:e5:61:30:60:
43
+ 72:fb:a9:a4:da:e0:97:b4:de:2b:ef:11:fa:8f:25:
44
+ 33:fe:a5:1a:64:e5:8a:fe:02:d5:97:c2:ea:98:fd:
45
+ 15:3b:8e:80:54:e3:44:46:8c:79:a3:a8:fd:2c:93:
46
+ 9b:db:9c:c4:47:3d:56:87:80:0d:e2:c8:a2:b8:17:
47
+ 9b:46:27:f0:e8:dd:7f:79:af:f4:50:01:da:90:0e:
48
+ 17:e8:91:33:75:2a:fc:92:68:5a:b2:a5:71:e1:21:
49
+ e7:f4:9d:75:5d:82:d2:0b:10:cd:4f:52:74:46:9e:
50
+ e6:32:4d
51
+ Exponent: 65537 (0x10001)
52
+ X509v3 extensions:
53
+ X509v3 Authority Key Identifier:
54
+ keyid:56:3E:DA:D2:9A:AA:30:A1:70:75:5A:85:15:FE:2F:8B:F5:86:FF:61
55
+
56
+ X509v3 Basic Constraints: critical
57
+ CA:FALSE
58
+ X509v3 Extended Key Usage:
59
+ TLS Web Client Authentication
60
+ X509v3 Key Usage: critical
61
+ Digital Signature
62
+ X509v3 Subject Key Identifier:
63
+ F8:07:CF:B8:40:CB:1E:10:0F:AF:5F:26:4F:10:F5:76:94:EF:AD:27
64
+ Signature Algorithm: sha256WithRSAEncryption
65
+ 6e:bb:7a:53:e0:87:f5:2c:c5:cc:a5:0b:3a:c6:15:f8:39:f1:
66
+ 7d:a6:d0:ca:6c:10:fa:dc:bf:26:d1:39:2d:67:f4:e4:35:29:
67
+ 1a:17:50:13:07:c9:79:85:be:d0:44:e7:15:20:5f:d5:6e:ae:
68
+ fa:fa:05:84:2c:d3:c9:ba:51:22:df:f4:6e:b1:c7:be:09:d5:
69
+ 58:03:10:f5:95:7d:e3:c5:bf:91:05:05:c3:f3:3b:bc:b1:76:
70
+ 19:e9:ba:9f:ac:7a:77:11:77:f8:f2:1b:6c:b1:ec:4d:43:52:
71
+ ac:87:9c:58:2d:5d:ea:6a:c3:97:d7:3d:ed:80:e4:68:9c:47:
72
+ d3:a8:0d:4e:63:37:55:77:b9:ec:eb:43:63:a5:8f:9d:51:13:
73
+ 09:2f:3a:c8:e4:09:20:34:fc:1d:e9:42:0e:64:54:6c:32:ba:
74
+ de:50:73:ca:bd:6d:03:2a:ea:b9:3a:d0:4f:e8:de:12:c4:69:
75
+ 72:c3:66:e3:be:5e:77:d4:04:9f:e9:25:11:ea:b5:db:68:1d:
76
+ 23:a3:50:b4:c7:d1:9d:57:09:e2:aa:c4:b0:0f:80:54:d7:ba:
77
+ f4:01:a2:3a:ff:bd:65:af:14:69:b7:77:0a:fe:87:c5:21:48:
78
+ 52:39:64:5c:df:e9:b3:62:98:7b:b0:e9:0a:79:6a:02:2f:10:
79
+ aa:9a:be:6d:91:a1:f0:66:84:ba:c2:68:8e:48:63:e8:dc:85:
80
+ 87:3b:2e:fc:e2:ff:67:f6:3a:52:18:c1:80:14:11:b6:cc:86:
81
+ 9c:8e:27:a9:e6:47:0f:a3:5f:5b:89:6e:b8:f2:98:59:3a:f0:
82
+ c7:30:42:cd:17:fe:cf:a0:a0:f3:22:cb:6c:e5:f8:a2:b4:ca:
83
+ 87:e9:80:5a:28:7b:0e:dc:81:b9:74:c0:c8:27:0a:cf:fe:4d:
84
+ 5f:d6:16:64:d6:d9:4e:04:ef:65:10:18:39:18:26:ad:d2:fe:
85
+ 91:9a:3a:95:61:55:46:96:0e:ab:ea:b1:61:c2:04:b6:5e:14:
86
+ bf:5e:94:70:6e:c6:02:33:bf:d5:5f:4f:1d:b3:d5:45:c6:be:
87
+ be:7b:1d:30:c5:e2:3f:f4:77:63:fa:ab:85:40:58:b0:98:94:
88
+ 7e:a2:a9:ce:59:04:c5:6d:99:71:7d:bd:ad:43:e6:24:37:fc:
89
+ 01:75:7a:b9:5d:fc:80:b0:64:ba:f2:6f:d4:06:1f:21:13:82:
90
+ 43:13:af:93:cd:d6:c0:79:75:ee:7b:01:96:6f:0c:38:45:52:
91
+ 92:71:9a:d5:33:c1:f3:6c:7c:c6:18:96:59:d5:a9:21:36:9e:
92
+ fd:39:c6:7a:74:2f:71:64:52:b5:70:a8:d8:73:f4:50:bb:33:
93
+ fc:84:9c:77:9f:da:db:f5
94
+ -----BEGIN CERTIFICATE-----
95
+ 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
124
+ nv05xnp0L3FkUrVwqNhz9FC7M/yEnHef2tv1
125
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIIE1zCCAr8CAQAwQTELMAkGA1UEBhMCQVQxEDAOBgNVBAoMB0hleGFQREYxIDAe
3
+ BgNVBAMMF0hleGFQREYgVGVzdCBDZXJ0aWZjYXRlMIICIjANBgkqhkiG9w0BAQEF
4
+ AAOCAg8AMIICCgKCAgEAxgaaWOGy+V5hOzDgiF8R/zO5GyuU+K0C+tJTYnT3cWq5
5
+ yggs6I4hQbNmOt3CH6ZJEm7Xyt9ad6TQiKqNiEOxP/RnPcebnlTYUFmspZm2OfbV
6
+ XOXGXh3X3E9MVdXY5lqC0B5RU8iSuTVWPWHQ7dy3TSvkr7fDcnrsPtZ4LIMryRug
7
+ Z/CwOyUP11T1DbSOiP7l+lM21fN35xX+gz0D0Zm/uTk9yhv+sQ4zRF+BR2/Z68oS
8
+ 5eh4fxpZ/lLvIaVxl7FR8ZbnE6/nvZUtSzWUI+aqcyLIg1hhSqmhfdlx+vO5+4kd
9
+ Hly++eGLe2aVRSWUT1NjjjQg3N6nIA9qNPIjHVGMIQZNNjSIQxiOtx7n5ElK5lND
10
+ Z7/8TttBVNpWtmptDgLZvho4XmLKLqPzrx+opPG3BJKRDwEIgZQY0jnYqiAKdqTC
11
+ cc7vBs0Z1FglKKqGo6tEdGtGyFcENwxhIF8k/AebgRN2HXZ3ieIEJcHCE0yAIuwQ
12
+ wQWq98rGCF+HweNu56vra8NhnZABXxkWo21kbdP2kOVhMGBy+6mk2uCXtN4r7xH6
13
+ jyUz/qUaZOWK/gLVl8LqmP0VO46AVONERox5o6j9LJOb25zERz1Wh4AN4siiuBeb
14
+ Rifw6N1/ea/0UAHakA4X6JEzdSr8kmhasqVx4SHn9J11XYLSCxDNT1J0Rp7mMk0C
15
+ AwEAAaBRME8GCSqGSIb3DQEJDjFCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
16
+ Af8EBAMCAQYwHQYDVR0OBBYEFPgHz7hAyx4QD69fJk8Q9XaU760nMA0GCSqGSIb3
17
+ DQEBCwUAA4ICAQAWLbFz+aTtfFq6xMoW1eekRcXzgaPboX+FEj8fsIJzIIZ+ff6V
18
+ X1B9ozVJx1Sgkt1x7hoo0EJJt88NQcbiWi+HPhyCs/ak+WE/mKQEKSTArrgcUDtK
19
+ B+F2a7eF5LWiY4YA+8tl1xeG6nCbxTFQMUGbO4s86HXu6B7FeXKmOBn3+83J1lBL
20
+ D9lU3tSUcT9WncmP9QT4elQHAV5sYfo1tTjnHL1nUglZa2PScMa7bbaJZZd7C3N/
21
+ FPEZt/kY2cYHj73Krh4L/bY6q6+CX8P0Fna1OhS0TFYOIYYxUnVzZ+7iKMBmexOZ
22
+ bP3ggOPMgJE3qw7icF6XQbH95IaoLAXNm5DuPLF2+N9l6+rU+T9eyEWoBg+kqEl2
23
+ dE/FrHpsse4Vr2+uuqm/zWr/oa+oESzwRAo3do1pH8uZuziYzDyt9OdSnhwVnjR0
24
+ YXz5vTKzRf4AVSYQjxL6xJ+AUoZcfB/k6oTHoSR6KKKHCWi2uDJaZuMbTmQK1Slg
25
+ YW4vi3DHIoeVfJGHvtTsHJ5OXVLm99toJN0lJYRLlp0sod+tmFhvaSvUTPZR0Vm4
26
+ dpHgLOFJM8gcGGr4yZs+rZYrDuMLuT9KNGfudGgYXNenwE9Lw/9VLtkyZuoJSDfu
27
+ /vQDNaGuq4SzhSHYv9rCnTK9jgmDfGCWaFYlbZkoMDwRN7E9VluEmnIeLA==
28
+ -----END CERTIFICATE REQUEST-----
Binary file
@@ -0,0 +1,65 @@
1
+ [default]
2
+ name = sub-ca
3
+ domain_suffix = hexapdf.gettalong.org
4
+ aia_url = http://$name.$domain_suffix/$name.crt
5
+ crl_url = http://$name.$domain_suffix/$name.crl
6
+ default_ca = ca_default
7
+ name_opt = utf8,esc_ctrl,multiline,lname,align
8
+
9
+ [ca_dn]
10
+ countryName = "AT"
11
+ organizationName = "HexaPDF"
12
+ commonName = "HexaPDF Test Subordinate CA"
13
+
14
+ [ca_default]
15
+ home = ../sub-ca
16
+ database = $home/db/index
17
+ serial = $home/db/serial
18
+ crlnumber = $home/db/crlnumber
19
+ certificate = $home/$name.crt
20
+ private_key = $home/private/$name.key
21
+ RANDFILE = $home/private/random
22
+ new_certs_dir = $home/certs
23
+ unique_subject = no
24
+ copy_extensions = copy
25
+ default_days = 36500
26
+ default_crl_days = 90
27
+ default_md = sha256
28
+ policy = policy_c_o_match
29
+
30
+ [policy_c_o_match]
31
+ countryName = match
32
+ stateOrProvinceName = optional
33
+ organizationName = match
34
+ organizationalUnitName = optional
35
+ commonName = supplied
36
+ emailAddress = optional
37
+
38
+ [req]
39
+ default_bits = 4096
40
+ encrypt_key = no
41
+ default_md = sha256
42
+ utf8 = yes
43
+ string_mask = utf8only
44
+ prompt = no
45
+ distinguished_name = ca_dn
46
+ req_extensions = ca_ext
47
+
48
+ [ca_ext]
49
+ basicConstraints = critical,CA:true
50
+ keyUsage = critical,keyCertSign,cRLSign
51
+ subjectKeyIdentifier = hash
52
+
53
+ [sub_ca_ext]
54
+ authorityKeyIdentifier = keyid:always
55
+ basicConstraints = critical,CA:true,pathlen:0
56
+ extendedKeyUsage = clientAuth,serverAuth
57
+ keyUsage = critical,keyCertSign,cRLSign
58
+ subjectKeyIdentifier = hash
59
+
60
+ [client_ext]
61
+ authorityKeyIdentifier = keyid:always
62
+ basicConstraints = critical,CA:false
63
+ extendedKeyUsage = clientAuth
64
+ keyUsage = critical,digitalSignature
65
+ subjectKeyIdentifier = hash
@@ -0,0 +1,125 @@
1
+ Certificate:
2
+ Data:
3
+ Version: 3 (0x2)
4
+ Serial Number:
5
+ 84:e6:6b:6f:4c:35:9e:74:1c:0a:fa:01:47:90:df:3a
6
+ Signature Algorithm: sha256WithRSAEncryption
7
+ Issuer: C=AT, O=HexaPDF, CN=HexaPDF Test Root CA
8
+ Validity
9
+ Not Before: Nov 8 06:10:02 2021 GMT
10
+ Not After : Oct 15 06:10:02 2121 GMT
11
+ Subject: C=AT, O=HexaPDF, CN=HexaPDF Test Subordinate CA
12
+ Subject Public Key Info:
13
+ Public Key Algorithm: rsaEncryption
14
+ RSA Public-Key: (4096 bit)
15
+ Modulus:
16
+ 00:a6:2e:82:aa:b8:8f:e4:3c:c5:15:bb:8b:ea:75:
17
+ f6:10:a1:61:a8:43:2e:ef:ee:78:0a:a7:a0:ce:76:
18
+ a0:85:ad:5c:93:d8:d1:21:27:55:85:8d:82:be:e0:
19
+ e3:70:5e:01:e6:a7:1a:44:4d:80:83:9b:31:fc:35:
20
+ 0f:53:67:ea:b3:99:ca:34:78:19:c6:8a:7e:08:1e:
21
+ 01:17:f1:88:e5:4d:f0:28:9e:33:fa:68:a0:38:1c:
22
+ ee:b8:8e:0a:85:40:62:2f:53:3e:e2:d4:50:5d:77:
23
+ a1:7d:4b:a6:53:6e:5a:4d:ab:68:dd:95:7a:ba:2c:
24
+ 8b:f2:5b:7d:1d:87:e8:33:04:f7:f0:ed:60:f2:d3:
25
+ 85:48:e1:ab:98:d7:01:89:73:49:50:18:21:9e:fc:
26
+ a7:3e:e2:eb:32:1c:fc:34:3d:5f:3b:f5:d6:2e:8d:
27
+ 5b:d7:80:48:62:b4:92:e1:ff:ca:f6:8a:e4:e4:ac:
28
+ 70:d7:2a:75:d2:1b:81:27:d4:39:60:e1:2a:c4:7e:
29
+ 7f:d1:5a:45:5d:da:14:ac:5e:47:6a:1f:81:6c:ec:
30
+ 91:44:b8:07:3b:02:d5:35:ff:fd:3b:d0:12:a6:67:
31
+ 0b:98:ae:26:5e:7c:9c:5f:0b:c5:8b:2a:63:85:45:
32
+ c9:6e:1e:8a:64:fd:1f:e3:c6:82:65:52:e1:24:3f:
33
+ b3:3e:e9:0c:37:de:26:91:61:b5:10:84:64:04:25:
34
+ f7:ab:e0:83:76:3d:c9:9e:12:c8:dc:84:85:71:99:
35
+ f4:75:3c:63:da:5a:06:ac:60:13:48:00:2a:c3:b5:
36
+ 23:06:99:d6:fd:81:3a:61:64:b2:d9:5b:ae:45:0c:
37
+ 4b:bb:a8:9c:2d:0e:a6:fe:d4:74:ca:51:70:4b:60:
38
+ c2:bc:d5:c2:9a:79:c6:85:6c:f8:72:60:41:f6:b0:
39
+ 58:cf:d4:ed:7c:fd:d9:2a:bc:8e:3b:5a:4f:4b:58:
40
+ e0:6e:7c:7c:f1:28:a5:52:85:dd:24:48:70:70:97:
41
+ 75:3f:b3:2b:02:55:ac:c6:05:bb:ec:f2:7d:6a:a2:
42
+ c6:0a:5e:86:ed:32:93:cc:f2:2b:d9:68:22:c9:44:
43
+ 9c:8e:6d:88:17:50:54:7a:fc:27:c4:b5:93:42:6f:
44
+ dd:d7:c5:28:8b:8f:c2:2c:0f:02:76:d9:f8:11:78:
45
+ 5d:00:d7:17:9c:57:4a:b6:0a:51:a6:d5:79:7b:ca:
46
+ 6b:e0:59:e2:7e:0a:4b:ae:33:cb:39:b4:fe:8f:62:
47
+ 8d:0b:07:87:d0:27:8c:3f:a0:42:f1:a5:36:4f:21:
48
+ 57:f7:3c:5a:1b:60:ca:41:0d:e3:3e:35:16:23:c5:
49
+ 82:d0:c1:47:50:8a:ba:35:26:8f:1a:d1:95:2c:1f:
50
+ 91:ee:1b
51
+ Exponent: 65537 (0x10001)
52
+ X509v3 extensions:
53
+ X509v3 Authority Key Identifier:
54
+ keyid:1A:80:9F:49:AD:91:C8:C0:36:23:1D:ED:CD:FF:2A:F6:43:47:E4:6D
55
+
56
+ X509v3 Basic Constraints: critical
57
+ CA:TRUE, pathlen:0
58
+ X509v3 Extended Key Usage:
59
+ TLS Web Client Authentication, TLS Web Server Authentication
60
+ X509v3 Key Usage: critical
61
+ Certificate Sign, CRL Sign
62
+ X509v3 Subject Key Identifier:
63
+ 56:3E:DA:D2:9A:AA:30:A1:70:75:5A:85:15:FE:2F:8B:F5:86:FF:61
64
+ Signature Algorithm: sha256WithRSAEncryption
65
+ 39:23:34:6b:dc:54:d8:b0:ce:81:7c:59:5e:03:54:43:c3:28:
66
+ f7:a8:fd:73:2a:47:7e:d0:0c:29:7b:47:fe:5c:ce:64:dd:08:
67
+ 99:35:91:b8:15:19:b2:b2:0e:6b:37:61:37:44:82:86:77:e0:
68
+ 1f:63:c5:e1:15:e8:97:80:34:c0:cf:58:3c:32:60:d5:1c:9b:
69
+ 14:80:72:cb:ac:d2:66:d4:c3:4b:f9:1a:7f:41:a5:46:ca:66:
70
+ ac:83:d6:e7:b0:02:a4:78:f4:7f:30:34:ac:33:f9:31:68:b4:
71
+ 8e:a8:7f:2e:e1:64:58:e4:e8:92:48:18:18:15:40:8b:91:8d:
72
+ 6e:a6:aa:80:c3:15:2d:e1:7d:33:46:b7:be:06:be:5e:72:7b:
73
+ fb:87:fc:9f:1e:74:cd:d8:c7:f9:eb:16:5c:62:28:1c:38:c3:
74
+ f8:bb:11:06:6f:3f:2b:51:a8:d2:f3:a2:80:87:57:72:f3:98:
75
+ b8:5d:9d:6e:32:8f:50:9e:12:ab:22:22:68:68:59:0e:99:93:
76
+ 8c:1a:4e:0f:df:7f:0c:35:5c:fa:67:ad:4b:3e:2b:32:c2:10:
77
+ 7f:cf:5e:16:d8:7e:1b:21:d3:ff:7a:0e:19:4a:49:c4:cf:b9:
78
+ e8:61:61:e3:3b:0f:10:73:28:fe:8e:3b:74:7e:a4:27:7e:d2:
79
+ 67:27:a5:b4:11:e9:29:d9:ef:84:5e:53:d0:9b:1e:a8:2e:7b:
80
+ 70:b4:09:e1:53:26:d9:09:25:e5:fb:e4:95:71:18:8d:22:de:
81
+ cc:6f:f2:6c:d3:10:8d:7b:1f:72:b0:1b:88:39:c7:5d:a7:46:
82
+ db:a1:91:ae:66:17:0d:6d:b0:09:b0:a0:89:fc:bf:37:3d:25:
83
+ 67:3d:eb:e8:46:90:95:ac:46:d4:7f:4f:4a:3e:f4:98:96:21:
84
+ ba:59:f1:dc:96:e3:03:78:e5:74:5a:17:c3:99:a0:1c:45:36:
85
+ 3c:82:01:a2:1b:ff:6f:5b:6a:6f:c4:da:bf:35:3c:05:73:01:
86
+ 6a:ef:f0:57:99:ec:63:ff:dd:32:e2:8b:df:fc:64:10:90:47:
87
+ 58:21:86:90:2f:1b:4c:bf:8b:36:2a:a3:c3:a2:9a:95:31:cb:
88
+ 3a:03:37:c8:71:8f:ff:d8:9b:42:6c:2e:5e:dc:bb:1c:8b:97:
89
+ cd:97:33:4d:80:8f:db:ad:ec:ac:2a:45:e6:3f:a4:66:c1:17:
90
+ 2d:90:e0:88:f3:b8:d5:fe:36:d6:33:e2:86:1a:bf:d0:e5:01:
91
+ 90:17:da:fa:4a:8a:07:e5:1e:9f:43:45:00:a1:bd:b6:90:13:
92
+ 01:35:d5:0f:59:06:63:b6:a8:3c:78:a6:5b:be:55:70:5e:be:
93
+ 0b:da:72:38:ef:2c:f8:af
94
+ -----BEGIN CERTIFICATE-----
95
+ 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
125
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIIE2zCCAsMCAQAwRTELMAkGA1UEBhMCQVQxEDAOBgNVBAoMB0hleGFQREYxJDAi
3
+ BgNVBAMMG0hleGFQREYgVGVzdCBTdWJvcmRpbmF0ZSBDQTCCAiIwDQYJKoZIhvcN
4
+ AQEBBQADggIPADCCAgoCggIBAKYugqq4j+Q8xRW7i+p19hChYahDLu/ueAqnoM52
5
+ oIWtXJPY0SEnVYWNgr7g43BeAeanGkRNgIObMfw1D1Nn6rOZyjR4GcaKfggeARfx
6
+ iOVN8CieM/pooDgc7riOCoVAYi9TPuLUUF13oX1LplNuWk2raN2Verosi/JbfR2H
7
+ 6DME9/DtYPLThUjhq5jXAYlzSVAYIZ78pz7i6zIc/DQ9Xzv11i6NW9eASGK0kuH/
8
+ yvaK5OSscNcqddIbgSfUOWDhKsR+f9FaRV3aFKxeR2ofgWzskUS4BzsC1TX//TvQ
9
+ EqZnC5iuJl58nF8LxYsqY4VFyW4eimT9H+PGgmVS4SQ/sz7pDDfeJpFhtRCEZAQl
10
+ 96vgg3Y9yZ4SyNyEhXGZ9HU8Y9paBqxgE0gAKsO1IwaZ1v2BOmFkstlbrkUMS7uo
11
+ nC0Opv7UdMpRcEtgwrzVwpp5xoVs+HJgQfawWM/U7Xz92Sq8jjtaT0tY4G58fPEo
12
+ pVKF3SRIcHCXdT+zKwJVrMYFu+zyfWqixgpehu0yk8zyK9loIslEnI5tiBdQVHr8
13
+ J8S1k0Jv3dfFKIuPwiwPAnbZ+BF4XQDXF5xXSrYKUabVeXvKa+BZ4n4KS64zyzm0
14
+ /o9ijQsHh9AnjD+gQvGlNk8hV/c8WhtgykEN4z41FiPFgtDBR1CKujUmjxrRlSwf
15
+ ke4bAgMBAAGgUTBPBgkqhkiG9w0BCQ4xQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
16
+ VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRWPtrSmqowoXB1WoUV/i+L9Yb/YTANBgkq
17
+ hkiG9w0BAQsFAAOCAgEAc/d0rJdWuT22M49l1c6Xk+jfj/AkQ4fDtXX2A7LxCkXv
18
+ RKTZXrltcCXs57j+RmjSB+IsuAA3tNNsJ3XMWUAgbQTkn+zyA6qc4X7+BSOjJmm7
19
+ cslFdu+j6LTMqzUXkujTsAML/pEK5csOVD5q5Bvd862egjYpW5BQYmNuyVZ2oEYA
20
+ B3hyGa7rJSYeiORmPOeXGj+plRBLYJ77I8lDuxeA03VawQb0Juf16ZxloN+q/u7E
21
+ Cc3753lo2J9WLosJx3vjMW+l37RaThplz2kbEjygEV6qzoso+S9MJgBS1exCMVvp
22
+ aeSEAYwEK6ja4+7zpI0+k9kub9ZkXqaddq266JZ57ULhCIRlaQNlPwSPKIOGg3PC
23
+ zfiuFvNPeWQmZZbw3L2uS0ODNdCP0wBbwb5GBTxKyX3/hRFIe9HJEK3D7gcExgUI
24
+ t4Dh/wE9eQfIv9A3ZMFaPdRG7qAKq0Cv/zVDPECWNwB38P7uiA3c/ZyzkVc0MIVK
25
+ r+8vs3GYhPZhkQCYh2gncaEcckeAKEoPDhigaHmuoUU7rWjWtdUL5+TVpb1MIc8M
26
+ bIAVvB/8QB0EZMPg9RbGLGDMx/plfvhDiwtIk5lpZcOLrg+7xSt/TTJZCrjMJn5b
27
+ Qo3dML6nxaYoHrxn/RIu7+8Nvx56wU9rHdTG2zzj8kMMIwBId6xzHMx02BGwJaE=
28
+ -----END CERTIFICATE REQUEST-----
@@ -159,4 +159,30 @@ describe HexaPDF::Task::Optimize do
159
159
  assert_equal("10 10 m\nq\nQ\nBI\n/Name 5 ID\ndataEI\n", page.contents)
160
160
  end
161
161
  end
162
+
163
+ describe "prune_page_resources" do
164
+ it "removes all unused XObject references" do
165
+ [false, true].each do |compress_pages|
166
+ page1 = @doc.pages.add
167
+ page1.resources[:XObject] = {}
168
+ page1.resources[:XObject][:test] = @doc.add({})
169
+ page1.resources[:XObject][:used_on_page2] = @doc.add({})
170
+ page1.resources[:XObject][:unused] = @doc.add({})
171
+ page1.contents = "/test Do"
172
+ page2 = @doc.pages.add
173
+ page2.resources[:XObject] = {}
174
+ page2.resources[:XObject][:used_on2] = page1.resources[:XObject][:used_on_page2]
175
+ page2.resources[:XObject][:also_unused] = page1.resources[:XObject][:unused]
176
+ page2.contents = "/used_on2 Do"
177
+
178
+ @doc.task(:optimize, prune_page_resources: true, compress_pages: compress_pages)
179
+
180
+ assert(page1.resources[:XObject].key?(:test))
181
+ assert(page1.resources[:XObject].key?(:used_on_page2))
182
+ refute(page1.resources[:XObject].key?(:unused))
183
+ assert(page2.resources[:XObject].key?(:used_on2))
184
+ refute(page2.resources[:XObject].key?(:also_unused))
185
+ end
186
+ end
187
+ end
162
188
  end
@@ -173,6 +173,7 @@ describe HexaPDF::DictionaryFields do
173
173
 
174
174
  it "allows conversion to a Time object from a binary string" do
175
175
  refute(@field.convert('test'.b, self))
176
+ refute(@field.convert('D:01211016165909+00\'64'.b, self))
176
177
 
177
178
  [
178
179
  ["D:1998", [1998, 01, 01, 00, 00, 00, "-00:00"]],
@@ -40,7 +40,7 @@ describe HexaPDF::Writer do
40
40
  219
41
41
  %%EOF
42
42
  3 0 obj
43
- <</Producer(HexaPDF version 0.18.0)>>
43
+ <</Producer(HexaPDF version 0.19.0)>>
44
44
  endobj
45
45
  xref
46
46
  3 1
@@ -72,7 +72,7 @@ describe HexaPDF::Writer do
72
72
  141
73
73
  %%EOF
74
74
  6 0 obj
75
- <</Producer(HexaPDF version 0.18.0)>>
75
+ <</Producer(HexaPDF version 0.19.0)>>
76
76
  endobj
77
77
  2 0 obj
78
78
  <</Length 10>>stream
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hexapdf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.0
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Leitner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-04 00:00:00.000000000 Z
11
+ date: 2021-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cmdparse
@@ -434,6 +434,36 @@ files:
434
434
  - test/data/aes-test-vectors/CBCVarTxt-192-encrypt.data.gz
435
435
  - test/data/aes-test-vectors/CBCVarTxt-256-decrypt.data.gz
436
436
  - test/data/aes-test-vectors/CBCVarTxt-256-encrypt.data.gz
437
+ - test/data/cert/create.sh
438
+ - test/data/cert/root-ca/certs/84E66B6F4C359E741C0AFA014790DF39.pem
439
+ - test/data/cert/root-ca/certs/84E66B6F4C359E741C0AFA014790DF3A.pem
440
+ - test/data/cert/root-ca/db/crlnumber
441
+ - test/data/cert/root-ca/db/index
442
+ - test/data/cert/root-ca/db/index.attr
443
+ - test/data/cert/root-ca/db/index.attr.old
444
+ - test/data/cert/root-ca/db/index.old
445
+ - test/data/cert/root-ca/db/serial
446
+ - test/data/cert/root-ca/db/serial.old
447
+ - test/data/cert/root-ca/private/root-ca.key
448
+ - test/data/cert/root-ca/root-ca.conf
449
+ - test/data/cert/root-ca/root-ca.crt
450
+ - test/data/cert/root-ca/root-ca.csr
451
+ - test/data/cert/signature-1-pkcs7-detached.pdf
452
+ - test/data/cert/sub-ca/certs/453FF080E3EDCD6A388D5368DFC320D9.pem
453
+ - test/data/cert/sub-ca/db/crlnumber
454
+ - test/data/cert/sub-ca/db/index
455
+ - test/data/cert/sub-ca/db/index.attr
456
+ - test/data/cert/sub-ca/db/index.old
457
+ - test/data/cert/sub-ca/db/serial
458
+ - test/data/cert/sub-ca/db/serial.old
459
+ - test/data/cert/sub-ca/private/signing.key
460
+ - test/data/cert/sub-ca/private/sub-ca.key
461
+ - test/data/cert/sub-ca/signing.crt
462
+ - test/data/cert/sub-ca/signing.csr
463
+ - test/data/cert/sub-ca/signing.p12
464
+ - test/data/cert/sub-ca/sub-ca.conf
465
+ - test/data/cert/sub-ca/sub-ca.crt
466
+ - test/data/cert/sub-ca/sub-ca.csr
437
467
  - test/data/fonts/Ubuntu-Title.ttf
438
468
  - test/data/images/cmyk.jpg
439
469
  - test/data/images/fillbytes.jpg