fillform 0.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.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +6 -0
  3. data/LICENSE +26 -0
  4. data/README.md +126 -0
  5. data/data/afm/Courier-Bold.afm +342 -0
  6. data/data/afm/Courier-BoldOblique.afm +342 -0
  7. data/data/afm/Courier-Oblique.afm +342 -0
  8. data/data/afm/Courier.afm +342 -0
  9. data/data/afm/Helvetica-Bold.afm +2827 -0
  10. data/data/afm/Helvetica-BoldOblique.afm +2827 -0
  11. data/data/afm/Helvetica-Oblique.afm +3051 -0
  12. data/data/afm/Helvetica.afm +3051 -0
  13. data/data/afm/MustRead.html +19 -0
  14. data/data/afm/Symbol.afm +213 -0
  15. data/data/afm/Times-Bold.afm +2588 -0
  16. data/data/afm/Times-BoldItalic.afm +2384 -0
  17. data/data/afm/Times-Italic.afm +2667 -0
  18. data/data/afm/Times-Roman.afm +2419 -0
  19. data/data/afm/ZapfDingbats.afm +225 -0
  20. data/data/agl/LICENSE.md +26 -0
  21. data/data/agl/glyphlist.txt +4325 -0
  22. data/data/agl/zapfdingbats.txt +245 -0
  23. data/lib/fillform/appearance.rb +315 -0
  24. data/lib/fillform/border.rb +135 -0
  25. data/lib/fillform/data_format.rb +45 -0
  26. data/lib/fillform/field.rb +15 -0
  27. data/lib/fillform/filler.rb +82 -0
  28. data/lib/fillform/flattener.rb +114 -0
  29. data/lib/fillform/float32.rb +12 -0
  30. data/lib/fillform/font.rb +165 -0
  31. data/lib/fillform/form.rb +165 -0
  32. data/lib/fillform/glyphs.rb +99 -0
  33. data/lib/fillform/line_breaker.rb +98 -0
  34. data/lib/fillform/merged_widget.rb +20 -0
  35. data/lib/fillform/pdf/document.rb +240 -0
  36. data/lib/fillform/pdf/filters.rb +108 -0
  37. data/lib/fillform/pdf/objects.rb +48 -0
  38. data/lib/fillform/pdf/parser.rb +205 -0
  39. data/lib/fillform/pdf/serializer.rb +47 -0
  40. data/lib/fillform/pdf/text.rb +47 -0
  41. data/lib/fillform/pdf/writer.rb +51 -0
  42. data/lib/fillform/pdf.rb +9 -0
  43. data/lib/fillform/pdf_forms.rb +15 -0
  44. data/lib/fillform/pdftk_wrapper.rb +81 -0
  45. data/lib/fillform/report.rb +180 -0
  46. data/lib/fillform/version.rb +5 -0
  47. data/lib/fillform.rb +65 -0
  48. metadata +92 -0
data/lib/fillform.rb ADDED
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "fillform/version"
4
+
5
+ # Fills AcroForm PDF templates in pure Ruby. The appearance of a filled field is built with the
6
+ # formulas of pdftk (iText 2.1.7), so the documents look the same as the ones pdftk fills.
7
+ module Fillform
8
+ class Error < StandardError; end
9
+
10
+ class << self
11
+ def fill(template, destination, data = {}, flatten: false)
12
+ Filler.new(template).fill(data, flatten: flatten).write(destination)
13
+ end
14
+
15
+ def fields(template)
16
+ Report.new(PDF::Document.open(template.to_s)).fields
17
+ end
18
+
19
+ def field_names(template)
20
+ fields(template).map(&:name)
21
+ end
22
+
23
+ # Numbers in content streams are written like iText's ByteBuffer#formatDouble writes a float: five
24
+ # decimals below 1, two up to 32767, none above, each truncated after adding half of the last digit.
25
+ def number(value)
26
+ value = [value].pack("e").unpack1("e")
27
+ return "0" if value.abs < 0.000015
28
+
29
+ sign = value.negative? ? "-" : ""
30
+ value = value.abs
31
+ text = if value < 1.0
32
+ fraction(value + 0.000005, 100_000, 5)
33
+ elsif value <= 32_767
34
+ fraction(value + 0.005, 100, 2)
35
+ else
36
+ (value + 0.5).to_i.to_s
37
+ end
38
+ "#{sign}#{text}"
39
+ end
40
+
41
+ private
42
+
43
+ def fraction(value, scale, digits)
44
+ return "1" if digits == 5 && value >= 1
45
+
46
+ scaled = (value * scale).to_i
47
+ whole, decimals = scaled.divmod(scale)
48
+ decimals.zero? ? whole.to_s : "#{whole}.#{decimals.to_s.rjust(digits, "0").sub(/0+\z/, "")}"
49
+ end
50
+ end
51
+ end
52
+
53
+ require_relative "fillform/pdf"
54
+ require_relative "fillform/glyphs"
55
+ require_relative "fillform/form"
56
+ require_relative "fillform/merged_widget"
57
+ require_relative "fillform/field"
58
+ require_relative "fillform/report"
59
+ require_relative "fillform/font"
60
+ require_relative "fillform/float32"
61
+ require_relative "fillform/line_breaker"
62
+ require_relative "fillform/border"
63
+ require_relative "fillform/appearance"
64
+ require_relative "fillform/flattener"
65
+ require_relative "fillform/filler"
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fillform
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Alessandro Rodi
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies: []
12
+ description: 'Fills AcroForm templates in pure Ruby and draws the filled fields with
13
+ the layout of pdftk (iText 2.1.7): no Java, no pdftk binary, no subprocess. Ships
14
+ a PdfForms-compatible API.'
15
+ email:
16
+ - rodi@hey.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - CHANGELOG.md
22
+ - LICENSE
23
+ - README.md
24
+ - data/afm/Courier-Bold.afm
25
+ - data/afm/Courier-BoldOblique.afm
26
+ - data/afm/Courier-Oblique.afm
27
+ - data/afm/Courier.afm
28
+ - data/afm/Helvetica-Bold.afm
29
+ - data/afm/Helvetica-BoldOblique.afm
30
+ - data/afm/Helvetica-Oblique.afm
31
+ - data/afm/Helvetica.afm
32
+ - data/afm/MustRead.html
33
+ - data/afm/Symbol.afm
34
+ - data/afm/Times-Bold.afm
35
+ - data/afm/Times-BoldItalic.afm
36
+ - data/afm/Times-Italic.afm
37
+ - data/afm/Times-Roman.afm
38
+ - data/afm/ZapfDingbats.afm
39
+ - data/agl/LICENSE.md
40
+ - data/agl/glyphlist.txt
41
+ - data/agl/zapfdingbats.txt
42
+ - lib/fillform.rb
43
+ - lib/fillform/appearance.rb
44
+ - lib/fillform/border.rb
45
+ - lib/fillform/data_format.rb
46
+ - lib/fillform/field.rb
47
+ - lib/fillform/filler.rb
48
+ - lib/fillform/flattener.rb
49
+ - lib/fillform/float32.rb
50
+ - lib/fillform/font.rb
51
+ - lib/fillform/form.rb
52
+ - lib/fillform/glyphs.rb
53
+ - lib/fillform/line_breaker.rb
54
+ - lib/fillform/merged_widget.rb
55
+ - lib/fillform/pdf.rb
56
+ - lib/fillform/pdf/document.rb
57
+ - lib/fillform/pdf/filters.rb
58
+ - lib/fillform/pdf/objects.rb
59
+ - lib/fillform/pdf/parser.rb
60
+ - lib/fillform/pdf/serializer.rb
61
+ - lib/fillform/pdf/text.rb
62
+ - lib/fillform/pdf/writer.rb
63
+ - lib/fillform/pdf_forms.rb
64
+ - lib/fillform/pdftk_wrapper.rb
65
+ - lib/fillform/report.rb
66
+ - lib/fillform/version.rb
67
+ homepage: https://github.com/coorasse/fillform
68
+ licenses:
69
+ - MIT
70
+ metadata:
71
+ rubygems_mfa_required: 'true'
72
+ source_code_uri: https://github.com/coorasse/fillform
73
+ changelog_uri: https://github.com/coorasse/fillform/blob/main/CHANGELOG.md
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '3.2'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubygems_version: 4.0.20
89
+ specification_version: 4
90
+ summary: Fill PDF forms in pure Ruby, with the same output as pdftk. A drop-in replacement
91
+ for pdf-forms.
92
+ test_files: []