pdf-forms 1.1.1 → 1.4.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 +5 -5
- data/README.md +45 -1
- data/lib/pdf_forms/fdf.rb +8 -4
- data/lib/pdf_forms/fdf_hex.rb +39 -0
- data/lib/pdf_forms/pdftk_wrapper.rb +17 -5
- data/lib/pdf_forms/version.rb +1 -1
- data/lib/pdf_forms.rb +1 -0
- metadata +10 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6f7ed295a6b7127c97a398655de313fcce3950b3ea32b62b31ecafb72993315e
|
4
|
+
data.tar.gz: 432d25045b4cc7383aa2500cc66da6f7ca058be803965be1fab3dd202be1eff8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 439a63e18b1ee43256ca559f6fcd7a34faa9ac2db6ccb807ec91c2378c16bc5db840bb772d6ba59690cd856cb82e98bc814cdade458800dcb6744c3ace4aaaee
|
7
|
+
data.tar.gz: e6e7e593801b25ad4912e8d3eaf647d27f6ca1aad08ca8a170cee702c9d5781a3353f3fcc7af56f9f94c28a8bcb9b98c6320d9452f05e3c5fea17d86bbd51904
|
data/README.md
CHANGED
@@ -15,6 +15,31 @@ http://www.pdflabs.com/tools/pdftk-server/ and install it, or run
|
|
15
15
|
After that, add `pdf-forms` to your Gemfile or manually install the gem. Nothing
|
16
16
|
unusual here.
|
17
17
|
|
18
|
+
### Using the Java port of PDFTK
|
19
|
+
|
20
|
+
The PDFTK package was dropped from most (all?) current versions of major Linux distributions.
|
21
|
+
As contributed in [this issue](https://github.com/jkraemer/pdf-forms/issues/75#issuecomment-698436643), you can use the [Java version of PDFTK](https://gitlab.com/pdftk-java/pdftk)
|
22
|
+
with this gem, as well. Just create a small shell script:
|
23
|
+
|
24
|
+
~~~shell
|
25
|
+
#!/bin/sh
|
26
|
+
MYSELF=`which "$0" 2>/dev/null`
|
27
|
+
[ $? -gt 0 -a -f "$0" ] && MYSELF="./$0"
|
28
|
+
java=java
|
29
|
+
if test -n "$JAVA_HOME"; then
|
30
|
+
java="$JAVA_HOME/bin/java"
|
31
|
+
fi
|
32
|
+
exec "$java" $java_args -jar $MYSELF "$@"
|
33
|
+
exit 1
|
34
|
+
~~~
|
35
|
+
|
36
|
+
Next, concatenate the wrapper script and the Jar file, and you end up with an executable that
|
37
|
+
can be used with pdf-forms:
|
38
|
+
|
39
|
+
~~~
|
40
|
+
cat stub.sh pdftk-all.jar > pdftk.run && chmod +x pdftk.run
|
41
|
+
~~~
|
42
|
+
|
18
43
|
|
19
44
|
## Usage
|
20
45
|
|
@@ -40,6 +65,9 @@ require 'pdf_forms'
|
|
40
65
|
# add :data_format => 'XFdf' option to generate XFDF instead of FDF when
|
41
66
|
# filling a form (XFDF is supposed to have better support for non-western
|
42
67
|
# encodings)
|
68
|
+
# add :data_format => 'FdfHex' option to generate FDF with values passed in
|
69
|
+
# UTF16 hexadecimal format (Hexadecimal format has also proven more reliable
|
70
|
+
# for passing latin accented characters to pdftk)
|
43
71
|
# add :utf8_fields => true in order to get UTF8 encoded field metadata (this
|
44
72
|
# will use dump_data_fields_utf8 instead of dump_data_fields in the call to
|
45
73
|
# pdftk)
|
@@ -51,7 +79,8 @@ pdftk.get_field_names 'path/to/form.pdf'
|
|
51
79
|
# take form.pdf, set the 'foo' field to 'bar' and save the document to myform.pdf
|
52
80
|
pdftk.fill_form '/path/to/form.pdf', 'myform.pdf', :foo => 'bar'
|
53
81
|
|
54
|
-
# optionally, add the :flatten option to prevent editing of a filled out form
|
82
|
+
# optionally, add the :flatten option to prevent editing of a filled out form.
|
83
|
+
# Other supported options are :drop_xfa and :drop_xmp.
|
55
84
|
pdftk.fill_form '/path/to/form.pdf', 'myform.pdf', {:foo => 'bar'}, :flatten => true
|
56
85
|
|
57
86
|
# to enable PDF encryption, pass encrypt: true. By default, a random 'owner
|
@@ -66,6 +95,21 @@ Any options shown above can also be set when initializing the PdfForms
|
|
66
95
|
instance. In this case, options given to `fill_form` will override the global
|
67
96
|
options.
|
68
97
|
|
98
|
+
### Field names with HTML entities
|
99
|
+
|
100
|
+
In case your form's field names contain HTML entities (like
|
101
|
+
`Straße Hausnummer`), make sure you unescape those before using them, i.e.
|
102
|
+
`CGI.unescapeHTML(name)`. Thanks to @phoet for figuring this out in #65.
|
103
|
+
|
104
|
+
### Non-ASCII Characters (UTF8 etc) are not displayed in the filled out PDF
|
105
|
+
|
106
|
+
First, check if the field value has been stored properly in the output PDF using `pdftk output.pdf dump_data_fields_utf8`.
|
107
|
+
|
108
|
+
If it has been stored but is not rendered, your input PDF lacks the proper font for your kind of characters. Re-create it and embed any necessary fonts.
|
109
|
+
If the value has not been stored, there is a problem with filling out the form, either on your side, of with this gem.
|
110
|
+
|
111
|
+
Also see [UTF-8 chars are not displayed in the filled PDF](https://github.com/jkraemer/pdf-forms/issues/53)
|
112
|
+
|
69
113
|
### Prior Art
|
70
114
|
|
71
115
|
The FDF generation part is a straight port of Steffen Schwigon's PDF::FDF::Simple perl module. Didn't port the FDF parsing, though ;-)
|
data/lib/pdf_forms/fdf.rb
CHANGED
@@ -28,6 +28,7 @@ module PdfForms
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
# pp 559 https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf
|
31
32
|
def header
|
32
33
|
header = "%FDF-1.2\n\n1 0 obj\n<<\n/FDF << /Fields 2 0 R"
|
33
34
|
|
@@ -39,13 +40,16 @@ module PdfForms
|
|
39
40
|
header << "/ID[" << options[:id].join << "]" if options[:id]
|
40
41
|
|
41
42
|
header << ">>\n>>\nendobj\n2 0 obj\n["
|
42
|
-
|
43
|
+
header
|
43
44
|
end
|
44
45
|
|
46
|
+
# pp 561 https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf
|
45
47
|
def field(key, value)
|
46
|
-
"
|
47
|
-
|
48
|
-
|
48
|
+
field = "<<"
|
49
|
+
field << "/T" + "(#{key})"
|
50
|
+
field << "/V" + (Array === value ? "[#{value.map{ |v|"(#{quote(v)})" }.join}]" : "(#{quote(value)})")
|
51
|
+
field << ">>\n"
|
52
|
+
field
|
49
53
|
end
|
50
54
|
|
51
55
|
def quote(value)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
|
3
|
+
module PdfForms
|
4
|
+
# Map keys and values to Adobe's FDF format.
|
5
|
+
#
|
6
|
+
# This is a variation of the original Fdf data format, values are encoded in UTF16 hexadesimal
|
7
|
+
# notation to improve compatibility with non ascii charsets.
|
8
|
+
#
|
9
|
+
# Information about hexadesimal FDF values was found here:
|
10
|
+
#
|
11
|
+
# http://stackoverflow.com/questions/6047970/weird-characters-when-filling-pdf-with-pdftk
|
12
|
+
#
|
13
|
+
class FdfHex < Fdf
|
14
|
+
private
|
15
|
+
|
16
|
+
def field(key, value)
|
17
|
+
"<</T(#{key})/V" +
|
18
|
+
(Array === value ? encode_many(value) : encode_value_as_hex(value)) +
|
19
|
+
">>\n"
|
20
|
+
end
|
21
|
+
|
22
|
+
def encode_many(values)
|
23
|
+
"[#{values.map { |v| encode_value_as_hex(v) }.join}]"
|
24
|
+
end
|
25
|
+
|
26
|
+
def encode_value_as_hex(value)
|
27
|
+
value = value.to_s
|
28
|
+
utf_16 = value.encode('UTF-16BE', :invalid => :replace, :undef => :replace)
|
29
|
+
hex = utf_16.unpack('H*').first
|
30
|
+
hex.force_encoding 'ASCII-8BIT' # jruby
|
31
|
+
'<FEFF' + hex.upcase + '>'
|
32
|
+
end
|
33
|
+
|
34
|
+
# Fdf implementation encodes to ISO-8859-15 which we do not want here.
|
35
|
+
def encode_data(fdf)
|
36
|
+
fdf
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -23,6 +23,9 @@ module PdfForms
|
|
23
23
|
#
|
24
24
|
# The pdftk binary may also be explecitly specified:
|
25
25
|
# PdftkWrapper.new('/usr/bin/pdftk', :flatten => true, :encrypt => true, :encrypt_options => 'allow Printing')
|
26
|
+
#
|
27
|
+
# Besides the options shown above, the drop_xfa or drop_xmp options are
|
28
|
+
# also supported.
|
26
29
|
def initialize(*args)
|
27
30
|
pdftk, options = normalize_args *args
|
28
31
|
@pdftk = Cliver.detect! pdftk
|
@@ -82,7 +85,7 @@ module PdfForms
|
|
82
85
|
# returns the commands output, check general execution success with
|
83
86
|
# $?.success?
|
84
87
|
def call_pdftk(*args)
|
85
|
-
SafeShell.execute pdftk, *(args.flatten)
|
88
|
+
SafeShell.execute! pdftk, *(args.flatten)
|
86
89
|
end
|
87
90
|
|
88
91
|
# concatenate documents, can optionally specify page ranges
|
@@ -133,11 +136,20 @@ module PdfForms
|
|
133
136
|
local[attrib] || options[attrib]
|
134
137
|
end
|
135
138
|
|
139
|
+
ALLOWED_OPTIONS = %i(
|
140
|
+
drop_xmp
|
141
|
+
drop_xfa
|
142
|
+
flatten
|
143
|
+
need_appearances
|
144
|
+
).freeze
|
145
|
+
|
136
146
|
def append_options(args, local_options = {})
|
137
147
|
return args if options.empty? && local_options.empty?
|
138
148
|
args = args.dup
|
139
|
-
|
140
|
-
|
149
|
+
ALLOWED_OPTIONS.each do |option|
|
150
|
+
if option_or_global(option, local_options)
|
151
|
+
args << option.to_s
|
152
|
+
end
|
141
153
|
end
|
142
154
|
if option_or_global(:encrypt, local_options)
|
143
155
|
encrypt_pass = option_or_global(:encrypt_password, local_options)
|
@@ -160,11 +172,11 @@ module PdfForms
|
|
160
172
|
when String
|
161
173
|
pdftk = first_arg
|
162
174
|
options = args.shift || {}
|
163
|
-
raise
|
175
|
+
raise ArgumentError.new("expected hash, got #{options.class.name}") unless Hash === options
|
164
176
|
when Hash
|
165
177
|
options = first_arg
|
166
178
|
else
|
167
|
-
raise
|
179
|
+
raise ArgumentError.new("expected string or hash, got #{first_arg.class.name}")
|
168
180
|
end
|
169
181
|
end
|
170
182
|
[pdftk, options]
|
data/lib/pdf_forms/version.rb
CHANGED
data/lib/pdf_forms.rb
CHANGED
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.4.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: 2021-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cliver
|
@@ -50,30 +50,31 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '1
|
53
|
+
version: '2.1'
|
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
|
-
version: '1
|
60
|
+
version: '2.1'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: rake
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: '
|
67
|
+
version: '13.0'
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '
|
74
|
+
version: '13.0'
|
75
75
|
description: A Ruby frontend to the pdftk binary, including FDF and XFDF creation.
|
76
|
-
Just pass your template and a hash of data
|
76
|
+
Also works with the PDFTK Java port. Just pass your template and a hash of data
|
77
|
+
to fill in.
|
77
78
|
email:
|
78
79
|
- jk@jkraemer.net
|
79
80
|
executables: []
|
@@ -86,6 +87,7 @@ files:
|
|
86
87
|
- lib/pdf_forms.rb
|
87
88
|
- lib/pdf_forms/data_format.rb
|
88
89
|
- lib/pdf_forms/fdf.rb
|
90
|
+
- lib/pdf_forms/fdf_hex.rb
|
89
91
|
- lib/pdf_forms/field.rb
|
90
92
|
- lib/pdf_forms/normalize_path.rb
|
91
93
|
- lib/pdf_forms/pdf.rb
|
@@ -111,8 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
113
|
- !ruby/object:Gem::Version
|
112
114
|
version: 1.3.6
|
113
115
|
requirements: []
|
114
|
-
|
115
|
-
rubygems_version: 2.5.1
|
116
|
+
rubygems_version: 3.0.3
|
116
117
|
signing_key:
|
117
118
|
specification_version: 4
|
118
119
|
summary: Fill out PDF forms with pdftk (http://www.accesspdf.com/pdftk/).
|