pdf-forms 1.0.0 → 1.1.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.
- checksums.yaml +4 -4
 - data/README.md +12 -2
 - data/lib/pdf_forms/field.rb +28 -18
 - data/lib/pdf_forms/normalize_path.rb +1 -2
 - data/lib/pdf_forms/pdftk_wrapper.rb +29 -10
 - data/lib/pdf_forms/version.rb +1 -1
 - data/lib/pdf_forms/xfdf.rb +2 -1
 - metadata +5 -6
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: f82a5f40a898d0b44980998389d2d65fccdf609c
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 785b8dddce02826364296a277d070e9a9e513ba6
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 7d88e13704cb3190b22b64cf1b0cde1f94ab16b52e7ca6f95719f95a545a2859ede57509a8a0f93318ff4bd83994f97cb3ce537a327f34e9312725ca373b8643
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 273c23ad22d6321829f45c2e0a1b2a568ea8faecbaf95359569b1b9011b14e6d082809052731ca9cf0adfc22439edc3a661973ca8575e91a71a9e7ac7e2774d6
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -11,7 +11,6 @@ Fill out PDF forms with [pdftk](http://www.pdflabs.com/tools/pdftk-server/). 
     | 
|
| 
       11 
11 
     | 
    
         
             
            You'll need a working `pdftk` binary. Either get a binary package from
         
     | 
| 
       12 
12 
     | 
    
         
             
            http://www.pdflabs.com/tools/pdftk-server/ and install it, or run
         
     | 
| 
       13 
13 
     | 
    
         
             
            `apt-get install pdftk` if you're on Debian or similar.
         
     | 
| 
       14 
     | 
    
         
            -
            [Homebrew Cask](http://caskroom.io) also has a pftk formula.
         
     | 
| 
       15 
14 
     | 
    
         | 
| 
       16 
15 
     | 
    
         
             
            After that, add `pdf-forms` to your Gemfile or manually install the gem. Nothing
         
     | 
| 
       17 
16 
     | 
    
         
             
            unusual here.
         
     | 
| 
         @@ -54,13 +53,24 @@ pdftk.fill_form '/path/to/form.pdf', 'myform.pdf', :foo => 'bar' 
     | 
|
| 
       54 
53 
     | 
    
         | 
| 
       55 
54 
     | 
    
         
             
            # optionally, add the :flatten option to prevent editing of a filled out form
         
     | 
| 
       56 
55 
     | 
    
         
             
            pdftk.fill_form '/path/to/form.pdf', 'myform.pdf', {:foo => 'bar'}, :flatten => true
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
            # to enable PDF encryption, pass encrypt: true. By default, a random 'owner
         
     | 
| 
      
 58 
     | 
    
         
            +
            # password' will be used, but you can also set one with the :encrypt_pw option.
         
     | 
| 
      
 59 
     | 
    
         
            +
            pdftk.fill_form '/path/to/form.pdf', 'myform.pdf', {foo: 'bar'}, encrypt: true, encrypt_options: 'allow printing'
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
            # you can also protect the PDF even from opening by specifying an additional user_pw option:
         
     | 
| 
      
 62 
     | 
    
         
            +
            pdftk.fill_form '/path/to/form.pdf', 'myform.pdf', {foo: 'bar'}, encrypt: true, encrypt_options: 'user_pw secret'
         
     | 
| 
       57 
63 
     | 
    
         
             
            ```
         
     | 
| 
       58 
64 
     | 
    
         | 
| 
      
 65 
     | 
    
         
            +
            Any options shown above can also be set when initializing the PdfForms
         
     | 
| 
      
 66 
     | 
    
         
            +
            instance. In this case, options given to `fill_form` will override the global
         
     | 
| 
      
 67 
     | 
    
         
            +
            options.
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
       59 
69 
     | 
    
         
             
            ### Prior Art
         
     | 
| 
       60 
70 
     | 
    
         | 
| 
       61 
71 
     | 
    
         
             
            The FDF generation part is a straight port of Steffen Schwigon's PDF::FDF::Simple perl module. Didn't port the FDF parsing, though ;-)
         
     | 
| 
       62 
72 
     | 
    
         | 
| 
       63 
73 
     | 
    
         
             
            ## License
         
     | 
| 
       64 
74 
     | 
    
         | 
| 
       65 
     | 
    
         
            -
            Created by [Jens Kraemer](http://jkraemer.net/) and licensed under the MIT  
     | 
| 
      
 75 
     | 
    
         
            +
            Created by [Jens Kraemer](http://jkraemer.net/) and licensed under the MIT License.
         
     | 
| 
       66 
76 
     | 
    
         | 
    
        data/lib/pdf_forms/field.rb
    CHANGED
    
    | 
         @@ -9,35 +9,45 @@ module PdfForms 
     | 
|
| 
       9 
9 
     | 
    
         
             
                # FieldStateOption: Ja
         
     | 
| 
       10 
10 
     | 
    
         
             
                # FieldStateOption: Off
         
     | 
| 
       11 
11 
     | 
    
         
             
                #
         
     | 
| 
       12 
     | 
    
         
            -
                #  
     | 
| 
      
 12 
     | 
    
         
            +
                # Representation of a PDF Form Field
         
     | 
| 
       13 
13 
     | 
    
         
             
                def initialize(field_description)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  last_value = nil
         
     | 
| 
       14 
15 
     | 
    
         
             
                  field_description.each_line do |line|
         
     | 
| 
       15 
     | 
    
         
            -
                     
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                      key 
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                      
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                         
     | 
| 
      
 16 
     | 
    
         
            +
                    line.chomp!
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                    if line =~ /^Field([A-Za-z]+):\s+(.*)/
         
     | 
| 
      
 19 
     | 
    
         
            +
                      _, key, value = *$~
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                      if key == 'StateOption'
         
     | 
| 
      
 22 
     | 
    
         
            +
                        (@options ||= []) << value
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                      else
         
     | 
| 
      
 25 
     | 
    
         
            +
                        value.chomp!
         
     | 
| 
      
 26 
     | 
    
         
            +
                        last_value = value
         
     | 
| 
      
 27 
     | 
    
         
            +
                        key = key.split(/(?=[A-Z])/).map(&:downcase).join('_')
         
     | 
| 
      
 28 
     | 
    
         
            +
                        instance_variable_set("@#{key}", value)
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                        # dynamically add in fields that we didn't anticipate in ATTRS
         
     | 
| 
      
 31 
     | 
    
         
            +
                        unless self.respond_to?(key.to_sym)
         
     | 
| 
      
 32 
     | 
    
         
            +
                          proc = Proc.new { instance_variable_get("@#{key}".to_sym) }
         
     | 
| 
      
 33 
     | 
    
         
            +
                          self.class.send(:define_method, key.to_sym, proc)
         
     | 
| 
      
 34 
     | 
    
         
            +
                        end
         
     | 
| 
       30 
35 
     | 
    
         
             
                      end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                    else
         
     | 
| 
      
 38 
     | 
    
         
            +
                      # pdftk returns a line that doesn't start with "Field"
         
     | 
| 
      
 39 
     | 
    
         
            +
                      # It happens when a text field has multiple lines
         
     | 
| 
      
 40 
     | 
    
         
            +
                      last_value << "\n" << line
         
     | 
| 
       31 
41 
     | 
    
         
             
                    end
         
     | 
| 
       32 
42 
     | 
    
         
             
                  end
         
     | 
| 
       33 
43 
     | 
    
         
             
                end
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
       35 
45 
     | 
    
         
             
                def to_hash
         
     | 
| 
       36 
46 
     | 
    
         
             
                  hash = {}
         
     | 
| 
       37 
47 
     | 
    
         
             
                  ATTRS.each do |attribute|
         
     | 
| 
       38 
48 
     | 
    
         
             
                    hash[attribute] = self.send(attribute)
         
     | 
| 
       39 
49 
     | 
    
         
             
                  end
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
       41 
51 
     | 
    
         
             
                  hash
         
     | 
| 
       42 
52 
     | 
    
         
             
                end
         
     | 
| 
       43 
53 
     | 
    
         | 
| 
         @@ -3,6 +3,7 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            require 'tempfile'
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'cliver'
         
     | 
| 
       5 
5 
     | 
    
         
             
            require 'safe_shell'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'securerandom'
         
     | 
| 
       6 
7 
     | 
    
         | 
| 
       7 
8 
     | 
    
         
             
            module PdfForms
         
     | 
| 
       8 
9 
     | 
    
         
             
              class PdftkError < StandardError
         
     | 
| 
         @@ -40,8 +41,7 @@ module PdfForms 
     | 
|
| 
       40 
41 
     | 
    
         
             
                  fill_options = {:tmp_path => tmp.path}.merge(fill_options)
         
     | 
| 
       41 
42 
     | 
    
         | 
| 
       42 
43 
     | 
    
         
             
                  args = [ q_template, 'fill_form', normalize_path(tmp.path), 'output', q_destination ]
         
     | 
| 
       43 
     | 
    
         
            -
                  append_options 
     | 
| 
       44 
     | 
    
         
            -
                  result = call_pdftk *args
         
     | 
| 
      
 44 
     | 
    
         
            +
                  result = call_pdftk(*(append_options(args, fill_options)))
         
     | 
| 
       45 
45 
     | 
    
         | 
| 
       46 
46 
     | 
    
         
             
                  unless File.readable?(destination) && File.size(destination) > 0
         
     | 
| 
       47 
47 
     | 
    
         
             
                    fdf_path = nil
         
     | 
| 
         @@ -85,13 +85,28 @@ module PdfForms 
     | 
|
| 
       85 
85 
     | 
    
         
             
                  SafeShell.execute pdftk, *(args.flatten)
         
     | 
| 
       86 
86 
     | 
    
         
             
                end
         
     | 
| 
       87 
87 
     | 
    
         | 
| 
       88 
     | 
    
         
            -
                # concatenate documents
         
     | 
| 
      
 88 
     | 
    
         
            +
                # concatenate documents, can optionally specify page ranges
         
     | 
| 
       89 
89 
     | 
    
         
             
                #
         
     | 
| 
       90 
     | 
    
         
            -
                # args: in_file1, in_file2, ... , in_file_n, output
         
     | 
| 
      
 90 
     | 
    
         
            +
                # args: in_file1, {in_file2 => ["1-2", "4-10"]}, ... , in_file_n, output
         
     | 
| 
       91 
91 
     | 
    
         
             
                def cat(*args)
         
     | 
| 
       92 
     | 
    
         
            -
                   
     | 
| 
       93 
     | 
    
         
            -
                   
     | 
| 
       94 
     | 
    
         
            -
                   
     | 
| 
      
 92 
     | 
    
         
            +
                  in_files = []
         
     | 
| 
      
 93 
     | 
    
         
            +
                  page_ranges = []
         
     | 
| 
      
 94 
     | 
    
         
            +
                  file_handle = "A"
         
     | 
| 
      
 95 
     | 
    
         
            +
                  output = normalize_path args.pop
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                  args.flatten.compact.each do |in_file|
         
     | 
| 
      
 98 
     | 
    
         
            +
                    if in_file.is_a? Hash
         
     | 
| 
      
 99 
     | 
    
         
            +
                      path = in_file.keys.first
         
     | 
| 
      
 100 
     | 
    
         
            +
                      page_ranges.push *in_file.values.first.map {|range| "#{file_handle}#{range}"}
         
     | 
| 
      
 101 
     | 
    
         
            +
                    else
         
     | 
| 
      
 102 
     | 
    
         
            +
                      path = in_file
         
     | 
| 
      
 103 
     | 
    
         
            +
                      page_ranges.push "#{file_handle}"
         
     | 
| 
      
 104 
     | 
    
         
            +
                    end
         
     | 
| 
      
 105 
     | 
    
         
            +
                    in_files.push "#{file_handle}=#{normalize_path(path)}"
         
     | 
| 
      
 106 
     | 
    
         
            +
                    file_handle.next!
         
     | 
| 
      
 107 
     | 
    
         
            +
                  end
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
                  call_pdftk in_files, 'cat', page_ranges, 'output', output
         
     | 
| 
       95 
110 
     | 
    
         
             
                end
         
     | 
| 
       96 
111 
     | 
    
         | 
| 
       97 
112 
     | 
    
         
             
                # stamp one pdf with another
         
     | 
| 
         @@ -119,16 +134,20 @@ module PdfForms 
     | 
|
| 
       119 
134 
     | 
    
         
             
                end
         
     | 
| 
       120 
135 
     | 
    
         | 
| 
       121 
136 
     | 
    
         
             
                def append_options(args, local_options = {})
         
     | 
| 
       122 
     | 
    
         
            -
                  return if options.empty? && local_options.empty?
         
     | 
| 
      
 137 
     | 
    
         
            +
                  return args if options.empty? && local_options.empty?
         
     | 
| 
      
 138 
     | 
    
         
            +
                  args = args.dup
         
     | 
| 
       123 
139 
     | 
    
         
             
                  if option_or_global(:flatten, local_options)
         
     | 
| 
       124 
140 
     | 
    
         
             
                    args << 'flatten'
         
     | 
| 
       125 
141 
     | 
    
         
             
                  end
         
     | 
| 
       126 
142 
     | 
    
         
             
                  if option_or_global(:encrypt, local_options)
         
     | 
| 
       127 
143 
     | 
    
         
             
                    encrypt_pass = option_or_global(:encrypt_password, local_options)
         
     | 
| 
       128 
     | 
    
         
            -
                    encrypt_pass ||=  
     | 
| 
      
 144 
     | 
    
         
            +
                    encrypt_pass ||= SecureRandom.urlsafe_base64
         
     | 
| 
       129 
145 
     | 
    
         
             
                    encrypt_options = option_or_global(:encrypt_options, local_options)
         
     | 
| 
       130 
     | 
    
         
            -
                     
     | 
| 
      
 146 
     | 
    
         
            +
                    encrypt_options = encrypt_options.split if String === encrypt_options
         
     | 
| 
      
 147 
     | 
    
         
            +
                    args << ['encrypt_128bit', 'owner_pw', encrypt_pass, encrypt_options]
         
     | 
| 
       131 
148 
     | 
    
         
             
                  end
         
     | 
| 
      
 149 
     | 
    
         
            +
                  args.flatten!
         
     | 
| 
      
 150 
     | 
    
         
            +
                  args.compact!
         
     | 
| 
       132 
151 
     | 
    
         
             
                  args
         
     | 
| 
       133 
152 
     | 
    
         
             
                end
         
     | 
| 
       134 
153 
     | 
    
         | 
    
        data/lib/pdf_forms/version.rb
    CHANGED
    
    
    
        data/lib/pdf_forms/xfdf.rb
    CHANGED
    
    | 
         @@ -1,5 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # coding: UTF-8
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            require 'rexml/document'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
       3 
5 
     | 
    
         
             
            module PdfForms
         
     | 
| 
       4 
6 
     | 
    
         
             
              # Map keys and values to Adobe's XFDF format.
         
     | 
| 
       5 
7 
     | 
    
         
             
              class XFdf < DataFormat
         
     | 
| 
         @@ -14,7 +16,6 @@ module PdfForms 
     | 
|
| 
       14 
16 
     | 
    
         
             
                end
         
     | 
| 
       15 
17 
     | 
    
         | 
| 
       16 
18 
     | 
    
         
             
                def quote(value)
         
     | 
| 
       17 
     | 
    
         
            -
                  require 'rexml/document'
         
     | 
| 
       18 
19 
     | 
    
         
             
                  REXML::Text.new(value.to_s).to_s
         
     | 
| 
       19 
20 
     | 
    
         
             
                end
         
     | 
| 
       20 
21 
     | 
    
         | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: pdf-forms
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.1.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Jens Krämer
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2016-08-29 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: cliver
         
     | 
| 
         @@ -48,14 +48,14 @@ dependencies: 
     | 
|
| 
       48 
48 
     | 
    
         
             
              name: bundler
         
     | 
| 
       49 
49 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       50 
50 
     | 
    
         
             
                requirements:
         
     | 
| 
       51 
     | 
    
         
            -
                - - " 
     | 
| 
      
 51 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
       52 
52 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       53 
53 
     | 
    
         
             
                    version: '1.7'
         
     | 
| 
       54 
54 
     | 
    
         
             
              type: :development
         
     | 
| 
       55 
55 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       56 
56 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       57 
57 
     | 
    
         
             
                requirements:
         
     | 
| 
       58 
     | 
    
         
            -
                - - " 
     | 
| 
      
 58 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
       59 
59 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       60 
60 
     | 
    
         
             
                    version: '1.7'
         
     | 
| 
       61 
61 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
         @@ -112,9 +112,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       112 
112 
     | 
    
         
             
                  version: 1.3.6
         
     | 
| 
       113 
113 
     | 
    
         
             
            requirements: []
         
     | 
| 
       114 
114 
     | 
    
         
             
            rubyforge_project: pdf-forms
         
     | 
| 
       115 
     | 
    
         
            -
            rubygems_version: 2. 
     | 
| 
      
 115 
     | 
    
         
            +
            rubygems_version: 2.5.1
         
     | 
| 
       116 
116 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       117 
117 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       118 
118 
     | 
    
         
             
            summary: Fill out PDF forms with pdftk (http://www.accesspdf.com/pdftk/).
         
     | 
| 
       119 
119 
     | 
    
         
             
            test_files: []
         
     | 
| 
       120 
     | 
    
         
            -
            has_rdoc: 
         
     |