dragonfly_pdf 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bc1dfc0957a54f9a471a6f47705706ec438af938
4
- data.tar.gz: 2c83a13ad1d7f2cf1b5f4263d01c04fbad9ce770
3
+ metadata.gz: b630259edd321fc3a4972fc7c5cae40871e050b0
4
+ data.tar.gz: 57b09a13cd2c1b4099a56d284519873e792b0fc7
5
5
  SHA512:
6
- metadata.gz: 28ca7db1d884b7ac8e79ce28ae7e18aecb5e1c08d4080ba4c8f03e09055aec5fa13ccfb6b7cd49a7f50d14dbfb585e7eb7134621607a90b3a4891057edee6b68
7
- data.tar.gz: f8108c9aedbac45adea7d5a74ac96e924f0ddafa72db667b90acffafd577379823bd1c4a2dd175edb39b29de42da09eda17c246772718ecd6f528d50bd506e88
6
+ metadata.gz: 2185816838240ea29832527c758e9648a37038bdbd8f8d893eef372dd33941820730ebbe3faa1d7d082b47494ff9b1e563bddf2d5e11cadd4e414a0198233520
7
+ data.tar.gz: 52a19c0bddb5ce97f81a57ceb43f5e369b34343034af72b3af770b314303286318f21177d6bad56240cfe2cd5649ea40a9dec61c96220e9ceade68fd182c8ad1
data/.travis.yml CHANGED
@@ -1,10 +1,15 @@
1
1
  language: ruby
2
2
  cache: bundler
3
3
  script: 'bundle exec rake'
4
+ sudo: required
5
+ dist: trusty
4
6
  rvm:
5
7
  - 2.1.2
6
8
  before_install:
7
9
  - gem update bundler
10
+ - sudo apt-get update
11
+ - sudo apt-get install -y pdftk
12
+ - pdftk --version
8
13
  notifications:
9
14
  email:
10
15
  recipients:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 0.2.0
2
+
3
+ * refactor: read PDF attributes directly
4
+ * dependency: `pdftk` for adjustments to PDFs
5
+ * added: `append` to combine multiple PDFs together
6
+ * added: `rotate` to rotate pages of a PDF
7
+ * added: `stamp` to stamping pages with content of another PDF
8
+
1
9
  ## 0.1.0
2
10
 
3
11
  * added: `page_dimensions`
data/README.md CHANGED
@@ -8,6 +8,7 @@
8
8
 
9
9
  * [ImageMagick](http://www.imagemagick.org)
10
10
  * [GhostScript](http://www.ghostscript.com)
11
+ * [pdftk](https://www.pdflabs.com/tools/pdftk-server)
11
12
 
12
13
  ## Installation
13
14
 
@@ -39,13 +40,7 @@ end
39
40
  Reads properties from a PDF.
40
41
 
41
42
  ```ruby
42
- pdf.pdf_properties
43
- ```
44
-
45
- It returns a hash of properties:
46
-
47
- ```ruby
48
- {
43
+ pdf.pdf_properties # => {
49
44
  page_count: 4,
50
45
  page_dimensions: [[210.0, 297.0], [210.0, 297.0], [210.0, 297.0], [210.0, 297.0]],
51
46
  page_numbers: [1, 2, 3, 4],
@@ -55,8 +50,24 @@ It returns a hash of properties:
55
50
  }
56
51
  ```
57
52
 
53
+ Optionally pass box type (`MediaBox|CropBox|BleedBox|TrimBox`):
54
+
55
+ ```ruby
56
+ pdf.pdf_properties(box_type: 'MediaBox')
57
+ ```
58
+
59
+ By default `TrimBox`, with a fallback to `MediaBox`.
60
+
58
61
  ## Processors
59
62
 
63
+ ### Append
64
+
65
+ Append PDFs.
66
+
67
+ ```ruby
68
+ pdf.append([pdf_1, pdf_2, pdf_3])
69
+ ```
70
+
60
71
  ### Page
61
72
 
62
73
  Extracts page from PDF.
@@ -82,6 +93,30 @@ The available options and their default values are:
82
93
  }
83
94
  ```
84
95
 
96
+ ### Rotate
97
+
98
+ Rotate all pages.
99
+
100
+ ```ruby
101
+ pdf.rotate(:left)
102
+ ```
103
+
104
+ Rotate selected pages.
105
+ ```ruby
106
+ pdf.rotate(1 => :left, 3 => :right)
107
+ ```
108
+
109
+ absolute: `north|south|east|west`
110
+ relative: `left|right|down`
111
+
112
+ ### Stamp
113
+
114
+ Stamp every page of a PDF with another PDF.
115
+
116
+ ```ruby
117
+ pdf.stamp(stamp_pdf)
118
+ ```
119
+
85
120
  ### Subset Fonts
86
121
 
87
122
  Subset fonts in PDF.
@@ -20,10 +20,10 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency "dragonfly", "~> 1.0"
22
22
 
23
- spec.add_development_dependency "pdf-reader"
24
23
  spec.add_development_dependency "bundler", "~> 1.7"
25
- spec.add_development_dependency "rake"
26
24
  spec.add_development_dependency "guard"
27
25
  spec.add_development_dependency "guard-minitest"
28
26
  spec.add_development_dependency "minitest"
27
+ spec.add_development_dependency "pdf-reader"
28
+ spec.add_development_dependency "rake"
29
29
  end
@@ -2,68 +2,39 @@ module DragonflyPdf
2
2
  module Analysers
3
3
  class PdfProperties
4
4
  def call(content, options = {})
5
- @content = content
6
- @use_cropbox = options.fetch :use_cropbox, true
7
- @use_trimbox = options.fetch :use_trimbox, true
8
- @page_dimensions = page_dimensions
9
- {
10
- aspect_ratios: aspect_ratios,
11
- heights: heights,
12
- page_count: page_count,
13
- page_dimensions: @page_dimensions,
14
- page_numbers: page_numbers,
15
- widths: widths
16
- }
17
- end
18
-
19
- private # =============================================================
20
-
21
- def page_dimensions
22
- res = @content.shell_eval do |path|
23
- "#{identify_command} -format '%Wx%H,' #{path}"
24
- end
25
- res.to_s.split(/\s*,\s*/).compact.map do |page|
26
- page = page.split(/\s*x\s*/).map(&:to_f).map { |n| pt2mm(n) }
27
- end
28
- end
29
-
30
- # ---------------------------------------------------------------------
5
+ box_type = options.fetch :box_type, 'TrimBox'
31
6
 
32
- def widths
33
- @page_dimensions.inject([]) do |res, page|
34
- res << page[0]
7
+ box_data = []
8
+ IO.foreach(content.path, "\n\n", encoding: "ISO-8859-1") do |item|
9
+ box_data += item.scan(/(MediaBox|CropBox|BleedBox|TrimBox)\s?\[([\d\.]+?)\s([\d\.]+?)\s([\d\.]+?)\s([\d\.]+?)\]/)
35
10
  end
36
- end
37
11
 
38
- def heights
39
- @page_dimensions.inject([]) do |res, page|
40
- res << page[1]
41
- end
42
- end
12
+ # drop last value, since that comes from data about all pages
13
+ media_box = box_data.select { |d| d.first == 'MediaBox' }[0..-2]
14
+ desired_box = box_data.select { |d| d.first == box_type }
43
15
 
44
- def aspect_ratios
45
- @page_dimensions.inject([]) do |res, page|
46
- res << page[0] / page[1]
16
+ page_dimensions = (desired_box.length > 0 ? desired_box : media_box).map do |dim|
17
+ i = dim[1..-1].map(&:to_f).map{ |d| pt2mm(d) }
18
+ [ i[2]-i[0], i[3]-i[1] ]
47
19
  end
48
- end
49
20
 
50
- def page_count
51
- @page_dimensions.count
52
- end
21
+ page_count = page_dimensions.count
22
+ aspect_ratios = page_dimensions.inject([]) { |res, page| res << (page.first / page.last) }
23
+ page_numbers = (1..page_count).to_a
53
24
 
54
- def page_numbers
55
- (1..page_count).to_a
25
+ {
26
+ aspect_ratios: aspect_ratios,
27
+ page_count: page_count,
28
+ page_dimensions: page_dimensions,
29
+ page_numbers: page_numbers
30
+ }
56
31
  end
57
32
 
58
- # =====================================================================
33
+ private # =============================================================
59
34
 
60
35
  def pt2mm(pt)
61
36
  (pt / 72.0) * 25.4
62
37
  end
63
-
64
- def identify_command
65
- "identify -define pdf:use-cropbox=#{@use_cropbox} -define pdf:use-trimbox=#{@use_trimbox}"
66
- end
67
38
  end
68
39
  end
69
40
  end
@@ -1,11 +1,14 @@
1
1
  require 'dragonfly_pdf/analysers/pdf_properties'
2
+ require 'dragonfly_pdf/processors/append'
2
3
  require 'dragonfly_pdf/processors/page'
3
4
  require 'dragonfly_pdf/processors/page_thumb'
5
+ require 'dragonfly_pdf/processors/rotate'
6
+ require 'dragonfly_pdf/processors/stamp'
4
7
  require 'dragonfly_pdf/processors/subset_fonts'
5
8
 
6
9
  module DragonflyPdf
7
10
  class Plugin
8
- def call app, opts={}
11
+ def call(app, _opts = {})
9
12
  app.add_analyser :pdf_properties, DragonflyPdf::Analysers::PdfProperties.new
10
13
 
11
14
  app.add_analyser :page_count do |content|
@@ -34,8 +37,11 @@ module DragonflyPdf
34
37
 
35
38
  # ---------------------------------------------------------------------
36
39
 
37
- app.add_processor :page_thumb, DragonflyPdf::Processors::PageThumb.new
40
+ app.add_processor :append, DragonflyPdf::Processors::Append.new
38
41
  app.add_processor :page, DragonflyPdf::Processors::Page.new
42
+ app.add_processor :page_thumb, DragonflyPdf::Processors::PageThumb.new
43
+ app.add_processor :rotate, DragonflyPdf::Processors::Rotate.new
44
+ app.add_processor :stamp, DragonflyPdf::Processors::Stamp.new
39
45
  app.add_processor :subset_fonts, DragonflyPdf::Processors::SubsetFonts.new
40
46
  end
41
47
  end
@@ -0,0 +1,17 @@
1
+ module DragonflyPdf
2
+ module Processors
3
+ class Append
4
+ def call(content, pdfs_to_append, _options = {})
5
+ content.shell_update(ext: :pdf) do |old_path, new_path|
6
+ "#{pdftk_command} #{old_path} #{pdfs_to_append.map(&:path).join(' ')} cat output #{new_path}"
7
+ end
8
+ end
9
+
10
+ private # =============================================================
11
+
12
+ def pdftk_command
13
+ "pdftk"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -5,13 +5,11 @@ module DragonflyPdf
5
5
  module Processors
6
6
  class Page
7
7
  def call(content, page_number = 1, _opts = {})
8
- @content = content
9
- @page_number = page_number
10
-
8
+ pdf_properties = DragonflyPdf::Analysers::PdfProperties.new.call(content)
11
9
  fail DragonflyPdf::PageNotFound unless pdf_properties[:page_numbers].include?(page_number)
12
10
 
13
- @content.shell_update(ext: :pdf) do |old_path, new_path|
14
- "#{gs_command} -dFirstPage=#{@page_number} -dLastPage=#{@page_number} -o #{new_path} -f #{old_path}"
11
+ content.shell_update(ext: :pdf) do |old_path, new_path|
12
+ "#{gs_command} -dFirstPage=#{page_number} -dLastPage=#{page_number} -o #{new_path} -f #{old_path}"
15
13
  end
16
14
  end
17
15
 
@@ -20,10 +18,6 @@ module DragonflyPdf
20
18
  def gs_command
21
19
  'gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH'
22
20
  end
23
-
24
- def pdf_properties
25
- @pdf_properties ||= DragonflyPdf::Analysers::PdfProperties.new.call(@content)
26
- end
27
21
  end
28
22
  end
29
23
  end
@@ -0,0 +1,26 @@
1
+ module DragonflyPdf
2
+ module Processors
3
+ class Rotate
4
+ def call(content, arg)
5
+ rotate_args = case arg
6
+ when String, Symbol
7
+ fail ArgumentError.new unless arg =~ /north|south|east|west|left|right|down/i
8
+ "1-end#{arg}"
9
+ when Hash
10
+ pdf_properties = DragonflyPdf::Analysers::PdfProperties.new.call(content)
11
+ pdf_properties[:page_numbers].map { |page| [page, arg[page]].compact.join }.join(' ')
12
+ end
13
+
14
+ content.shell_update(ext: :pdf) do |old_path, new_path|
15
+ "#{pdftk_command} #{old_path} cat #{rotate_args} output #{new_path}"
16
+ end
17
+ end
18
+
19
+ private # =============================================================
20
+
21
+ def pdftk_command
22
+ 'pdftk'
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ module DragonflyPdf
2
+ module Processors
3
+ class Stamp
4
+ def call(content, stamp_pdf, _options = {})
5
+ content.shell_update(ext: :pdf) do |old_path, new_path|
6
+ "#{pdftk_command} #{old_path} stamp #{stamp_pdf.path} output #{new_path}"
7
+ end
8
+ end
9
+
10
+ private # =============================================================
11
+
12
+ def pdftk_command
13
+ "pdftk"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module DragonflyPdf
2
- VERSION = "0.1.3"
2
+ VERSION = "0.2.0"
3
3
  end
Binary file
@@ -27,26 +27,12 @@ module DragonflyPdf
27
27
  end
28
28
 
29
29
  describe '#page_dimensions' do
30
- it 'returns widths' do
30
+ it 'returns array of page dimensions' do
31
31
  analyser.call(sample_pages)[:page_dimensions].map{ |p| p.map(&:round) }.must_equal [[210, 297]].cycle.take(10)
32
32
  analyser.call(sample_pages_with_bleed)[:page_dimensions].map{ |p| p.map(&:round) }.must_equal [[210, 297]].cycle.take(1)
33
33
  end
34
34
  end
35
35
 
36
- describe '#widths' do
37
- it 'returns widths' do
38
- analyser.call(sample_pages)[:widths].map(&:round).must_equal [210].cycle.take(10)
39
- analyser.call(sample_pages_with_bleed)[:widths].map(&:round).must_equal [210].cycle.take(1)
40
- end
41
- end
42
-
43
- describe '#heights' do
44
- it 'returns heights' do
45
- analyser.call(sample_pages)[:heights].map(&:round).must_equal [297].cycle.take(10)
46
- analyser.call(sample_pages_with_bleed)[:heights].map(&:round).must_equal [297].cycle.take(1)
47
- end
48
- end
49
-
50
36
  describe '#aspect_ratios' do
51
37
  it 'returns aspect ratios' do
52
38
  analyser.call(sample_pages)[:aspect_ratios].map{ |i| i.round(2) }.must_equal [0.71].cycle.take(10)
@@ -0,0 +1,34 @@
1
+ require 'pdf-reader'
2
+ require 'test_helper'
3
+
4
+ module DragonflyPdf
5
+ module Processors
6
+ describe Append do
7
+ let(:app) { test_app.configure_with(:pdf) }
8
+ let(:processor) { DragonflyPdf::Processors::Append.new }
9
+ let(:sample_1) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
10
+ let(:sample_2) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages_with_bleed.pdf')) }
11
+ let(:result) { PDF::Reader.new(sample_1.path) }
12
+
13
+ # =====================================================================
14
+
15
+ before do
16
+ processor.call(sample_1, [sample_2])
17
+ end
18
+
19
+ it 'returns PDF by default' do
20
+ get_mime_type(sample_1.path).must_include 'application/pdf'
21
+ end
22
+
23
+ it 'has total number of pages' do
24
+ result.pages.count.must_equal 11
25
+ end
26
+
27
+ # ---------------------------------------------------------------------
28
+
29
+ def get_mime_type(file_path)
30
+ `file --mime-type #{file_path}`.gsub(/\n/, '')
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,4 @@
1
+ require 'pdf-reader'
1
2
  require 'test_helper'
2
3
 
3
4
  module DragonflyPdf
@@ -6,6 +7,7 @@ module DragonflyPdf
6
7
  let(:app) { test_app.configure_with(:pdf) }
7
8
  let(:processor) { DragonflyPdf::Processors::Page.new }
8
9
  let(:sample_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
10
+ let(:result) { PDF::Reader.new(sample_pages.path) }
9
11
 
10
12
  # =====================================================================
11
13
 
@@ -22,9 +24,8 @@ module DragonflyPdf
22
24
  describe 'single pages' do
23
25
  it 'renders page' do
24
26
  processor.call(sample_pages, 1)
25
- pdf = PDF::Reader.new(sample_pages.path)
26
- pdf.pages.count.must_equal 1
27
- pdf.pages.first.text.must_equal '1'
27
+ result.pages.count.must_equal 1
28
+ result.pages.first.text.must_equal '1'
28
29
  end
29
30
  end
30
31
 
@@ -0,0 +1,40 @@
1
+ require 'pdf-reader'
2
+ require 'test_helper'
3
+
4
+ module DragonflyPdf
5
+ module Processors
6
+ describe Rotate do
7
+ let(:app) { test_app.configure_with(:pdf) }
8
+ let(:processor) { DragonflyPdf::Processors::Rotate.new }
9
+ let(:sample_1) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
10
+ let(:result) { PDF::Reader.new(sample_1.path) }
11
+
12
+ # =====================================================================
13
+
14
+ it 'returns PDF by default' do
15
+ processor.call(sample_1, :left)
16
+ get_mime_type(sample_1.path).must_include 'application/pdf'
17
+ end
18
+
19
+ describe 'arg is String|Symbol' do
20
+ it 'rotates all pages' do
21
+ processor.call(sample_1, :left)
22
+ result.pages.map { |p| p.attributes[:Rotate] }.must_equal [270, 270, 270, 270, 270, 270, 270, 270, 270, 270]
23
+ end
24
+ end
25
+
26
+ describe 'arg is Hash' do
27
+ it 'rotates only defined pages' do
28
+ processor.call(sample_1, 1 => :left, 3 => :right)
29
+ result.pages.map { |p| p.attributes[:Rotate] }.must_equal [270, nil, 90, nil, nil, nil, nil, nil, nil, nil]
30
+ end
31
+ end
32
+
33
+ # ---------------------------------------------------------------------
34
+
35
+ def get_mime_type(file_path)
36
+ `file --mime-type #{file_path}`.gsub(/\n/, '')
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,38 @@
1
+ require 'pdf-reader'
2
+ require 'test_helper'
3
+
4
+ module DragonflyPdf
5
+ module Processors
6
+ describe Stamp do
7
+ let(:app) { test_app.configure_with(:pdf) }
8
+ let(:processor) { DragonflyPdf::Processors::Stamp.new }
9
+ let(:sample_1) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
10
+ let(:sample_stamp) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_stamp.pdf')) }
11
+ let(:result) { PDF::Reader.new(sample_1.path) }
12
+
13
+ # =====================================================================
14
+
15
+ before do
16
+ processor.call(sample_1, sample_stamp)
17
+ end
18
+
19
+ it 'returns PDF by default' do
20
+ get_mime_type(sample_1.path).must_include 'application/pdf'
21
+ end
22
+
23
+ it 'has same number of pages' do
24
+ result.pages.count.must_equal 10
25
+ end
26
+
27
+ it 'has the stamp' do
28
+ result.pages.map(&:text).must_equal %w(STAMP).cycle(10).to_a
29
+ end
30
+
31
+ # ---------------------------------------------------------------------
32
+
33
+ def get_mime_type(file_path)
34
+ `file --mime-type #{file_path}`.gsub(/\n/, '')
35
+ end
36
+ end
37
+ end
38
+ end
data/test/test_helper.rb CHANGED
@@ -7,8 +7,6 @@ require 'minitest/spec'
7
7
  require 'dragonfly'
8
8
  require 'dragonfly_pdf'
9
9
 
10
- require 'pdf-reader'
11
-
12
10
  # ---------------------------------------------------------------------
13
11
 
14
12
  SAMPLES_DIR = Pathname.new(File.expand_path('../../samples', __FILE__))
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dragonfly_pdf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomas Celizna
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-08 00:00:00.000000000 Z
11
+ date: 2016-01-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dragonfly
@@ -25,35 +25,35 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: pdf-reader
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '1.7'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '1.7'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: guard
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '1.7'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '1.7'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rake
56
+ name: guard-minitest
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: guard
70
+ name: minitest
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: guard-minitest
84
+ name: pdf-reader
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: minitest
98
+ name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -128,16 +128,23 @@ files:
128
128
  - lib/dragonfly_pdf/analysers/pdf_properties.rb
129
129
  - lib/dragonfly_pdf/errors.rb
130
130
  - lib/dragonfly_pdf/plugin.rb
131
+ - lib/dragonfly_pdf/processors/append.rb
131
132
  - lib/dragonfly_pdf/processors/page.rb
132
133
  - lib/dragonfly_pdf/processors/page_thumb.rb
134
+ - lib/dragonfly_pdf/processors/rotate.rb
135
+ - lib/dragonfly_pdf/processors/stamp.rb
133
136
  - lib/dragonfly_pdf/processors/subset_fonts.rb
134
137
  - lib/dragonfly_pdf/version.rb
135
138
  - samples/sample_pages.pdf
136
139
  - samples/sample_pages_with_bleed.pdf
140
+ - samples/sample_stamp.pdf
137
141
  - test/dragonfly_pdf/analysers/pdf_properties_test.rb
138
142
  - test/dragonfly_pdf/plugin_test.rb
143
+ - test/dragonfly_pdf/processors/append_test.rb
139
144
  - test/dragonfly_pdf/processors/page_test.rb
140
145
  - test/dragonfly_pdf/processors/page_thumb_test.rb
146
+ - test/dragonfly_pdf/processors/rotate_test.rb
147
+ - test/dragonfly_pdf/processors/stamp_test.rb
141
148
  - test/dragonfly_pdf/processors/subset_fonts.rb
142
149
  - test/test_helper.rb
143
150
  homepage: https://github.com/tomasc/dragonfly_pdf
@@ -160,14 +167,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
167
  version: '0'
161
168
  requirements: []
162
169
  rubyforge_project:
163
- rubygems_version: 2.5.1
170
+ rubygems_version: 2.4.6
164
171
  signing_key:
165
172
  specification_version: 4
166
173
  summary: Dragonfly PDF analysers and processors.
167
174
  test_files:
168
175
  - test/dragonfly_pdf/analysers/pdf_properties_test.rb
169
176
  - test/dragonfly_pdf/plugin_test.rb
177
+ - test/dragonfly_pdf/processors/append_test.rb
170
178
  - test/dragonfly_pdf/processors/page_test.rb
171
179
  - test/dragonfly_pdf/processors/page_thumb_test.rb
180
+ - test/dragonfly_pdf/processors/rotate_test.rb
181
+ - test/dragonfly_pdf/processors/stamp_test.rb
172
182
  - test/dragonfly_pdf/processors/subset_fonts.rb
173
183
  - test/test_helper.rb