itext-jruby 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ itext-jruby
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ jruby-1.7.4
data/Gemfile CHANGED
@@ -7,4 +7,5 @@ group :development do
7
7
  gem "rdoc"
8
8
  gem "bundler"
9
9
  gem "jeweler"
10
+ gem "pry"
10
11
  end
data/Gemfile.lock CHANGED
@@ -8,10 +8,13 @@ GEM
8
8
  thread_safe (~> 0.1)
9
9
  tzinfo (~> 0.3.37)
10
10
  addressable (2.3.5)
11
+ atomic (1.1.13)
11
12
  atomic (1.1.13-java)
12
13
  builder (3.2.2)
14
+ coderay (1.0.9)
13
15
  faraday (0.8.8)
14
16
  multipart-post (~> 1.2.0)
17
+ ffi (1.9.0-java)
15
18
  git (1.2.6)
16
19
  github_api (0.10.1)
17
20
  addressable
@@ -33,13 +36,16 @@ GEM
33
36
  nokogiri (= 1.5.10)
34
37
  rake
35
38
  rdoc
39
+ json (1.8.0)
36
40
  json (1.8.0-java)
37
41
  jwt (0.1.8)
38
42
  multi_json (>= 1.5)
43
+ method_source (0.8.2)
39
44
  minitest (4.7.5)
40
45
  multi_json (1.7.9)
41
46
  multi_xml (0.5.5)
42
47
  multipart-post (1.2.0)
48
+ nokogiri (1.5.10)
43
49
  nokogiri (1.5.10-java)
44
50
  oauth2 (0.9.2)
45
51
  faraday (~> 0.8)
@@ -48,6 +54,11 @@ GEM
48
54
  multi_json (~> 1.0)
49
55
  multi_xml (~> 0.5)
50
56
  rack (~> 1.2)
57
+ pry (0.9.12.2-java)
58
+ coderay (~> 1.0.5)
59
+ method_source (~> 0.8)
60
+ slop (~> 3.4)
61
+ spoon (~> 0.0)
51
62
  rack (1.5.2)
52
63
  rake (10.1.0)
53
64
  rdoc (4.0.1)
@@ -58,6 +69,11 @@ GEM
58
69
  shoulda-context (1.1.5)
59
70
  shoulda-matchers (2.3.0)
60
71
  activesupport (>= 3.0.0)
72
+ slop (3.4.6)
73
+ spoon (0.0.4)
74
+ ffi
75
+ thread_safe (0.1.2)
76
+ atomic
61
77
  thread_safe (0.1.2-java)
62
78
  atomic
63
79
  tzinfo (0.3.37)
@@ -68,5 +84,6 @@ PLATFORMS
68
84
  DEPENDENCIES
69
85
  bundler
70
86
  jeweler
87
+ pry
71
88
  rdoc
72
89
  shoulda
data/README.rdoc CHANGED
@@ -5,21 +5,34 @@ IText Pdf generation static java build packed to gem with some additional Ruby m
5
5
  == Usage
6
6
 
7
7
  === Instalation
8
- require 'itext-jruby'
8
+
9
+ gem install itext-jruby
9
10
 
10
11
  == Example
12
+
13
+ require 'itext-jruby'
11
14
 
12
- @source_pdf = File.expand_path('pdf_demo.pdf')
13
- @sample_image = File.expand_path('ja.jpg')
14
- @output_pdf = File.expand_path('out.pdf')
15
+ @source_pdf = File.expand_path('test/assets/sample.pdf')
16
+ @sample_image = File.expand_path('test/assets/pug.jpg')
17
+ @output_pdf = File.expand_path('output.pdf')
18
+ @cert_file = File.expand_path('test/assets/cert/ia.p12')
15
19
 
16
- @pdf_document = Itext.new(path: @path)
17
- @pdf_document.add_attachment @pathb
18
- @pdf_document.save(@out)
20
+ @pdf_document = Itext.new(path: @source_pdf)
21
+ @pdf_document.add_attachment @sample_image
22
+ @pdf_document.enable_signing!(private_key_path: @cert_file)
23
+ @pdf_document.save(@output_pdf)
19
24
 
20
25
  Find more examples in test directory.
21
26
 
22
27
 
28
+ == Changelog
29
+ * 0.0.6 - First stable version allowing adding attachments to PdfFile
30
+ * 0.0.7 - Add option to sign documents usign pkcs12 certificates
31
+
32
+ == Read more
33
+ * Creating pkcs12 certs: http://www.flatmtn.com/article/creating-pkcs12-certificates
34
+ * Converting .pem to .pcks: http://www.advogato.org/person/johnnyb/diary.html?start=143
35
+
23
36
  == Contributing to itext-jruby
24
37
 
25
38
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.6
1
+ 0.0.7
data/itext-jruby.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "itext-jruby"
8
- s.version = "0.0.6"
8
+ s.version = "0.0.7"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ernest Bursa"]
12
- s.date = "2013-09-05"
12
+ s.date = "2013-10-09"
13
13
  s.description = "IText"
14
14
  s.email = "ernest@bzdury.pl"
15
15
  s.extra_rdoc_files = [
@@ -18,6 +18,8 @@ Gem::Specification.new do |s|
18
18
  ]
19
19
  s.files = [
20
20
  ".document",
21
+ ".ruby-gemset",
22
+ ".ruby-version",
21
23
  "Gemfile",
22
24
  "Gemfile.lock",
23
25
  "LICENSE.txt",
@@ -28,6 +30,7 @@ Gem::Specification.new do |s|
28
30
  "lib/itext-jruby.rb",
29
31
  "lib/itext.rb",
30
32
  "lib/itext/attachments.rb",
33
+ "lib/itext/signing.rb",
31
34
  "libexec/jar/bcmail-jdk14-138.jar",
32
35
  "libexec/jar/bcprov-jdk14-138.jar",
33
36
  "libexec/jar/bctsp-jdk14-138.jar",
@@ -44,6 +47,14 @@ Gem::Specification.new do |s|
44
47
  "libexec/jar/junit-4.4.jar",
45
48
  "libexec/jar/pdf-renderer.jar",
46
49
  "libexec/jar/servlet.jar",
50
+ "test/assets/cert/ca.crt",
51
+ "test/assets/cert/ca.key",
52
+ "test/assets/cert/ia.crt",
53
+ "test/assets/cert/ia.csr",
54
+ "test/assets/cert/ia.key",
55
+ "test/assets/cert/ia.p12",
56
+ "test/assets/pug.jpg",
57
+ "test/assets/sample.pdf",
47
58
  "test/helper.rb",
48
59
  "test/test_itext-jruby.rb"
49
60
  ]
@@ -61,17 +72,20 @@ Gem::Specification.new do |s|
61
72
  s.add_development_dependency(%q<rdoc>, [">= 0"])
62
73
  s.add_development_dependency(%q<bundler>, [">= 0"])
63
74
  s.add_development_dependency(%q<jeweler>, [">= 0"])
75
+ s.add_development_dependency(%q<pry>, [">= 0"])
64
76
  else
65
77
  s.add_dependency(%q<shoulda>, [">= 0"])
66
78
  s.add_dependency(%q<rdoc>, [">= 0"])
67
79
  s.add_dependency(%q<bundler>, [">= 0"])
68
80
  s.add_dependency(%q<jeweler>, [">= 0"])
81
+ s.add_dependency(%q<pry>, [">= 0"])
69
82
  end
70
83
  else
71
84
  s.add_dependency(%q<shoulda>, [">= 0"])
72
85
  s.add_dependency(%q<rdoc>, [">= 0"])
73
86
  s.add_dependency(%q<bundler>, [">= 0"])
74
87
  s.add_dependency(%q<jeweler>, [">= 0"])
88
+ s.add_dependency(%q<pry>, [">= 0"])
75
89
  end
76
90
  end
77
91
 
data/lib/itext.rb CHANGED
@@ -1,10 +1,13 @@
1
1
  # encoding: utf-8
2
2
  require 'pathname'
3
+ require 'tempfile'
3
4
 
4
5
  class Itext
5
6
  require 'itext/attachments'
7
+ require 'itext/signing'
6
8
 
7
9
  include Attachments
10
+ include Signing
8
11
 
9
12
  # Create new Itext document instance
10
13
  # Required params:
@@ -19,7 +22,10 @@ class Itext
19
22
  raise ArgumentError.new('Please provide absolute path') unless Pathname.new(@path).absolute?
20
23
  end
21
24
 
22
- def save(save_to = nil)
25
+ # Saves file to given destination
26
+ # Usage: save(path, options = {})
27
+ # Allowed options: { sign_document: true }
28
+ def save(save_to = nil, opts = {})
23
29
  save_to ||= @path
24
30
 
25
31
  output_file = if File.exists?(@path)
@@ -30,7 +36,7 @@ class Itext
30
36
 
31
37
  @reader = Java::ComLowagieTextPdf::PdfReader.new(@path.to_java(:string))
32
38
  @buffer = Java::JavaIo::FileOutputStream.new output_file.path
33
- @stamper = Java::ComLowagieTextPdf::PdfStamper.new @reader, @buffer
39
+ @stamper = initialize_stamper
34
40
 
35
41
  # Run all attached hooks
36
42
  @hooks.each { |hook| hook.call }
@@ -48,6 +54,17 @@ class Itext
48
54
 
49
55
  protected
50
56
 
57
+ # Creates default stamper
58
+ def initialize_stamper
59
+ stamper = super rescue nil
60
+ if stamper
61
+ stamper
62
+ else
63
+ # Initialize default stamper
64
+ Java::ComLowagieTextPdf::PdfStamper.new @reader, @buffer
65
+ end
66
+ end
67
+
51
68
  def hooks
52
69
  @hooks || []
53
70
  end
@@ -4,6 +4,8 @@ module Itext::Attachments
4
4
  def initialize(*args, &block)
5
5
  @hooks ||= []
6
6
  @hooks.push ->{ process_attachments }
7
+
8
+ super rescue nil
7
9
  end
8
10
 
9
11
  def self.included(base)
@@ -44,23 +46,25 @@ module Itext::Attachments
44
46
  def process_attachments
45
47
  @writer = @stamper.getWriter.to_java(Java::ComLowagieTextPdf::PdfWriter)
46
48
 
47
- @attachments.each do |attachment|
48
- if attachment.is_a?(Hash)
49
- attachment_path = attachment[:path]
50
- attachment_name = attachment[:file_name]
51
- elsif attachment.is_a?(String)
52
- attachment_path = attachment
53
- attachment_name = Pathname.new(attachment_path).basename
54
- else
55
- raise ArgumentError.new("Specify hash with :path and :file_name or string with path")
56
- end
49
+ if @attachments && @attachments.size > 0
50
+ @attachments.each do |attachment|
51
+ if attachment.is_a?(Hash)
52
+ attachment_path = attachment[:path]
53
+ attachment_name = attachment[:file_name]
54
+ elsif attachment.is_a?(String)
55
+ attachment_path = attachment.to_s
56
+ attachment_name = Pathname.new(attachment_path).basename.to_s
57
+ else
58
+ raise ArgumentError.new("Specify hash with :path and :file_name or string with path")
59
+ end
57
60
 
58
- attachment_spec = Java::ComLowagieTextPdf::PdfFileSpecification.fileEmbedded @writer,
59
- attachment_path.to_s.to_java_string,
60
- attachment_name.to_s.to_java_string,
61
- nil
62
- attachment_spec.addDescription attachment_name, false.to_java(:boolean)
63
- @stamper.addFileAttachment attachment_name, attachment_spec
61
+ attachment_spec = Java::ComLowagieTextPdf::PdfFileSpecification.fileEmbedded @writer,
62
+ attachment_path.to_java_string,
63
+ attachment_name.to_java_string,
64
+ nil
65
+ attachment_spec.addDescription attachment_name, false.to_java(:boolean)
66
+ @stamper.addFileAttachment attachment_name, attachment_spec
67
+ end
64
68
  end
65
69
 
66
70
  # @writer.close
@@ -0,0 +1,72 @@
1
+ # encoding: utf-8
2
+ # This module will allow you signing PDF document with certificate
3
+ module Itext::Signing
4
+
5
+ require 'java'
6
+ java_import 'java.security.KeyStore'
7
+ java_import 'java.security.KeyStoreException'
8
+ java_import 'java.security.NoSuchAlgorithmException'
9
+ java_import 'java.security.NoSuchProviderException'
10
+ java_import 'java.security.PrivateKey'
11
+ java_import 'java.security.UnrecoverableKeyException'
12
+ java_import 'java.security.cert.Certificate'
13
+ java_import 'java.security.cert.CertificateException'
14
+
15
+ # Add processing hook
16
+ def initialize(*args, &block)
17
+ @hooks ||= []
18
+ @hooks.push ->{ process_signing }
19
+
20
+ super rescue nil
21
+ end
22
+
23
+ # Hook with some initalization
24
+ def self.included(base)
25
+ base.extend(ClassMethods)
26
+
27
+ attr_reader :private_key_path
28
+ attr_reader :password
29
+ end
30
+
31
+ # Enable document signing
32
+ # Required options: { private_key_path: '/path/key' }
33
+ # Optional options: { password: '' }
34
+ def enable_signing!(opts = {})
35
+ raise ArgumentError, "Please provide :private_key_path" unless opts[:private_key_path]
36
+
37
+ @private_key_path = opts[:private_key_path]
38
+ @password = opts[:password].to_s.to_java.toCharArray
39
+
40
+ @keystore = Java::JavaSecurity::KeyStore.getInstance('pkcs12')
41
+ @keystore.load(Java::JavaIo::FileInputStream.new(@private_key_path), @password)
42
+
43
+ keystore_alias = @keystore.aliases().nextElement()
44
+ @private_key = @keystore.getKey(keystore_alias, @password).to_java(Java::JavaSecurity::PrivateKey)
45
+ @cert_chain = @keystore.getCertificateChain(keystore_alias)
46
+ end
47
+
48
+ # Check if signing file should be done
49
+ def sign_file?
50
+ @private_key_path && File.exists?(@private_key_path)
51
+ end
52
+
53
+ # Change default behavior of stamper if using signing
54
+ def initialize_stamper
55
+ Java::ComLowagieTextPdf::PdfStamper.createSignature(@reader, @buffer, 0x00.to_java(Java::JavaLang::Character)) if sign_file?
56
+ end
57
+
58
+ # Process signing using IText
59
+ def process_signing
60
+ if sign_file?
61
+ @appearance = @stamper.getSignatureAppearance().to_java(Java::ComLowagieTextPdf::PdfSignatureAppearance)
62
+ @appearance.setCrypto(@private_key, @cert_chain, nil, Java::ComLowagieTextPdf::PdfSignatureAppearance::WINCER_SIGNED)
63
+ end
64
+ end
65
+
66
+ protected :process_signing
67
+
68
+ module ClassMethods
69
+
70
+ end
71
+
72
+ end
@@ -0,0 +1,37 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
37
+ -----END CERTIFICATE-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,32 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
32
+ -----END CERTIFICATE-----
@@ -0,0 +1,29 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIIE7TCCAtUCAQAwgY8xCzAJBgNVBAYTAkFVMRUwEwYDVQQIEwxXaWVsa29wb2xz
3
+ a2ExDzANBgNVBAcTBlBvem5hbjEZMBcGA1UEChMQU2Vjb25kIEJ1cnNhIExURDEL
4
+ MAkGA1UECxMCSVQxDzANBgNVBAMTBkVybmVzdDEfMB0GCSqGSIb3DQEJARYQZXJu
5
+ ZXN0QGJ6ZHVyeS5wbDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALqn
6
+ 2Fhg91LnBDs1wGnpMOVPV1+tGL0esun+2g4LJqpBiLH5iLPhuvsWq79J2QpCEBDA
7
+ 3qJRehFZnPBz5XWq44YyP0UFz2US1oj8QLkMob4OEMR6q0k4Iv+o97b4JdBeKyB9
8
+ MOgUHe6miMdQ2spQg47XLPhYVG5b/sOkA1gIbRhTQFFPZEMIPp1YScK7P3drCouV
9
+ ExIDAkUxpJYfVKNp9lT/U8Zjh0wz6hCtUp0KMkZWiZrBqs5XD5HXQWk1BqI68UqA
10
+ d75V8ZOO/GVkst/jyVKhkVXsfVsp2X+YUxmRk4a61h/wkaaNYJvNtJqBKsUy51+P
11
+ qiLHTp3njetfpCB2ip0xD6iQf95VTS0cCT+Q+IY0MQohWmftrH1u5z9Dnbly0JD7
12
+ Lm1lNveVZ5J+zPP4D0uNycPZLF+j0+v0CQOJYhzFvDzKJB5NfXyvObuw0yK7Ng0u
13
+ ngGqxAgnj4lEQd1DAdvlODsRI+ocVOeP4JoNFfiebIFXIZluTokWJO/is5OyItMF
14
+ fPC7jJTwxYGq8p1BOvrONykHyFxmdKtY+mFDb4nBXgGxpoWWjPhTzQDlmRP0oCe4
15
+ G+KQzC8J03WwkFSr3ApLJL1DvoBNkRxQjxE/NXNcKodD99/h8X3sAZH4v9MQzG4X
16
+ NIz9O9OTP5mGkuUCKNhQYIMTPlrw7XKhrBONCyKFAgMBAAGgGDAWBgkqhkiG9w0B
17
+ CQcxCRMHdGVzdDEyMzANBgkqhkiG9w0BAQUFAAOCAgEAh7uRJjl96LFfbNCfAkSr
18
+ 41jh0c0L+XtXOTCB9VmmCY3zlu5Z/RZTXpiUJD5C4YGu1NfjFaBC/wYvRA05u537
19
+ 5Qdt/Vvu7l121vTIO+lRBYU+L+LRdCGziSfEulXJ5hPIlR4pJgTU2D+zqCIXyMza
20
+ w0C/AEhnWuakHm4ZxOjXJ4n4U07kbtcAtZgxGaypPq6nZh0sGQ5yxJ3+zdv6aakm
21
+ AlB8n4edD42mbo1LRQNqMYTMSZQjP2OQunPT0k8Tj5n5hqiXC8RW4g+PXPUfqrzi
22
+ O9x7JPrg2TpNMGBYoTGFbYAbYvUzCHlpliM9AbDtNiw+iaoAsRmB0w5U0hYyHxkx
23
+ 5pi03l8FERBVuj1S9nM/OuegBDGgT15ceXcPyfPCWLXAtn3tTsYcKX0nP1HUv0by
24
+ 0x7nC3yVe/llXs+C7obqW/lc5W6JKDEHGA+CPOt0ckphPjA/BfY/dvZVxHP/4L5d
25
+ y3oBIxGROWTvUD5QDX9PDg6GFVM8/oWa7w/IA0XjPc30I3lV1fS59MpdS4oDK2KF
26
+ z6C89MuRXQB6nRrsLLZsmdiUnS1WijZjD52GQ9k1u0Srvwzz6X7eEkhNJ1/zDUvJ
27
+ bQptpRVlfV4xgdpT569apCDpgZgfkSEnCTK8s7s1xb/EExaQnfMxyLRVAekBPBDq
28
+ lCx2NF68dKr6PQhoxRoPRKU=
29
+ -----END CERTIFICATE REQUEST-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
Binary file
Binary file
Binary file
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: itext-jruby
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.6
5
+ version: 0.0.7
6
6
  platform: ruby
7
7
  authors:
8
8
  - Ernest Bursa
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-05 00:00:00.000000000 Z
12
+ date: 2013-10-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: shoulda
@@ -75,6 +75,22 @@ dependencies:
75
75
  none: false
76
76
  prerelease: false
77
77
  type: :development
78
+ - !ruby/object:Gem::Dependency
79
+ name: pry
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ none: false
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ none: false
92
+ prerelease: false
93
+ type: :development
78
94
  description: IText
79
95
  email: ernest@bzdury.pl
80
96
  executables: []
@@ -84,6 +100,8 @@ extra_rdoc_files:
84
100
  - README.rdoc
85
101
  files:
86
102
  - .document
103
+ - .ruby-gemset
104
+ - .ruby-version
87
105
  - Gemfile
88
106
  - Gemfile.lock
89
107
  - LICENSE.txt
@@ -94,6 +112,7 @@ files:
94
112
  - lib/itext-jruby.rb
95
113
  - lib/itext.rb
96
114
  - lib/itext/attachments.rb
115
+ - lib/itext/signing.rb
97
116
  - libexec/jar/bcmail-jdk14-138.jar
98
117
  - libexec/jar/bcprov-jdk14-138.jar
99
118
  - libexec/jar/bctsp-jdk14-138.jar
@@ -110,6 +129,14 @@ files:
110
129
  - libexec/jar/junit-4.4.jar
111
130
  - libexec/jar/pdf-renderer.jar
112
131
  - libexec/jar/servlet.jar
132
+ - test/assets/cert/ca.crt
133
+ - test/assets/cert/ca.key
134
+ - test/assets/cert/ia.crt
135
+ - test/assets/cert/ia.csr
136
+ - test/assets/cert/ia.key
137
+ - test/assets/cert/ia.p12
138
+ - test/assets/pug.jpg
139
+ - test/assets/sample.pdf
113
140
  - test/helper.rb
114
141
  - test/test_itext-jruby.rb
115
142
  homepage: http://github.com/swistaczek/itext-jruby