pdftoimage 0.1.1 → 0.1.2

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.
@@ -1,4 +1,9 @@
1
- === 0.1.0 / 2010-11-08
1
+ === 0.1.2 / 2010-11-11
2
+ * Added support for blocks upon opening a PDF
3
+ * Image objects now support the "quality" method for JPEG/MIFF/PNG compression levels.
4
+ * PDF conversion is now deferred until saving. This greatly speeds up the conversion process in cases where you only want a few pages out of a large document converted.
5
+
6
+ === 0.1.1 / 2010-11-10
2
7
 
3
8
  * Initial release:
4
9
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pdftoimage (0.1.1)
4
+ pdftoimage (0.1.2)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -3,10 +3,11 @@ summary: "A ruby gem for converting PDF documents into a series of images."
3
3
  description: "A ruby gem for converting PDF documents into a series of images. This module is based off poppler_utils and ImageMagick."
4
4
  license: MIT
5
5
  authors: Rob Flynn
6
- homepage: http://rubygems.org/gems/pdftoimage
6
+ homepage: https://github.com/robflynn/pdftoimage
7
7
  email: rob@thingerly.com
8
8
  has_yard: true
9
9
 
10
10
  development_dependencies:
11
11
  bundler: ~> 1.0.0
12
12
  yard: ~> 0.6.0
13
+
@@ -30,33 +30,75 @@ module PDFToImage
30
30
  #
31
31
  # @param [filename] The filename of the PDF to open
32
32
  # @return [Array] An array of images
33
- def open(filename)
34
- target_path = random_filename
35
-
33
+ def open(filename, &block)
36
34
  if not File.exists?(filename)
37
35
  raise PDFError, "File '#{filename}' not found."
38
36
  end
39
37
 
40
- cmd = "pdftoppm -png #{filename} #{target_path}"
38
+ pages = page_count(filename)
39
+
40
+ # Array of images
41
+ images = []
42
+
43
+ 1.upto(pages) { |n|
44
+ dimensions = page_size(filename, n)
45
+ image = Image.new(filename, random_filename, n, dimensions)
46
+ images << image
47
+ }
48
+
49
+ images.each(&block) if block_given?
50
+
51
+ return images
41
52
 
42
- `#{cmd}`
53
+ end
54
+
55
+ # Executes the specified command, returning the output.
56
+ #
57
+ # @param [cmd] The command to run
58
+ # @return [String] The output of the command
59
+ def exec(cmd, error = nil)
60
+ output = `#{cmd}`
43
61
  if $? != 0
44
- raise PDFError, "Error reading PDF."
62
+ if error == nil
63
+ raise PDFError, "Error executing command: #{cmd}"
64
+ else
65
+ raise PDFError, error
66
+ end
45
67
  end
46
68
 
47
- pngs = Dir.glob("#{target_path}*.png")
69
+ return output
70
+ end
48
71
 
49
- images = []
72
+ private
50
73
 
51
- pngs.each do |png|
52
- image = Image.new(png)
53
- images << image
74
+ def page_size(filename, page)
75
+ cmd = "pdfinfo -f #{page} -l #{page} #{filename}"
76
+ output = exec(cmd)
77
+
78
+ matches = /^Page.*?size:.*?(\d+).*?(\d+)/.match(output)
79
+ if matches.nil?
80
+ raise PDFError, "Unable to determine page size."
54
81
  end
55
82
 
56
- return images.sort!
83
+ scale = 2.08333333333333333
84
+ dimension = {
85
+ :width => (matches[1].to_i * scale).to_i,
86
+ :height => (matches[2].to_i * scale).to_i
87
+ }
88
+
89
+ dimension
57
90
  end
58
91
 
59
- private
92
+ def page_count(filename)
93
+ cmd = "pdfinfo #{filename}"
94
+ output = exec(cmd)
95
+ matches = /^Pages:.*?(\d+)$/.match(output)
96
+ if matches.nil?
97
+ raise PDFError, "Error determining page count."
98
+ end
99
+
100
+ return matches[1].to_i
101
+ end
60
102
 
61
103
  # Generate a random file name in the system's tmp folder
62
104
  def random_filename
@@ -1,17 +1,20 @@
1
1
  module PDFToImage
2
2
 
3
+ # A class which is instantiated by PDFToImage when a PDF document
4
+ # is opened.
3
5
  class Image
6
+ attr_reader :pdf_name
4
7
  attr_reader :filename
5
8
  attr_reader :width
6
9
  attr_reader :height
7
- attr_reader :format
8
10
  attr_reader :page
9
11
  attr_reader :args
12
+ attr_reader :opened
10
13
 
11
- # We currently only support resizing, as that's all I need at the moment
12
- # selfish, but I need to return to the main project
14
+ # ImageMagick methods that we currently support.
13
15
  CUSTOM_IMAGE_METHODS = [
14
- "resize"
16
+ "resize",
17
+ "quality"
15
18
  ]
16
19
 
17
20
  CUSTOM_IMAGE_METHODS.each do |method|
@@ -25,20 +28,16 @@ module PDFToImage
25
28
  # Image constructor
26
29
  #
27
30
  # @param [filename] The name of the image file to open
28
- def initialize(filename)
31
+ def initialize(pdf_name, filename, page, page_size)
29
32
  @args = []
30
33
 
34
+ @pdf_name = pdf_name
31
35
  @filename = filename
36
+ @opened = false
37
+ @width = page_size[:width]
38
+ @height = page_size[:height]
32
39
 
33
- info = identify()
34
-
35
- @width = info[:width]
36
- @height = info[:height]
37
- @format = info[:format]
38
-
39
- tmp_base = File.basename(filename, File.extname(filename))
40
- pieces = tmp_base.split('-')
41
- @page = pieces[-1].to_i
40
+ @page = page
42
41
  end
43
42
 
44
43
  # Saves the converted image to the specified location
@@ -46,6 +45,9 @@ module PDFToImage
46
45
  # @param [outname] The output filename of the image
47
46
  #
48
47
  def save(outname)
48
+
49
+ generate_temp_file
50
+
49
51
  cmd = "convert "
50
52
 
51
53
  if not @args.empty?
@@ -54,10 +56,7 @@ module PDFToImage
54
56
 
55
57
  cmd += "#{@filename} #{outname}"
56
58
 
57
- `#{cmd}`
58
- if $? != 0
59
- raise PDFError, "Error converting file: #{cmd}"
60
- end
59
+ PDFToImage::exec(cmd)
61
60
 
62
61
  return true
63
62
  end
@@ -74,22 +73,15 @@ module PDFToImage
74
73
 
75
74
  private
76
75
 
77
- def identify
78
- cmd = "identify #{@filename}"
79
-
80
- result = `#{cmd}`
81
- unless $?.success?
82
- raise PDFToImage::PDFError, "Error executing #{cmd}"
76
+ def generate_temp_file
77
+ if @opened == false
78
+ cmd = "pdftoppm -png -f #{@page} -l #{@page} #{@pdf_name} #{@filename}"
79
+ PDFToImage::exec(cmd)
80
+ @filename = "#{@filename}-#{@page}.png"
81
+ @opened = true
83
82
  end
84
83
 
85
- info = result.strip.split(' ')
86
- dimensions = info[2].split('x')
87
-
88
- return {
89
- :format => info[1],
90
- :width => dimensions[0],
91
- :height => dimensions[1]
92
- }
84
+ return true
93
85
  end
94
86
 
95
87
  end
@@ -1,4 +1,4 @@
1
1
  module PDFToImage
2
2
  # pdftoimage version
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.2"
4
4
  end
@@ -19,13 +19,21 @@ describe PDFToImage do
19
19
  File.unlink('spec/tmp.jpg')
20
20
  end
21
21
 
22
- it "should allow resizing" do
22
+ it "should allow resizing and quality control" do
23
23
  @pages = PDFToImage.open('spec/3pages.pdf')
24
- @pages[0].resize('50%').save('spec/tmp2.jpg')
24
+ @pages[0].resize('50%').quality('80%').save('spec/tmp2.jpg')
25
25
  File.exists?('spec/tmp2.jpg').should equal true
26
26
  File.unlink('spec/tmp2.jpg')
27
27
  end
28
28
 
29
+ it "should work with blocks" do
30
+ counter = 0
31
+ PDFToImage.open("spec/3pages.pdf") do |page|
32
+ counter = counter + 1
33
+ end
34
+ counter.should equal 3
35
+ end
36
+
29
37
 
30
38
  end
31
39
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdftoimage
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 1
10
- version: 0.1.1
9
+ - 2
10
+ version: 0.1.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Rob Flynn
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-10 00:00:00 +00:00
18
+ date: 2010-11-11 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -80,7 +80,7 @@ files:
80
80
  - spec/pdftoimage_spec.rb
81
81
  - .document
82
82
  has_rdoc: yard
83
- homepage: http://rubygems.org/gems/pdftoimage
83
+ homepage: https://github.com/robflynn/pdftoimage
84
84
  licenses:
85
85
  - MIT
86
86
  post_install_message: