dragonfly_pdf 0.2.7 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 095237a6a9622212369e843513a40d2b24ace6f8
4
- data.tar.gz: 98e29ab37babf917c59201b240cb8d8ea55ea362
3
+ metadata.gz: 708b5f991d28126c6c374d503b4573c28879b8a9
4
+ data.tar.gz: 1d5d198c02b33d47d6318868da45a4cfdf896d51
5
5
  SHA512:
6
- metadata.gz: d88ef57e725191fb64fe36949160e7119c66bcbde69a1d8b3d4d84083f479e15f3a0b7e53f434da9a5bcf11781ae321566582afa05242384b75673ce24a1685e
7
- data.tar.gz: 9b574a0ef3a50dfb4f28f63c61bcf7f22e0111cb41c99f4635fd014eb05ee1ef90042cce7e1d5e35c5551758d5cf3c0e18718eeef3c458f23637a067c0f8c71c
6
+ metadata.gz: 907ca3ee3cdb14580edea1a20f11ecf7d571a69fa882409625924511434e811e47bb21ad4f3cf4739683377ed9a83cc45a0e81cc57c279b2a94d235d53234ef8
7
+ data.tar.gz: 26978346b3358fd27bcc0d7eb72bafb5ccbdfeaf5c6e2bdd8fa20c05a0e5f4703f840e368884df08a3c4e0d8b17bda749a5abe2df15a771b1d8204ae96405231
data/.travis.yml CHANGED
@@ -5,11 +5,13 @@ sudo: required
5
5
  dist: trusty
6
6
  rvm:
7
7
  - 2.2.5
8
+ env:
9
+ - LIBVIPS_VERSION_MAJOR=8 LIBVIPS_VERSION_MINOR=3 LIBVIPS_VERSION_PATCH=3 LIBVIPS_VERSION=$LIBVIPS_VERSION_MAJOR.$LIBVIPS_VERSION_MINOR.$LIBVIPS_VERSION_PATCH
8
10
  before_install:
9
11
  - gem update bundler
10
12
  - sudo apt-get update
11
13
  - sudo apt-get install -y pdftk
12
- - pdftk --version
14
+ - curl -s https://raw.githubusercontent.com/lovell/sharp/master/preinstall.sh | sudo bash -
13
15
  notifications:
14
16
  email:
15
17
  recipients:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.3.0
2
+
3
+ * refactored: `:page_thumb` now depends on `dragonfly_libvips` for faster processing and ability to specify dimensions (`100x100`) directly
4
+
1
5
  ## 0.2.4
2
6
 
3
7
  * added: `:remove_password`
data/README.md CHANGED
@@ -6,25 +6,32 @@
6
6
 
7
7
  ## Dependencies
8
8
 
9
- * [ImageMagick](http://www.imagemagick.org)
10
- * [GhostScript](http://www.ghostscript.com)
11
- * [pdftk](https://www.pdflabs.com/tools/pdftk-server)
9
+ - [libvips](https://github.com/jcupitt/libvips)
10
+ - [GhostScript](http://www.ghostscript.com)
11
+ - [pdftk](https://www.pdflabs.com/tools/pdftk-server)
12
12
 
13
13
  ## Installation
14
14
 
15
15
  Add this line to your application's Gemfile:
16
16
 
17
- gem 'dragonfly_pdf'
17
+ ```
18
+ gem 'dragonfly_pdf'
19
+ ```
18
20
 
19
21
  And then execute:
20
22
 
21
- $ bundle
23
+ ```
24
+ $ bundle
25
+ ```
22
26
 
23
27
  Or install it yourself as:
24
28
 
25
- $ gem install dragonfly_pdf
29
+ ```
30
+ $ gem install dragonfly_pdf
31
+ ```
26
32
 
27
33
  ## Usage
34
+
28
35
  The analyser and processors are added by configuring the plugin
29
36
 
30
37
  ```ruby
@@ -49,14 +56,6 @@ pdf.pdf_properties # => {
49
56
  }
50
57
  ```
51
58
 
52
- Optionally pass box type (`MediaBox|CropBox|BleedBox|TrimBox`):
53
-
54
- ```ruby
55
- pdf.pdf_properties(box_type: 'MediaBox')
56
- ```
57
-
58
- By default `TrimBox`, with a fallback to `MediaBox`.
59
-
60
59
  ## Processors
61
60
 
62
61
  ### Append
@@ -77,21 +76,22 @@ pdf.page(page_number=1)
77
76
 
78
77
  ### Page Thumb
79
78
 
80
- Generates thumbnail of a specified page, in defined density (dpi) and format, using GhostScript.
79
+ Generates thumbnail of a specified page using the `thumb` processor of [DragonflyLibvips](https://github.com/tomasc/dragonfly_libvips).
81
80
 
82
81
  ```ruby
83
- pdf.page_thumb(page_number=1, opts={})
82
+ pdf.page_thumb(page_number=1, '500x', opts={})
84
83
  ```
85
84
 
86
- The available options and their default values are:
85
+ The default format is `png`, others can be specified
87
86
 
88
87
  ```ruby
89
88
  {
90
- density: 600,
91
- format: :png,
89
+ 'format' => 'jpg',
92
90
  }
93
91
  ```
94
92
 
93
+ For more options see the [`thumb` doc](https://github.com/tomasc/dragonfly_libvips#thumb).
94
+
95
95
  ### Remove password
96
96
 
97
97
  Remove password from password protected PDF.
@@ -109,12 +109,12 @@ pdf.rotate(:left)
109
109
  ```
110
110
 
111
111
  Rotate selected pages.
112
+
112
113
  ```ruby
113
114
  pdf.rotate(1 => :left, 3 => :right)
114
115
  ```
115
116
 
116
- absolute: `north|south|east|west`
117
- relative: `left|right|down`
117
+ absolute: `north|south|east|west` relative: `left|right|down`
118
118
 
119
119
  ### Stamp
120
120
 
@@ -134,7 +134,7 @@ pdf.subset_fonts
134
134
 
135
135
  ## Contributing
136
136
 
137
- 1. Fork it ( https://github.com/tomasc/dragonfly_pdf/fork )
137
+ 1. Fork it ( <https://github.com/tomasc/dragonfly_pdf/fork> )
138
138
  2. Create your feature branch (`git checkout -b my-new-feature`)
139
139
  3. Commit your changes (`git commit -am 'Add some feature'`)
140
140
  4. Push to the branch (`git push origin my-new-feature`)
@@ -19,11 +19,12 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
 
21
21
  spec.add_dependency 'dragonfly', '~> 1.0'
22
+ spec.add_dependency 'dragonfly_libvips', '>= 0.1.1'
22
23
 
23
- spec.add_development_dependency 'bundler', '~> 1.7'
24
+ spec.add_development_dependency 'bundler', '~> 1.12'
24
25
  spec.add_development_dependency 'guard'
25
26
  spec.add_development_dependency 'guard-minitest'
26
- spec.add_development_dependency 'minitest'
27
+ spec.add_development_dependency 'minitest', '~> 5.0'
28
+ spec.add_development_dependency 'rake', '~> 10.0'
27
29
  spec.add_development_dependency 'pdf-reader'
28
- spec.add_development_dependency 'rake'
29
30
  end
@@ -1,31 +1,16 @@
1
1
  module DragonflyPdf
2
2
  module Analysers
3
3
  class PdfProperties
4
- def call(content, options = {})
5
- box_type = options.fetch :box_type, 'TrimBox'
4
+ def call(content, _options = {})
5
+ data = `pdftk #{content.path} dump_data`
6
6
 
7
- box_data = []
8
- rotate_data = []
9
- IO.foreach(content.path, "\n\n", encoding: 'ISO-8859-1') do |item|
10
- box_data += item.scan(/(MediaBox|CropBox|BleedBox|TrimBox)\s?\[([\d\.]+?)\s([\d\.]+?)\s([\d\.]+?)\s([\d\.]+?)\]/)
11
- rotate_data += item.scan(/\/Rotate\s(\d+?)\s/)
7
+ page_count = data.scan(/NumberOfPages: (\d+)/).flatten.first.to_i
8
+ page_numbers = data.scan(/PageMediaNumber: (\d+)/).flatten.map(&:to_i)
9
+ page_dimensions = data.scan(/PageMediaDimensions:\s*(\d+\.?\d+)\s*(\d+\.?\d+)/).map do |width_height|
10
+ width_height.map(&:to_f).map { |dim| pt2mm(dim) }
12
11
  end
13
-
14
- media_box = box_data.select { |d| d.first =~ /mediabox/i }
15
- desired_box = box_data.select { |d| d.first =~ /#{box_type}/i }
16
-
17
- # drop last value, since that comes from data about all pages
18
- media_box = media_box[0..-2] if media_box.length > 1
19
-
20
- page_dimensions = (!desired_box.empty? ? desired_box : media_box).map do |dim|
21
- i = dim[1..-1].map(&:to_f).map { |d| pt2mm(d) }
22
- [i[2] - i[0], i[3] - i[1]]
23
- end
24
-
25
- page_count = page_dimensions.count
12
+ page_rotations = data.scan(/PageMediaRotation: (\d+)/).flatten.map(&:to_f)
26
13
  aspect_ratios = page_dimensions.inject([]) { |res, page| res << (page.first / page.last) }
27
- page_numbers = (1..page_count).to_a
28
- page_rotations = rotate_data.flatten.map(&:to_f)
29
14
 
30
15
  {
31
16
  aspect_ratios: aspect_ratios,
@@ -1,15 +1,19 @@
1
1
  require 'dragonfly_pdf/analysers/pdf_properties'
2
2
  require 'dragonfly_pdf/processors/append'
3
3
  require 'dragonfly_pdf/processors/page'
4
- require 'dragonfly_pdf/processors/page_thumb'
5
4
  require 'dragonfly_pdf/processors/remove_password'
6
5
  require 'dragonfly_pdf/processors/rotate'
7
6
  require 'dragonfly_pdf/processors/stamp'
8
7
  require 'dragonfly_pdf/processors/subset_fonts'
9
8
 
9
+ require 'dragonfly_libvips/analysers/image_properties'
10
+ require 'dragonfly_libvips/processors/thumb'
11
+ require 'dragonfly_libvips/processors/vipsthumbnail'
12
+
10
13
  module DragonflyPdf
11
14
  class Plugin
12
15
  def call(app, _opts = {})
16
+ app.add_analyser :image_properties, DragonflyLibvips::Analysers::ImageProperties.new
13
17
  app.add_analyser :pdf_properties, DragonflyPdf::Analysers::PdfProperties.new
14
18
 
15
19
  app.add_analyser :page_count do |content|
@@ -29,18 +33,26 @@ module DragonflyPdf
29
33
  end
30
34
 
31
35
  app.add_analyser :aspect_ratios do |content|
32
- attrs = content.analyse(:pdf_properties)[:aspect_ratios]
36
+ content.analyse(:pdf_properties)[:aspect_ratios]
33
37
  end
34
38
 
35
39
  # ---------------------------------------------------------------------
36
40
 
37
41
  app.add_processor :append, DragonflyPdf::Processors::Append.new
38
42
  app.add_processor :page, DragonflyPdf::Processors::Page.new
39
- app.add_processor :page_thumb, DragonflyPdf::Processors::PageThumb.new
40
43
  app.add_processor :remove_password, DragonflyPdf::Processors::RemovePassword.new
41
44
  app.add_processor :rotate, DragonflyPdf::Processors::Rotate.new
42
45
  app.add_processor :stamp, DragonflyPdf::Processors::Stamp.new
43
46
  app.add_processor :subset_fonts, DragonflyPdf::Processors::SubsetFonts.new
47
+
48
+ app.add_processor :thumb, DragonflyLibvips::Processors::Thumb.new
49
+ app.add_processor :vipsthumbnail, DragonflyLibvips::Processors::Vipsthumbnail.new
50
+ app.add_processor :page_thumb do |content, page_number, dimensions, options|
51
+ options ||= {}
52
+ options['format'] ||= 'png'
53
+ options['input_args'] = [options['input_args'], "page=#{page_number - 1}"].compact.join(',')
54
+ content.process!(:thumb, dimensions, options)
55
+ end
44
56
  end
45
57
  end
46
58
  end
@@ -1,3 +1,3 @@
1
1
  module DragonflyPdf
2
- VERSION = '0.2.7'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
@@ -1,53 +1,45 @@
1
1
  require 'test_helper'
2
2
 
3
- module DragonflyPdf
4
- module Analysers
5
- describe PdfProperties do
6
- let(:app) { test_app.configure_with(:pdf) }
7
- let(:analyser) { DragonflyPdf::Analysers::PdfProperties.new }
8
- let(:sample_pages) { app.fetch_file(SAMPLES_DIR.join('sample_pages.pdf')) }
9
- let(:sample_pages_with_bleed) { app.fetch_file(SAMPLES_DIR.join('sample_pages_with_bleed.pdf')) }
10
- let(:sample_pages_rotated) { app.fetch_file(SAMPLES_DIR.join('sample_pages_rotated.pdf')) }
11
-
12
- # =====================================================================
13
-
14
- it 'returns Hash' do
15
- analyser.call(sample_pages).must_be_kind_of Hash
16
- end
17
-
18
- describe '#page_numbers' do
19
- it 'returns one-dimensional array' do
20
- analyser.call(sample_pages)[:page_numbers].must_equal (1..10).to_a
21
- analyser.call(sample_pages_with_bleed)[:page_numbers].must_equal [1]
22
- end
23
- end
24
-
25
- describe '#page_count' do
26
- it 'returns correct page count' do
27
- analyser.call(sample_pages)[:page_count].must_equal 10
28
- analyser.call(sample_pages_with_bleed)[:page_count].must_equal 1
29
- end
30
- end
31
-
32
- describe '#page_dimensions' do
33
- it 'returns array of page dimensions' do
34
- analyser.call(sample_pages)[:page_dimensions].map { |p| p.map(&:round) }.must_equal [[210, 297]].cycle.take(10)
35
- analyser.call(sample_pages_with_bleed)[:page_dimensions].map { |p| p.map(&:round) }.must_equal [[210, 297]].cycle.take(1)
36
- end
37
- end
38
-
39
- describe '#aspect_ratios' do
40
- it 'returns aspect ratios' do
41
- analyser.call(sample_pages)[:aspect_ratios].map { |i| i.round(2) }.must_equal [0.71].cycle.take(10)
42
- analyser.call(sample_pages_with_bleed)[:aspect_ratios].map { |i| i.round(2) }.must_equal [0.71].cycle.take(1)
43
- end
44
- end
45
-
46
- describe '#page_rotations' do
47
- it 'returns correct page count' do
48
- analyser.call(sample_pages_rotated)[:page_rotations].must_equal [0.0, 90.0, 180.0, 270.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
49
- end
50
- end
3
+ describe DragonflyPdf::Analysers::PdfProperties do
4
+ let(:app) { test_app.configure_with(:pdf) }
5
+ let(:analyser) { DragonflyPdf::Analysers::PdfProperties.new }
6
+ let(:sample_pages) { app.fetch_file(SAMPLES_DIR.join('sample_pages.pdf')) }
7
+ let(:sample_pages_with_bleed) { app.fetch_file(SAMPLES_DIR.join('sample_pages_with_bleed.pdf')) }
8
+ let(:sample_pages_rotated) { app.fetch_file(SAMPLES_DIR.join('sample_pages_rotated.pdf')) }
9
+
10
+ # =====================================================================
11
+
12
+ it 'returns Hash' do
13
+ analyser.call(sample_pages).must_be_kind_of Hash
14
+ end
15
+
16
+ describe '#page_numbers' do
17
+ it 'returns one-dimensional array' do
18
+ analyser.call(sample_pages)[:page_numbers].must_equal (1..10).to_a
19
+ end
20
+ end
21
+
22
+ describe '#page_count' do
23
+ it 'returns correct page count' do
24
+ analyser.call(sample_pages)[:page_count].must_equal 10
25
+ end
26
+ end
27
+
28
+ describe '#page_dimensions' do
29
+ it 'returns array of page dimensions' do
30
+ analyser.call(sample_pages)[:page_dimensions].map { |p| p.map(&:round) }.must_equal [[210, 297]].cycle.take(10)
31
+ end
32
+ end
33
+
34
+ describe '#aspect_ratios' do
35
+ it 'returns aspect ratios' do
36
+ analyser.call(sample_pages)[:aspect_ratios].map { |i| i.round(2) }.must_equal [0.71].cycle.take(10)
37
+ end
38
+ end
39
+
40
+ describe '#page_rotations' do
41
+ it 'returns correct page count' do
42
+ analyser.call(sample_pages_rotated)[:page_rotations].must_equal [0.0, 90.0, 180.0, 270.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
51
43
  end
52
44
  end
53
45
  end
@@ -62,5 +62,14 @@ module DragonflyPdf
62
62
  pdf.must_respond_to :subset_fonts
63
63
  end
64
64
  end
65
+
66
+ describe 'DragonflyLibvips proxy' do
67
+ describe 'page_thumb' do
68
+ it 'encodes the image to the correct format' do
69
+ pdf.page_thumb!(1, '600x')
70
+ `file --mime-type #{pdf.path}`.must_include 'image/png'
71
+ end
72
+ end
73
+ end
65
74
  end
66
75
  end
@@ -1,34 +1,14 @@
1
- require 'pdf-reader'
2
1
  require 'test_helper'
3
2
 
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) }
3
+ describe DragonflyPdf::Processors::Append do
4
+ let(:app) { test_app.configure_with(:pdf) }
5
+ let(:processor) { DragonflyPdf::Processors::Append.new }
6
+ let(:sample_1) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
7
+ let(:sample_2) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages_with_bleed.pdf')) }
12
8
 
13
- # =====================================================================
9
+ before { processor.call(sample_1, [sample_2]) }
14
10
 
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}`.delete("\n")
31
- end
32
- end
11
+ it 'has total number of pages' do
12
+ sample_1.analyse(:page_count).must_equal 11
33
13
  end
34
14
  end
@@ -1,39 +1,19 @@
1
- require 'pdf-reader'
2
1
  require 'test_helper'
3
2
 
4
- module DragonflyPdf
5
- module Processors
6
- describe Page do
7
- let(:app) { test_app.configure_with(:pdf) }
8
- let(:processor) { DragonflyPdf::Processors::Page.new }
9
- let(:sample_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
10
- let(:result) { PDF::Reader.new(sample_pages.path) }
3
+ describe DragonflyPdf::Processors::Page do
4
+ let(:app) { test_app.configure_with(:pdf) }
5
+ let(:processor) { DragonflyPdf::Processors::Page.new }
6
+ let(:sample_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
11
7
 
12
- # =====================================================================
13
-
14
- it 'returns PDF by default' do
15
- processor.call(sample_pages, 1)
16
- get_mime_type(sample_pages.path).must_include 'application/pdf'
17
- end
18
-
19
- it 'raises PageNotFound error' do
20
- proc { processor.call(sample_pages, 0) }.must_raise DragonflyPdf::PageNotFound
21
- proc { processor.call(sample_pages, 11) }.must_raise DragonflyPdf::PageNotFound
22
- end
23
-
24
- describe 'single pages' do
25
- it 'renders page' do
26
- processor.call(sample_pages, 1)
27
- result.pages.count.must_equal 1
28
- result.pages.first.text.must_equal '1'
29
- end
30
- end
31
-
32
- # ---------------------------------------------------------------------
8
+ it 'raises PageNotFound error' do
9
+ proc { processor.call(sample_pages, 0) }.must_raise DragonflyPdf::PageNotFound
10
+ proc { processor.call(sample_pages, 11) }.must_raise DragonflyPdf::PageNotFound
11
+ end
33
12
 
34
- def get_mime_type(file_path)
35
- `file --mime-type #{file_path}`.delete("\n")
36
- end
13
+ describe 'single pages' do
14
+ it 'renders page' do
15
+ processor.call(sample_pages, 1)
16
+ sample_pages.analyse(:page_count).must_equal 1
37
17
  end
38
18
  end
39
19
  end
@@ -1,26 +1,12 @@
1
- require 'pdf-reader'
2
1
  require 'test_helper'
3
2
 
4
- module DragonflyPdf
5
- module Processors
6
- describe RemovePassword do
7
- let(:app) { test_app.configure_with(:pdf) }
8
- let(:processor) { DragonflyPdf::Processors::RemovePassword.new }
9
- let(:sample_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages_with_password.pdf')) }
10
- let(:result) { PDF::Reader.new(sample_pages.path) }
3
+ describe DragonflyPdf::Processors::RemovePassword do
4
+ let(:app) { test_app.configure_with(:pdf) }
5
+ let(:processor) { DragonflyPdf::Processors::RemovePassword.new }
6
+ let(:sample_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages_with_password.pdf')) }
11
7
 
12
- # =====================================================================
13
-
14
- it 'returns PDF by default' do
15
- processor.call(sample_pages, 1)
16
- get_mime_type(sample_pages.path).must_include 'application/pdf'
17
- end
18
-
19
- # ---------------------------------------------------------------------
20
-
21
- def get_mime_type(file_path)
22
- `file --mime-type #{file_path}`.delete("\n")
23
- end
24
- end
8
+ it 'returns PDF by default' do
9
+ processor.call(sample_pages, 1)
10
+ `pdftk #{sample_pages.path} dump_data`.wont_include 'OWNER PASSWORD REQUIRED'
25
11
  end
26
12
  end
@@ -1,40 +1,21 @@
1
- require 'pdf-reader'
2
1
  require 'test_helper'
3
2
 
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) }
3
+ describe DragonflyPdf::Processors::Rotate do
4
+ let(:app) { test_app.configure_with(:pdf) }
5
+ let(:processor) { DragonflyPdf::Processors::Rotate.new }
6
+ let(:sample_1) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
11
7
 
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
- # ---------------------------------------------------------------------
8
+ describe 'arg is String|Symbol' do
9
+ it 'rotates all pages' do
10
+ processor.call(sample_1, :left)
11
+ sample_1.analyse(:page_rotations).must_equal [270, 270, 270, 270, 270, 270, 270, 270, 270, 270]
12
+ end
13
+ end
34
14
 
35
- def get_mime_type(file_path)
36
- `file --mime-type #{file_path}`.delete("\n")
37
- end
15
+ describe 'arg is Hash' do
16
+ it 'rotates only defined pages' do
17
+ processor.call(sample_1, 1 => :left, 3 => :right)
18
+ sample_1.analyse(:page_rotations).must_equal [270, 0.0, 90, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
38
19
  end
39
20
  end
40
21
  end
@@ -1,38 +1,20 @@
1
1
  require 'pdf-reader'
2
2
  require 'test_helper'
3
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) }
4
+ describe DragonflyPdf::Processors::Stamp do
5
+ let(:app) { test_app.configure_with(:pdf) }
6
+ let(:processor) { DragonflyPdf::Processors::Stamp.new }
7
+ let(:sample_1) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
8
+ let(:sample_stamp) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_stamp.pdf')) }
9
+ let(:text) { PDF::Reader.new(sample_1.path).pages.map(&:text) }
12
10
 
13
- # =====================================================================
11
+ before { processor.call(sample_1, sample_stamp) }
14
12
 
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
- # ---------------------------------------------------------------------
13
+ it 'has same number of pages' do
14
+ sample_1.analyse(:page_count).must_equal 10
15
+ end
32
16
 
33
- def get_mime_type(file_path)
34
- `file --mime-type #{file_path}`.delete("\n")
35
- end
36
- end
17
+ it 'has the stamp' do
18
+ text.must_equal %w(STAMP).cycle(10).to_a
37
19
  end
38
20
  end
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+
3
+ describe DragonflyPdf::Processors::SubsetFonts do
4
+ let(:app) { test_app.configure_with(:pdf) }
5
+ let(:processor) { DragonflyPdf::Processors::SubsetFonts.new }
6
+ let(:sample_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
7
+
8
+ it 'returns PDF by default' do
9
+ skip 'not sure how to test this'
10
+ processor.call(sample_pages, 1)
11
+ end
12
+ end
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.2.7
4
+ version: 0.3.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-08-16 00:00:00.000000000 Z
11
+ date: 2016-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dragonfly
@@ -24,20 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dragonfly_libvips
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.1
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '1.7'
47
+ version: '1.12'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '1.7'
54
+ version: '1.12'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: guard
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -70,32 +84,32 @@ dependencies:
70
84
  name: minitest
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - ">="
87
+ - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '0'
89
+ version: '5.0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - ">="
94
+ - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '0'
96
+ version: '5.0'
83
97
  - !ruby/object:Gem::Dependency
84
- name: pdf-reader
98
+ name: rake
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ">="
101
+ - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '0'
103
+ version: '10.0'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - ">="
108
+ - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '0'
110
+ version: '10.0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: rake
112
+ name: pdf-reader
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - ">="
@@ -130,7 +144,6 @@ files:
130
144
  - lib/dragonfly_pdf/plugin.rb
131
145
  - lib/dragonfly_pdf/processors/append.rb
132
146
  - lib/dragonfly_pdf/processors/page.rb
133
- - lib/dragonfly_pdf/processors/page_thumb.rb
134
147
  - lib/dragonfly_pdf/processors/remove_password.rb
135
148
  - lib/dragonfly_pdf/processors/rotate.rb
136
149
  - lib/dragonfly_pdf/processors/stamp.rb
@@ -145,11 +158,10 @@ files:
145
158
  - test/dragonfly_pdf/plugin_test.rb
146
159
  - test/dragonfly_pdf/processors/append_test.rb
147
160
  - test/dragonfly_pdf/processors/page_test.rb
148
- - test/dragonfly_pdf/processors/page_thumb_test.rb
149
161
  - test/dragonfly_pdf/processors/remove_password_test.rb
150
162
  - test/dragonfly_pdf/processors/rotate_test.rb
151
163
  - test/dragonfly_pdf/processors/stamp_test.rb
152
- - test/dragonfly_pdf/processors/subset_fonts.rb
164
+ - test/dragonfly_pdf/processors/subset_fonts_test.rb
153
165
  - test/test_helper.rb
154
166
  homepage: https://github.com/tomasc/dragonfly_pdf
155
167
  licenses:
@@ -180,9 +192,8 @@ test_files:
180
192
  - test/dragonfly_pdf/plugin_test.rb
181
193
  - test/dragonfly_pdf/processors/append_test.rb
182
194
  - test/dragonfly_pdf/processors/page_test.rb
183
- - test/dragonfly_pdf/processors/page_thumb_test.rb
184
195
  - test/dragonfly_pdf/processors/remove_password_test.rb
185
196
  - test/dragonfly_pdf/processors/rotate_test.rb
186
197
  - test/dragonfly_pdf/processors/stamp_test.rb
187
- - test/dragonfly_pdf/processors/subset_fonts.rb
198
+ - test/dragonfly_pdf/processors/subset_fonts_test.rb
188
199
  - test/test_helper.rb
@@ -1,45 +0,0 @@
1
- require_relative '../analysers/pdf_properties'
2
-
3
- module DragonflyPdf
4
- module Processors
5
- class PageThumb
6
- attr_reader :content, :density, :page_number, :format
7
-
8
- def call(content, page_number = 1, opts = {})
9
- @content = content
10
- @page_number = page_number
11
- @format = opts['format'] || :png
12
- @density = opts['density'] || 150
13
-
14
- content.shell_update(ext: @format) do |old_path, new_path|
15
- "#{gs_command} -o '#{new_path}' -f '#{old_path}'"
16
- end
17
-
18
- @content.meta['format'] = @format.to_s
19
- @content.ext = @format
20
- end
21
-
22
- def update_url(attrs, page_number, opts = {})
23
- format = opts['format']
24
- attrs.page_number = page_number
25
- attrs.ext = format if format
26
- end
27
-
28
- private # =============================================================
29
-
30
- def gs_command
31
- "gs -sDEVICE=#{gs_format} -r#{density} -dTextAlphaBits=4 -dUseArtBox -dFirstPage=#{page_number} -dLastPage=#{page_number}"
32
- end
33
-
34
-
35
- def gs_format
36
- case @format
37
- when :png then :png16m
38
- when :jpg, :jpeg then :jpeg
39
- when :tif, :tiff then :tiff48nc
40
- else :jpeg
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,34 +0,0 @@
1
- require 'test_helper'
2
-
3
- module DragonflyPdf
4
- module Processors
5
- describe PageThumb do
6
- let(:app) { test_app.configure_with(:pdf) }
7
- let(:processor) { DragonflyPdf::Processors::PageThumb.new }
8
- let(:sample_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
9
-
10
- # =====================================================================
11
-
12
- it 'returns PNG by default' do
13
- processor.call(sample_pages, 1, density: 72)
14
- get_mime_type(sample_pages.path).must_include 'image/png'
15
- end
16
-
17
- it 'raises PageNotFound error' do
18
- skip 'calling the page properties slows evrything down'
19
- proc { processor.call(sample_pages, 0) }.must_raise DragonflyPdf::PageNotFound
20
- proc { processor.call(sample_pages, 11) }.must_raise DragonflyPdf::PageNotFound
21
- end
22
-
23
- it 'renders page' do
24
- processor.call(sample_pages, 1, density: 72)
25
- end
26
-
27
- # ---------------------------------------------------------------------
28
-
29
- def get_mime_type(file_path)
30
- `file --mime-type #{file_path}`.delete("\n")
31
- end
32
- end
33
- end
34
- end
@@ -1,22 +0,0 @@
1
- module DragonflyPdf
2
- module Processors
3
- describe SubsetFonts do
4
- let(:app) { test_app.configure_with(:pdf) }
5
- let(:processor) { DragonflyPdf::Processors::SubsetFonts.new }
6
- let(:sample_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
7
-
8
- # =====================================================================
9
-
10
- it 'returns PDF by default' do
11
- processor.call(sample_pages, 1)
12
- get_mime_type(sample_pages.path).must_include 'application/pdf'
13
- end
14
-
15
- private # =============================================================
16
-
17
- def get_mime_type(file_path)
18
- `file --mime-type #{file_path}`.delete("\n")
19
- end
20
- end
21
- end
22
- end