hexapdf 0.18.0 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
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