dragonfly_pdf 0.0.6 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8ee23007036641281d4325d303511da0796a1f6a
4
- data.tar.gz: 2c83a852242b6cb5f78f69c96fba43b7900e2959
3
+ metadata.gz: 2750c91307336a07aaadcbb6ff558becd185dd43
4
+ data.tar.gz: 45dc9c8d207ef6a5df210012bea76f5b70c621f7
5
5
  SHA512:
6
- metadata.gz: 701c02304a959ed3757befceb4e708bd1cbca373efab15150b760c78671910a1156f7d808a88c7a6b4ef451a82c4e08215a448600d63cd56259e3df4b9386972
7
- data.tar.gz: 0bb95b962d22d78e76dc21e4b47c58160210e9bd054f71f8e3d6278aec5447b03166f5a1a60f9b8b64c5be98377b10053f8d0627392e3b51855b424e91d28745
6
+ metadata.gz: 202b5f48965ab0182b5988209057c4383b3b6401b994eac9e07e2d4ef373b390b074f9e175a8ea711fb7f9e576d4f6f13520266c34d42a7d78621aa0d3d6f34a
7
+ data.tar.gz: 19562c74566b4f386876d331e61d981b5cae9d533be5ca6f30bcb24a1355b149ae656af0decf512a0976043b95011997955dcc4fa12044864464bf406603b116
data/.travis.yml ADDED
@@ -0,0 +1,14 @@
1
+ language: ruby
2
+ cache: bundler
3
+ script: 'bundle exec rake'
4
+ rvm:
5
+ - 2.1.2
6
+ before_install:
7
+ - gem update bundler
8
+ notifications:
9
+ email:
10
+ recipients:
11
+ - tomas.celizna@gmail.com
12
+ - asger@8kilo.com
13
+ on_failure: change
14
+ on_success: never
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## 0.1.0
2
+
3
+ * added: `page_dimensions`
4
+ * fixed: calculating page dimensions based on crop area
5
+ * removed: the `spread` setting and related calculations have been removed (the logic is better situated on a model using the PDF)
data/README.md CHANGED
@@ -32,14 +32,6 @@ Dragonfly.app.configure do
32
32
  end
33
33
  ```
34
34
 
35
- ### Spreads
36
-
37
- PDFs that contain spreads (as when saving with the spreads option in InDesign) require setting the `spreads` [metadata](http://markevans.github.io/dragonfly/models/#meta-data) attribute to `true`:
38
-
39
- ```ruby
40
- pdf.meta['spreads'] = true
41
- ```
42
-
43
35
  ## Analysers
44
36
 
45
37
  ### PDF properties
@@ -55,16 +47,14 @@ It returns a hash of properties:
55
47
  ```ruby
56
48
  {
57
49
  page_count: 4,
58
- spread_count: 3,
59
- page_numbers: [[1], [2, 3], [4]],
60
- widths: [[210.0], [210.0, 210.0], [210.0]],
61
- heights: [[297.0], [297.0, 297.0], [297.0]],
62
- aspect_ratios: [[0.71], [0.71, 0.71], [0.71]]
50
+ page_dimensions: [[210.0, 297.0], [210.0, 297.0], [210.0, 297.0], [210.0, 297.0]],
51
+ page_numbers: [1, 2, 3, 4],
52
+ widths: [210.0, 210.0, 210.0, 210.0],
53
+ heights: [297.0, 297.0, 297.0, 297.0],
54
+ aspect_ratios: [0.71, 0.71, 0.71, 0.71]
63
55
  }
64
56
  ```
65
57
 
66
- When the `spreads` metadata is set to `true`, the analyser assumes the PDF contains 2 real pages per one PDF page and recalculates the PDF properties accordingly (including situations where the PDF begins or ends with a single page). All page arrays (`page_numbers`, `widths`, `heights`, `aspect_ratios`) are then two dimensional (as illustrated above), representing spreads and nested individual pages.
67
-
68
58
  ## Processors
69
59
 
70
60
  ### Page
@@ -19,9 +19,9 @@ 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 "pdf-reader", "~> 1.3"
23
22
 
24
- spec.add_development_dependency "bundler", "~> 1.6"
23
+ spec.add_development_dependency "pdf-reader"
24
+ spec.add_development_dependency "bundler", "~> 1.7"
25
25
  spec.add_development_dependency "rake"
26
26
  spec.add_development_dependency "guard"
27
27
  spec.add_development_dependency "guard-minitest"
@@ -3,147 +3,68 @@ require 'pdf-reader'
3
3
  module DragonflyPdf
4
4
  module Analysers
5
5
  class PdfProperties
6
-
7
- def call content
8
- spreads = content.meta['spreads'] || false
9
-
10
- pdf = PDF::Reader.new(content.file)
11
-
6
+ def call(content, options = {})
7
+ @content = content
8
+ @use_cropbox = options.fetch :use_cropbox, true
9
+ @use_trimbox = options.fetch :use_trimbox, true
12
10
  {
13
- aspect_ratios: aspect_ratios(pdf, spreads),
14
- heights: heights(pdf, spreads),
15
- page_count: page_count(pdf, spreads),
16
- page_numbers: page_numbers(pdf, spreads),
17
- spread_count: spread_count(pdf, spreads),
18
- widths: widths(pdf, spreads)
11
+ aspect_ratios: aspect_ratios,
12
+ heights: heights,
13
+ page_count: page_count,
14
+ page_dimensions: page_dimensions,
15
+ page_numbers: page_numbers,
16
+ widths: widths
19
17
  }
20
18
  end
21
19
 
22
20
  private # =============================================================
23
21
 
24
- def widths pdf, spreads
25
- pdf_page_widths = pdf.pages.map do |page|
26
- media_box = page.attributes[:MediaBox]
27
- pt2mm(media_box[2] - media_box[0]).round(2)
28
- end
29
-
30
- return pdf_page_widths unless spreads
31
-
32
- res = []
33
- i = 0
34
- spread = []
35
- page_numbers(pdf, spreads).each do |s|
36
- if s.count == 1
37
- spread << pdf_page_widths[i]
38
- else
39
- spread << pdf_page_widths[i]/2
40
- spread << pdf_page_widths[i]/2
22
+ def page_dimensions
23
+ @page_dimensions ||= begin
24
+ res = @content.shell_eval do |path|
25
+ "#{identify_command} -format '%Wx%H,' #{path}"
41
26
  end
42
- res << spread
43
- spread = []
44
- i = i+1
45
- end
46
- res
47
- end
48
-
49
- # ---------------------------------------------------------------------
50
-
51
- def heights pdf, spreads
52
- pdf_page_heights = pdf.pages.map do |page|
53
- media_box = page.attributes[:MediaBox]
54
- pt2mm(media_box[3] - media_box[1]).round(2)
55
- end
56
-
57
- return pdf_page_heights unless spreads
58
-
59
- res = []
60
- i = 0
61
- spread = []
62
- page_numbers(pdf, spreads).each do |s|
63
- if s.count == 1
64
- spread << pdf_page_heights[i]
65
- else
66
- spread << pdf_page_heights[i]
67
- spread << pdf_page_heights[i]
27
+ res.to_s.split(/\s*,\s*/).compact.map do |page|
28
+ page = page.split(/\s*x\s*/).map(&:to_f).map { |n| pt2mm(n) }
68
29
  end
69
- res << spread
70
- spread = []
71
- i = i+1
72
30
  end
73
- res
74
31
  end
75
32
 
76
- # ---------------------------------------------------------------------
77
-
78
- def aspect_ratios pdf, spreads
79
- pdf_aspect_ratios = widths(pdf, false).zip(heights(pdf, false)).map do |width, height|
80
- (width / height)
33
+ def widths
34
+ page_dimensions.inject([]) do |res, page|
35
+ res << page[0]
81
36
  end
37
+ end
82
38
 
83
- return pdf_aspect_ratios unless spreads
84
-
85
- res = []
86
- i = 0
87
- spread = []
88
- page_numbers(pdf, spreads).each do |s|
89
- if s.count == 1
90
- spread << pdf_aspect_ratios[i]
91
- else
92
- spread << pdf_aspect_ratios[i]/2
93
- spread << pdf_aspect_ratios[i]/2
94
- end
95
- res << spread
96
- spread = []
97
- i = i+1
39
+ def heights
40
+ page_dimensions.inject([]) do |res, page|
41
+ res << page[1]
98
42
  end
99
- res
100
43
  end
101
44
 
102
- # ---------------------------------------------------------------------
103
-
104
- def page_numbers pdf, spreads
105
- return pdf.pages.collect { |p| p.number } unless spreads
106
-
107
- page_widths = widths(pdf, false)
108
- single_page_width = page_widths.uniq.count == 1 ? -9999999 : widths(pdf, false).min
109
-
110
- i = 1
111
- res = []
112
- spread = []
113
-
114
- page_widths.each do |page_width|
115
- if page_width > single_page_width
116
- spread << i
117
- i = i+1
118
- spread << i
119
- else
120
- spread << i
121
- end
122
- res << spread
123
- spread = []
124
- i = i+1
45
+ def aspect_ratios
46
+ page_dimensions.inject([]) do |res, page|
47
+ res << page[0] / page[1]
125
48
  end
126
-
127
- res
128
49
  end
129
50
 
130
- # ---------------------------------------------------------------------
131
-
132
- def page_count pdf, spreads
133
- page_numbers(pdf, spreads).flatten.count
51
+ def page_numbers
52
+ (1..page_count).to_a
134
53
  end
135
54
 
136
- def spread_count pdf, spreads
137
- return 0 unless spreads
138
- page_numbers(pdf, spreads).count
55
+ def page_count
56
+ page_dimensions.count
139
57
  end
140
58
 
141
59
  # =====================================================================
142
60
 
143
- def pt2mm pt
61
+ def pt2mm(pt)
144
62
  (pt / 72.0) * 25.4
145
63
  end
146
64
 
65
+ def identify_command
66
+ "identify -define pdf:use-cropbox=#{@use_cropbox} -define pdf:use-trimbox=#{@use_trimbox}"
67
+ end
147
68
  end
148
69
  end
149
70
  end
@@ -1,12 +1,10 @@
1
1
  require 'dragonfly_pdf/analysers/pdf_properties'
2
-
3
2
  require 'dragonfly_pdf/processors/page'
4
3
  require 'dragonfly_pdf/processors/page_thumb'
5
4
  require 'dragonfly_pdf/processors/subset_fonts'
6
5
 
7
6
  module DragonflyPdf
8
7
  class Plugin
9
-
10
8
  def call app, opts={}
11
9
  app.add_analyser :pdf_properties, DragonflyPdf::Analysers::PdfProperties.new
12
10
 
@@ -14,14 +12,14 @@ module DragonflyPdf
14
12
  content.analyse(:pdf_properties)[:page_count]
15
13
  end
16
14
 
17
- app.add_analyser :spread_count do |content|
18
- content.analyse(:pdf_properties)[:spread_count]
19
- end
20
-
21
15
  app.add_analyser :page_numbers do |content|
22
16
  content.analyse(:pdf_properties)[:page_numbers]
23
17
  end
24
18
 
19
+ app.add_analyser :page_dimensions do |content|
20
+ content.analyse(:pdf_properties)[:page_dimensions]
21
+ end
22
+
25
23
  app.add_analyser :widths do |content|
26
24
  content.analyse(:pdf_properties)[:widths]
27
25
  end
@@ -34,17 +32,12 @@ module DragonflyPdf
34
32
  attrs = content.analyse(:pdf_properties)[:aspect_ratios]
35
33
  end
36
34
 
37
- app.add_analyser :info do |content|
38
- attrs = content.analyse(:pdf_properties)[:info]
39
- end
40
-
41
35
  # ---------------------------------------------------------------------
42
36
 
43
37
  app.add_processor :page_thumb, DragonflyPdf::Processors::PageThumb.new
44
38
  app.add_processor :page, DragonflyPdf::Processors::Page.new
45
39
  app.add_processor :subset_fonts, DragonflyPdf::Processors::SubsetFonts.new
46
40
  end
47
-
48
41
  end
49
42
  end
50
43
 
@@ -5,46 +5,26 @@ require_relative '../analysers/pdf_properties'
5
5
  module DragonflyPdf
6
6
  module Processors
7
7
  class Page
8
+ def call(content, page_number = 1, _opts = {})
9
+ @content = content
10
+ @page_number = page_number
8
11
 
9
- def call content, page_number=1, opts={}
10
- spreads = content.meta['spreads'] || false
11
- pdf_page_number = page_number
12
- crop_args = ''
12
+ fail DragonflyPdf::PageNotFound unless pdf_properties[:page_numbers].include?(page_number)
13
13
 
14
- pdf_properties = DragonflyPdf::Analysers::PdfProperties.new.call(content)
15
-
16
- raise DragonflyPdf::PageNotFound unless pdf_properties[:page_numbers].flatten.include?(page_number)
17
-
18
- if spreads
19
- spread = pdf_properties[:page_numbers].detect{ |s| s.include?(page_number) }
20
- spread_number = pdf_properties[:page_numbers].index(spread)
21
- spread_side = spread.index(page_number)
22
-
23
- pdf_page_number = spread_number+1
24
-
25
- pdf = PDF::Reader.new(content.path)
26
- box = pdf.pages[spread_number].attributes[:MediaBox] || pdf.pages[spread_number].attributes[:CropBox]
27
-
28
- crop_box = box
29
- crop_box[2] = crop_box[2]/2
30
- crop_box[0] += crop_box[2] * spread_side
31
- crop_box[2] += crop_box[2] * spread_side
32
-
33
- crop_args = "-c '[/CropBox [#{crop_box.join(' ')}] /PAGES pdfmark'"
34
- end
35
-
36
- content.shell_update(ext: :pdf) do |old_path, new_path|
37
- "#{gs_command} -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dFirstPage=#{pdf_page_number} -dLastPage=#{pdf_page_number} -o #{new_path} #{crop_args} -f #{old_path}"
14
+ @content.shell_update(ext: :pdf) do |old_path, new_path|
15
+ "#{gs_command} -dFirstPage=#{@page_number} -dLastPage=#{@page_number} -o #{new_path} -f #{old_path}"
38
16
  end
39
17
  end
40
18
 
41
-
42
19
  private # =============================================================
43
-
20
+
44
21
  def gs_command
45
- 'gs'
22
+ 'gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH'
46
23
  end
47
24
 
25
+ def pdf_properties
26
+ @pdf_properties ||= DragonflyPdf::Analysers::PdfProperties.new.call(@content)
27
+ end
48
28
  end
49
29
  end
50
30
  end
@@ -3,40 +3,23 @@ require_relative '../analysers/pdf_properties'
3
3
  module DragonflyPdf
4
4
  module Processors
5
5
  class PageThumb
6
+ def call(content, page_number = 1, opts = {})
7
+ @content = content
8
+ @page_number = page_number
9
+ @format = opts['format'] || :png
10
+ @density = opts['density'] || 150
6
11
 
7
- def call content, page_number=1, opts={}
8
- format = opts['format'] || :png
9
- density = opts['density'] || 150
10
- spreads = content.meta['spreads'] || false
12
+ fail DragonflyPdf::PageNotFound unless pdf_properties[:page_numbers].include?(@page_number)
11
13
 
12
- args = "-alpha deactivate -background white -colorspace sRGB -density #{density}x#{density} -define pdf:use-cropbox=true -define pdf:use-trimbox=true"
13
- crop_args = ''
14
-
15
- pdf_properties = DragonflyPdf::Analysers::PdfProperties.new.call(content)
16
-
17
- raise DragonflyPdf::PageNotFound unless pdf_properties[:page_numbers].flatten.include?(page_number)
18
-
19
- if spreads
20
- spread = pdf_properties[:page_numbers].detect{ |s| s.include?(page_number) }
21
- spread_number = pdf_properties[:page_numbers].index(spread)
22
- spread_side = spread.index(page_number)
23
- page_to_delete = 1-spread_side
24
-
25
- pdf_page_number = spread_number
26
- crop_args = "-crop 50%x100% -delete #{page_to_delete}"
27
- else
28
- pdf_page_number = page_number-1
14
+ content.shell_update(ext: @format) do |old_path, new_path|
15
+ "#{convert_command} #{old_path}[#{pdf_page_number}] #{new_path}"
29
16
  end
30
17
 
31
- content.shell_update(ext: format) do |old_path, new_path|
32
- "#{convert_command} #{args} #{crop_args} #{old_path}[#{pdf_page_number}] #{new_path}"
33
- end
34
-
35
- content.meta['format'] = format.to_s
36
- content.ext = format
18
+ @content.meta['format'] = @format.to_s
19
+ @content.ext = @format
37
20
  end
38
21
 
39
- def update_url attrs, page_number, opts={}
22
+ def update_url(attrs, page_number, opts = {})
40
23
  format = opts['format']
41
24
  attrs.page_number = page_number
42
25
  attrs.ext = format if format
@@ -44,18 +27,17 @@ module DragonflyPdf
44
27
 
45
28
  private # =============================================================
46
29
 
47
- def convert_command
48
- 'convert'
30
+ def pdf_properties
31
+ @pdf_properties ||= DragonflyPdf::Analysers::PdfProperties.new.call(@content)
49
32
  end
50
33
 
51
- def pdf_page_number page_number, spreads
52
- return 1
34
+ def convert_command
35
+ "convert -alpha deactivate -background white -colorspace sRGB -density #{@density}x#{@density} -define pdf:use-cropbox=true -define pdf:use-trimbox=true"
53
36
  end
54
37
 
55
- def pdf_crop_args page_number, spreads
56
- return
38
+ def pdf_page_number
39
+ @page_number - 1
57
40
  end
58
-
59
41
  end
60
42
  end
61
43
  end
@@ -1,20 +1,17 @@
1
1
  module DragonflyPdf
2
2
  module Processors
3
3
  class SubsetFonts
4
-
5
4
  def call content, opts={}
6
5
  content.shell_update(ext: :pdf) do |old_path, new_path|
7
- "#{gs_command} -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSubsetFonts=true -o #{new_path} -f #{old_path}"
6
+ "#{gs_command} -o #{new_path} -f #{old_path}"
8
7
  end
9
8
  end
10
9
 
11
-
12
10
  private # =============================================================
13
11
 
14
12
  def gs_command
15
- 'gs'
13
+ "gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSubsetFonts=true"
16
14
  end
17
-
18
15
  end
19
16
  end
20
17
  end
@@ -1,3 +1,3 @@
1
1
  module DragonflyPdf
2
- VERSION = "0.0.6"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/dragonfly_pdf.rb CHANGED
@@ -1,3 +1,2 @@
1
1
  require "dragonfly_pdf/plugin"
2
-
3
- require "dragonfly_pdf/version"
2
+ require "dragonfly_pdf/version"
Binary file
@@ -3,235 +3,56 @@ require 'test_helper'
3
3
  module DragonflyPdf
4
4
  module Analysers
5
5
  describe PdfProperties do
6
-
7
6
  let(:app) { test_app.configure_with(:pdf) }
8
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')) }
9
10
 
10
- let(:single_pages) { app.fetch_file(SAMPLES_DIR.join('sample_pages.pdf')) }
11
- let(:spreads) { app.fetch_file(SAMPLES_DIR.join('sample_spreads.pdf')) }
12
- let(:spreads_back) { app.fetch_file(SAMPLES_DIR.join('sample_spreads_back.pdf')) }
13
- let(:spreads_cover) { app.fetch_file(SAMPLES_DIR.join('sample_spreads_cover.pdf')) }
14
- let(:spreads_cover_back) { app.fetch_file(SAMPLES_DIR.join('sample_spreads_cover_back.pdf')) }
15
-
16
- before do
17
- spreads.meta['spreads'] = true
18
- spreads_cover.meta['spreads'] = true
19
- spreads_back.meta['spreads'] = true
20
- spreads_cover_back.meta['spreads'] = true
21
- end
22
-
23
- describe 'call' do
24
- let(:pdf_properties) { analyser.call(single_pages) }
11
+ # =====================================================================
25
12
 
26
- it 'returns Hash' do
27
- pdf_properties.must_be_kind_of Hash
28
- end
13
+ it 'returns Hash' do
14
+ analyser.call(sample_pages).must_be_kind_of Hash
29
15
  end
30
16
 
31
- # ---------------------------------------------------------------------
32
-
33
17
  describe '#page_numbers' do
34
- describe 'for single page PDF' do
35
- it 'returns one-dimensional array' do
36
- analyser.call(single_pages)[:page_numbers].must_equal [1,2,3,4,5,6,7,8,9,10]
37
- end
38
- end
39
-
40
- describe 'for PDF with spreads' do
41
- it 'returns two-dimensional array' do
42
- analyser.call(spreads)[:page_numbers].must_equal [[1,2],[3,4],[5,6],[7,8]]
43
- end
44
- end
45
-
46
- describe 'for PDF with spreads and a cover' do
47
- it 'returns two-dimensional array' do
48
- analyser.call(spreads_cover)[:page_numbers].must_equal [[1],[2,3],[4,5],[6,7],[8,9]]
49
- end
50
- end
51
-
52
- describe 'for PDF with spreads and a back cover' do
53
- it 'returns two-dimensional array' do
54
- analyser.call(spreads_back)[:page_numbers].must_equal [[1,2],[3,4],[5,6],[7,8],[9]]
55
- end
56
- end
57
-
58
- describe 'for PDF with spreads and a front and a back cover' do
59
- it 'returns two-dimensional array' do
60
- analyser.call(spreads_cover_back)[:page_numbers].must_equal [[1],[2,3],[4,5],[6,7],[8,9],[10]]
61
- end
18
+ it 'returns one-dimensional array' do
19
+ analyser.call(sample_pages)[:page_numbers].must_equal (1..10).to_a
62
20
  end
63
21
  end
64
22
 
65
- # ---------------------------------------------------------------------
66
-
67
23
  describe '#page_count' do
68
- describe 'for single page PDF' do
69
- it 'returns correct page count' do
70
- analyser.call(single_pages)[:page_count].must_equal 10
71
- end
72
- end
73
-
74
- describe 'for PDF with spreads' do
75
- it 'returns correct page count' do
76
- analyser.call(spreads)[:page_count].must_equal 8
77
- end
78
- end
79
-
80
- describe 'for PDF with spreads and a cover' do
81
- it 'returns correct page count' do
82
- analyser.call(spreads_cover)[:page_count].must_equal 9
83
- end
84
- end
85
-
86
- describe 'for PDF with spreads and a back cover' do
87
- it 'returns correct page count' do
88
- analyser.call(spreads_back)[:page_count].must_equal 9
89
- end
90
- end
91
-
92
- describe 'for PDF with spreads and a front and a back cover' do
93
- it 'returns correct page count' do
94
- analyser.call(spreads_cover_back)[:page_count].must_equal 10
95
- end
24
+ it 'returns correct page count' do
25
+ analyser.call(sample_pages)[:page_count].must_equal 10
96
26
  end
97
27
  end
98
28
 
99
- # ---------------------------------------------------------------------
100
-
101
- describe '#spread_count' do
102
- describe 'for single page PDF' do
103
- it 'returns correct page count' do
104
- analyser.call(single_pages)[:spread_count].must_equal 0
105
- end
106
- end
107
-
108
- describe 'for PDF with spreads' do
109
- it 'returns correct page count' do
110
- analyser.call(spreads)[:spread_count].must_equal 4
111
- end
112
- end
113
-
114
- describe 'for PDF with spreads and a cover' do
115
- it 'returns correct page count' do
116
- analyser.call(spreads_cover)[:spread_count].must_equal 5
117
- end
118
- end
119
-
120
- describe 'for PDF with spreads and a back cover' do
121
- it 'returns correct page count' do
122
- analyser.call(spreads_back)[:spread_count].must_equal 5
123
- end
124
- end
125
-
126
- describe 'for PDF with spreads and a front and a back cover' do
127
- it 'returns correct page count' do
128
- analyser.call(spreads_cover_back)[:spread_count].must_equal 6
129
- end
29
+ describe '#page_dimensions' do
30
+ it 'returns widths' do
31
+ analyser.call(sample_pages)[:page_dimensions].map{ |p| p.map(&:round) }.must_equal [[210, 297]].cycle.take(10)
32
+ analyser.call(sample_pages_with_bleed)[:page_dimensions].map{ |p| p.map(&:round) }.must_equal [[210, 297]].cycle.take(10)
130
33
  end
131
34
  end
132
35
 
133
- # ---------------------------------------------------------------------
134
-
135
36
  describe '#widths' do
136
- describe 'for single page PDF' do
137
- it 'returns widths' do
138
- analyser.call(single_pages)[:widths].must_equal [210.0, 210.0, 210.0, 210.0, 210.0, 210.0, 210.0, 210.0, 210.0, 210.0]
139
- end
140
- end
141
-
142
- describe 'for PDF with spreads' do
143
- it 'returns widths' do
144
- analyser.call(spreads)[:widths].must_equal [[210.0, 210.0], [210.0, 210.0], [210.0, 210.0], [210.0, 210.0]]
145
- end
146
- end
147
-
148
- describe 'for PDF with spreads and a cover' do
149
- it 'returns correct widths' do
150
- analyser.call(spreads_cover)[:widths].must_equal [[210.0], [210.0, 210.0], [210.0, 210.0], [210.0, 210.0], [210.0, 210.0]]
151
- end
152
- end
153
-
154
- describe 'for PDF with spreads and a back cover' do
155
- it 'returns correct widths' do
156
- analyser.call(spreads_back)[:widths].must_equal [[210.0, 210.0], [210.0, 210.0], [210.0, 210.0], [210.0, 210.0], [210.0]]
157
- end
158
- end
159
-
160
- describe 'for PDF with spreads and a front and a back cover' do
161
- it 'returns correct widths' do
162
- analyser.call(spreads_cover_back)[:widths].must_equal [[210.0], [210.0, 210.0], [210.0, 210.0], [210.0, 210.0], [210.0, 210.0], [210.0]]
163
- end
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(10)
164
40
  end
165
41
  end
166
42
 
167
- # ---------------------------------------------------------------------
168
-
169
43
  describe '#heights' do
170
- describe 'for single page PDF' do
171
- it 'returns heights' do
172
- analyser.call(single_pages)[:heights].must_equal [297.0, 297.0, 297.0, 297.0, 297.0, 297.0, 297.0, 297.0, 297.0, 297.0]
173
- end
174
- end
175
-
176
- describe 'for PDF with spreads' do
177
- it 'returns heights' do
178
- analyser.call(spreads)[:heights].must_equal [[297.0, 297.0], [297.0, 297.0], [297.0, 297.0], [297.0, 297.0]]
179
- end
180
- end
181
-
182
- describe 'for PDF with spreads and a cover' do
183
- it 'returns correct heights' do
184
- analyser.call(spreads_cover)[:heights].must_equal [[297.0], [297.0, 297.0], [297.0, 297.0], [297.0, 297.0], [297.0, 297.0]]
185
- end
186
- end
187
-
188
- describe 'for PDF with spreads and a back cover' do
189
- it 'returns correct heights' do
190
- analyser.call(spreads_back)[:heights].must_equal [[297.0, 297.0], [297.0, 297.0], [297.0, 297.0], [297.0, 297.0], [297.0]]
191
- end
192
- end
193
-
194
- describe 'for PDF with spreads and a front and a back cover' do
195
- it 'returns correct heights' do
196
- analyser.call(spreads_cover_back)[:heights].must_equal [[297.0], [297.0, 297.0], [297.0, 297.0], [297.0, 297.0], [297.0, 297.0], [297.0]]
197
- end
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(10)
198
47
  end
199
48
  end
200
49
 
201
- # ---------------------------------------------------------------------
202
-
203
50
  describe '#aspect_ratios' do
204
- describe 'for single page PDF' do
205
- it 'returns aspect ratios' do
206
- analyser.call(single_pages)[:aspect_ratios].map{ |i| i.round(2) }.must_equal [0.71, 0.71, 0.71, 0.71, 0.71, 0.71, 0.71, 0.71, 0.71, 0.71]
207
- end
208
- end
209
-
210
- describe 'for PDF with spreads' do
211
- it 'returns aspect ratios' do
212
- analyser.call(spreads)[:aspect_ratios].map{ |i| i.is_a?(Array) ? i.map{ |j| j.round(2) } : i.round(2) }.must_equal [[0.71, 0.71], [0.71, 0.71], [0.71, 0.71], [0.71, 0.71]]
213
- end
214
- end
215
-
216
- describe 'for PDF with spreads and a cover' do
217
- it 'returns correct aspect ratios' do
218
- analyser.call(spreads_cover)[:aspect_ratios].map{ |i| i.is_a?(Array) ? i.map{ |j| j.round(2) } : i.round(2) }.must_equal [[0.71], [0.71, 0.71], [0.71, 0.71], [0.71, 0.71], [0.71, 0.71]]
219
- end
220
- end
221
-
222
- describe 'for PDF with spreads and a back cover' do
223
- it 'returns correct aspect ratios' do
224
- analyser.call(spreads_back)[:aspect_ratios].map{ |i| i.is_a?(Array) ? i.map{ |j| j.round(2) } : i.round(2) }.must_equal [[0.71, 0.71], [0.71, 0.71], [0.71, 0.71], [0.71, 0.71], [0.71]]
225
- end
226
- end
227
-
228
- describe 'for PDF with spreads and a front and a back cover' do
229
- it 'returns correct aspect ratios' do
230
- analyser.call(spreads_cover_back)[:aspect_ratios].map{ |i| i.is_a?(Array) ? i.map{ |j| j.round(2) } : i.round(2) }.must_equal [[0.71], [0.71, 0.71], [0.71, 0.71], [0.71, 0.71], [0.71, 0.71], [0.71]]
231
- end
51
+ it 'returns aspect ratios' do
52
+ analyser.call(sample_pages)[:aspect_ratios].map{ |i| i.round(2) }.must_equal [0.71].cycle.take(10)
53
+ analyser.call(sample_pages_with_bleed)[:aspect_ratios].map{ |i| i.round(2) }.must_equal [0.71].cycle.take(10)
232
54
  end
233
55
  end
234
-
235
56
  end
236
57
  end
237
58
  end
@@ -2,7 +2,6 @@ require 'test_helper'
2
2
 
3
3
  module DragonflyPdf
4
4
  describe Plugin do
5
-
6
5
  let(:app) { test_app.configure_with(:pdf) }
7
6
  let(:pdf) { app.fetch_file(SAMPLES_DIR.join('sample_pages.pdf')) }
8
7
 
@@ -12,30 +11,34 @@ module DragonflyPdf
12
11
  it 'adds #pdf_properties' do
13
12
  pdf.must_respond_to :pdf_properties
14
13
  end
14
+
15
15
  it 'allows an options parameter on #pdf_properties' do
16
16
  pdf.pdf_properties.must_be_kind_of Hash
17
17
  end
18
+
18
19
  it 'adds #page_count' do
19
20
  pdf.must_respond_to :page_count
20
21
  end
21
- it 'adds #spread_count' do
22
- pdf.must_respond_to :spread_count
23
- end
22
+
24
23
  it 'adds #page_numbers' do
25
24
  pdf.must_respond_to :page_numbers
26
25
  end
26
+
27
+ it 'adds #page_dimensions' do
28
+ pdf.must_respond_to :page_dimensions
29
+ end
30
+
27
31
  it 'adds #widths' do
28
32
  pdf.must_respond_to :widths
29
33
  end
34
+
30
35
  it 'adds #heights' do
31
36
  pdf.must_respond_to :heights
32
37
  end
38
+
33
39
  it 'adds #aspect_ratios' do
34
40
  pdf.must_respond_to :aspect_ratios
35
41
  end
36
- it 'adds #info' do
37
- pdf.must_respond_to :info
38
- end
39
42
  end
40
43
 
41
44
  # ---------------------------------------------------------------------
@@ -48,6 +51,5 @@ module DragonflyPdf
48
51
  pdf.must_respond_to :page_thumb
49
52
  end
50
53
  end
51
-
52
54
  end
53
- end
55
+ end
@@ -4,88 +4,36 @@ require 'pdf-reader'
4
4
  module DragonflyPdf
5
5
  module Processors
6
6
  describe Page do
7
-
8
7
  let(:app) { test_app.configure_with(:pdf) }
9
8
  let(:processor) { DragonflyPdf::Processors::Page.new }
10
-
11
- let(:single_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
12
- let(:spreads) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_spreads.pdf')) }
13
- let(:spreads_back) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_spreads_back.pdf')) }
14
- let(:spreads_cover) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_spreads_cover.pdf')) }
15
- let(:spreads_cover_back) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_spreads_cover_back.pdf')) }
16
-
17
- before do
18
- spreads.meta['spreads'] = true
19
- spreads_cover.meta['spreads'] = true
20
- spreads_back.meta['spreads'] = true
21
- spreads_cover_back.meta['spreads'] = true
22
- end
9
+ let(:sample_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
23
10
 
24
11
  # =====================================================================
25
12
 
26
13
  it 'returns PDF by default' do
27
- processor.call(single_pages, 1)
28
- get_mime_type(single_pages.path).must_include "application/pdf"
14
+ processor.call(sample_pages, 1)
15
+ get_mime_type(sample_pages.path).must_include 'application/pdf'
29
16
  end
30
17
 
31
18
  it 'raises PageNotFound error' do
32
- proc { processor.call(single_pages, 0) }.must_raise DragonflyPdf::PageNotFound
33
- proc { processor.call(single_pages, 11) }.must_raise DragonflyPdf::PageNotFound
19
+ proc { processor.call(sample_pages, 0) }.must_raise DragonflyPdf::PageNotFound
20
+ proc { processor.call(sample_pages, 11) }.must_raise DragonflyPdf::PageNotFound
34
21
  end
35
22
 
36
- # ---------------------------------------------------------------------
37
-
38
23
  describe 'single pages' do
39
24
  it 'renders page' do
40
- processor.call(single_pages, 1)
41
- pdf = PDF::Reader.new(single_pages.path)
25
+ processor.call(sample_pages, 1)
26
+ pdf = PDF::Reader.new(sample_pages.path)
42
27
  pdf.pages.count.must_equal 1
43
28
  pdf.pages.first.text.must_equal '1'
44
29
  end
45
30
  end
46
31
 
47
- describe 'spreads' do
48
- it 'recalculates the page number correctly' do
49
- processor.call(spreads, 8, spreads: true)
50
- pdf = PDF::Reader.new(spreads.path)
51
- pdf.pages.count.must_equal 1
52
- pdf.pages.first.text.must_include '8'
53
- end
54
- end
55
-
56
- describe 'spreads_back' do
57
- it 'recalculates the page number correctly' do
58
- processor.call(spreads_back, 9, spreads: true)
59
- pdf = PDF::Reader.new(spreads_back.path)
60
- pdf.pages.count.must_equal 1
61
- pdf.pages.first.text.must_include '9'
62
- end
63
- end
64
-
65
- describe 'spreads_cover' do
66
- it 'recalculates the page number correctly' do
67
- processor.call(spreads_cover, 9, spreads: true)
68
- pdf = PDF::Reader.new(spreads_cover.path)
69
- pdf.pages.count.must_equal 1
70
- pdf.pages.first.text.must_include '9'
71
- end
72
- end
73
-
74
- describe 'spreads_cover_back' do
75
- it 'recalculates the page number correctly' do
76
- processor.call(spreads_cover_back, 10, spreads: true)
77
- pdf = PDF::Reader.new(spreads_cover_back.path)
78
- pdf.pages.count.must_equal 1
79
- pdf.pages.first.text.must_include '10'
80
- end
81
- end
82
-
83
32
  # ---------------------------------------------------------------------
84
33
 
85
- def get_mime_type file_path
86
- `file --mime-type #{file_path}`.gsub(/\n/, "")
34
+ def get_mime_type(file_path)
35
+ `file --mime-type #{file_path}`.gsub(/\n/, '')
87
36
  end
88
-
89
37
  end
90
38
  end
91
39
  end
@@ -4,78 +4,31 @@ require 'pdf-reader'
4
4
  module DragonflyPdf
5
5
  module Processors
6
6
  describe PageThumb do
7
-
8
7
  let(:app) { test_app.configure_with(:pdf) }
9
8
  let(:processor) { DragonflyPdf::Processors::PageThumb.new }
10
-
11
- let(:single_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
12
- let(:spreads) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_spreads.pdf')) }
13
- let(:spreads_back) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_spreads_back.pdf')) }
14
- let(:spreads_cover) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_spreads_cover.pdf')) }
15
- let(:spreads_cover_back) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_spreads_cover_back.pdf')) }
16
-
17
- before do
18
- spreads.meta['spreads'] = true
19
- spreads_cover.meta['spreads'] = true
20
- spreads_back.meta['spreads'] = true
21
- spreads_cover_back.meta['spreads'] = true
22
- end
9
+ let(:sample_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
23
10
 
24
11
  # =====================================================================
25
12
 
26
13
  it 'returns PNG by default' do
27
- processor.call(single_pages, 1, density: 72)
28
- get_mime_type(single_pages.path).must_include "image/png"
14
+ processor.call(sample_pages, 1, density: 72)
15
+ get_mime_type(sample_pages.path).must_include 'image/png'
29
16
  end
30
17
 
31
18
  it 'raises PageNotFound error' do
32
- proc { processor.call(single_pages, 0) }.must_raise DragonflyPdf::PageNotFound
33
- proc { processor.call(single_pages, 11) }.must_raise DragonflyPdf::PageNotFound
34
- end
35
-
36
- # ---------------------------------------------------------------------
37
-
38
- describe 'single pages' do
39
- it 'renders page' do
40
- skip
41
- processor.call(single_pages, 1, density: 72)
42
- end
19
+ proc { processor.call(sample_pages, 0) }.must_raise DragonflyPdf::PageNotFound
20
+ proc { processor.call(sample_pages, 11) }.must_raise DragonflyPdf::PageNotFound
43
21
  end
44
22
 
45
- describe 'spreads' do
46
- it 'recalculates the page number correctly' do
47
- skip
48
- processor.call(spreads, 3, density: 72, spreads: true)
49
- end
50
- end
51
-
52
- describe 'spreads_back' do
53
- it 'recalculates the page number correctly' do
54
- skip
55
- processor.call(spreads_back, 3, density: 72, spreads: true)
56
- end
57
- end
58
-
59
- describe 'spreads_cover' do
60
- it 'recalculates the page number correctly' do
61
- skip
62
- processor.call(spreads_cover, 3, density: 72, spreads: true)
63
- end
64
- end
65
-
66
- describe 'spreads_cover_back' do
67
- it 'recalculates the page number correctly' do
68
- skip
69
- processor.call(spreads_cover_back, 3, density: 72, spreads: true)
70
- end
23
+ it 'renders page' do
24
+ processor.call(sample_pages, 1, density: 72)
71
25
  end
72
26
 
73
27
  # ---------------------------------------------------------------------
74
28
 
75
- def get_mime_type file_path
76
- `file --mime-type #{file_path}`.gsub(/\n/, "")
29
+ def get_mime_type(file_path)
30
+ `file --mime-type #{file_path}`.gsub(/\n/, '')
77
31
  end
78
-
79
32
  end
80
33
  end
81
- end
34
+ end
@@ -1,17 +1,15 @@
1
1
  module DragonflyPdf
2
2
  module Processors
3
3
  describe SubsetFonts do
4
-
5
4
  let(:app) { test_app.configure_with(:pdf) }
6
5
  let(:processor) { DragonflyPdf::Processors::SubsetFonts.new }
7
-
8
- let(:sample_pdf) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
6
+ let(:sample_pages) { Dragonfly::Content.new(app, SAMPLES_DIR.join('sample_pages.pdf')) }
9
7
 
10
8
  # =====================================================================
11
9
 
12
10
  it 'returns PDF by default' do
13
- processor.call(sample_pdf, 1)
14
- get_mime_type(sample_pdf.path).must_include "application/pdf"
11
+ processor.call(sample_pages, 1)
12
+ get_mime_type(sample_pages.path).must_include "application/pdf"
15
13
  end
16
14
 
17
15
  private # =============================================================
@@ -19,7 +17,6 @@ module DragonflyPdf
19
17
  def get_mime_type file_path
20
18
  `file --mime-type #{file_path}`.gsub(/\n/, "")
21
19
  end
22
-
23
20
  end
24
21
  end
25
22
  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.0.6
4
+ version: 0.1.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: 2015-12-14 00:00:00.000000000 Z
11
+ date: 2015-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dragonfly
@@ -28,30 +28,30 @@ dependencies:
28
28
  name: pdf-reader
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
34
- type: :runtime
33
+ version: '0'
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: '1.3'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.6'
47
+ version: '1.7'
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.6'
54
+ version: '1.7'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -116,6 +116,8 @@ extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
118
  - ".gitignore"
119
+ - ".travis.yml"
120
+ - CHANGELOG.md
119
121
  - Gemfile
120
122
  - Guardfile
121
123
  - LICENSE
@@ -131,10 +133,7 @@ files:
131
133
  - lib/dragonfly_pdf/processors/subset_fonts.rb
132
134
  - lib/dragonfly_pdf/version.rb
133
135
  - samples/sample_pages.pdf
134
- - samples/sample_spreads.pdf
135
- - samples/sample_spreads_back.pdf
136
- - samples/sample_spreads_cover.pdf
137
- - samples/sample_spreads_cover_back.pdf
136
+ - samples/sample_pages_with_bleed.pdf
138
137
  - test/dragonfly_pdf/analysers/pdf_properties_test.rb
139
138
  - test/dragonfly_pdf/plugin_test.rb
140
139
  - test/dragonfly_pdf/processors/page_test.rb
Binary file
Binary file
Binary file
Binary file