img_to_pdf 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5dde70fccbb8aca8711e4ba1b6542fd1e1b7e6a9a95d86366adba0c10edb00e1
4
+ data.tar.gz: c84bba32cd8bb79d6656853045ff3a5f2654b57072c656ad545a3e62e5f26117
5
+ SHA512:
6
+ metadata.gz: d24a1be432c7f643ba5b6253deb239cd81e8fc94a77d458e312a46834a1b11b3e2e2f92add210b7aab90862be63cb8ada194b9ca5c05bac1422eec3f6eac1533
7
+ data.tar.gz: 4d9213f55e4417485266ade0c7deabd5053dcf9bda9f0e39094a8004635ed5dfacbaffaafc523cecfe667e527601d5f70376394ed48365165bdfe47504c2f43c
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2020 Yuya.Nishida.
2
+
3
+ X11 License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,54 @@
1
+ # img_to_pdf
2
+
3
+ A tool to create PDF from raster image.
4
+
5
+ [![License X11](https://img.shields.io/badge/license-X11-brightgreen.svg)](https://raw.githubusercontent.com/nishidayuya/img_to_pdf/master/LICENSE.txt)
6
+
7
+ ## Requirements
8
+
9
+ * Ruby
10
+ * ImageMagick
11
+
12
+ ## Installation
13
+
14
+ ```sh
15
+ $ gem install img_to_pdf
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ Create PDF from PNG:
21
+
22
+ ```sh
23
+ $ img_to_pdf input.png output.pdf
24
+ ```
25
+
26
+ Same as:
27
+
28
+ ```sh
29
+ $ img_to_pdf \
30
+ --paper-size=a4-landscape \
31
+ --horizontal-pages=1 \
32
+ --vertical-pages=1 \
33
+ input.png output.pdf
34
+ ```
35
+
36
+ Create 3x4 pages B5 portrait PDF from JPG:
37
+
38
+ ```
39
+ $ img_to_pdf \
40
+ --paper-size=b5-portrait \
41
+ --horizontal-pages=3 \
42
+ --vertical-pages=4 \
43
+ input.jpg output.pdf
44
+ ```
45
+
46
+ Show help message:
47
+
48
+ ```
49
+ $ img_to_pdf --help
50
+ ```
51
+
52
+ ## Contributing
53
+
54
+ Bug reports and pull requests are welcome on GitHub at https://github.com/nishidayuya/img_to_pdf .
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.test_files = FileList["test/**/*_test.rb"]
7
+ end
8
+
9
+ task(default: %i[test])
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "img_to_pdf"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "img_to_pdf"
4
+
5
+ ImgToPdf::Cli.run(ARGV)
@@ -0,0 +1,35 @@
1
+ require "pathname"
2
+
3
+ require_relative 'lib/img_to_pdf/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "img_to_pdf"
7
+ spec.version = ImgToPdf::VERSION
8
+ spec.authors = ["Yuya.Nishida."]
9
+ spec.email = ["yuya@j96.org"]
10
+
11
+ spec.summary = (Pathname(__dir__) / "README.md").each_line(chomp: true).
12
+ lazy.grep_v(/\A\s*\z|\A\#/).first
13
+ spec.description = spec.summary
14
+ spec.homepage = "https://github.com/nishidayuya/" + spec.name
15
+ spec.license = "X11"
16
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
17
+
18
+ spec.metadata["homepage_uri"] = spec.homepage
19
+ spec.metadata["source_code_uri"] = spec.homepage
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ end
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_runtime_dependency "prawn"
31
+ spec.add_runtime_dependency "mini_magick"
32
+
33
+ spec.add_development_dependency "rake"
34
+ spec.add_development_dependency "test-unit"
35
+ end
@@ -0,0 +1,15 @@
1
+ require "pathname"
2
+
3
+ module ImgToPdf
4
+ autoload(:VERSION, "img_to_pdf/version")
5
+
6
+ # set autoload
7
+ lib_path = Pathname(__dir__)
8
+ Pathname.glob(lib_path / "img_to_pdf/*.rb").sort.each do |path|
9
+ no_ext_path = path.relative_path_from(lib_path).sub_ext("")
10
+ class_name = no_ext_path.basename.to_s.
11
+ split("_").map(&:capitalize).join.to_sym
12
+ next if class_name == :Version
13
+ autoload(class_name, no_ext_path.to_s)
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ require "tmpdir"
2
+
3
+ require "img_to_pdf"
4
+
5
+ module ImgToPdf::Cli
6
+ extend self
7
+
8
+ def run(argv)
9
+ option = ImgToPdf::CliOption.from_argv(argv)
10
+ page_dimension_pt = ImgToPdf::PaperSizeParser.(option.paper_size_text)
11
+ input_image = ImgToPdf::Image.from_path(option.input_path)
12
+ document = ImgToPdf::FitPageDocument.create(
13
+ page_dimension_pt: page_dimension_pt,
14
+ margin_pt: option.margin_pt,
15
+ n_horizontal_pages: option.n_horizontal_pages,
16
+ n_vertical_pages: option.n_vertical_pages,
17
+ image: input_image,
18
+ )
19
+ document.render_file(option.output_path)
20
+ rescue ImgToPdf::Error => e
21
+ raise if option.debug
22
+ STDERR.puts("#{e.class.name}: #{e.message}")
23
+ exit(1)
24
+ end
25
+ end
@@ -0,0 +1,68 @@
1
+ require "optparse"
2
+
3
+ require "img_to_pdf"
4
+
5
+ class ImgToPdf::CliOption < Struct.new(:input_path, :output_path, :debug,
6
+ :paper_size_text, :margin_pt,
7
+ :n_horizontal_pages, :n_vertical_pages,
8
+ keyword_init: true)
9
+ BANNER = <<EOS.chomp
10
+ Usage: #{File.basename(Process.argv0)} [options] input_image_path output_pdf_path
11
+ EOS
12
+
13
+ class << self
14
+ def default
15
+ default_margin_pt = ImgToPdf::Unit.convert_mm_to_pt(10)
16
+ return new(
17
+ input_path: nil,
18
+ output_path: nil,
19
+ debug: false,
20
+ paper_size_text: "a4-landscape",
21
+ margin_pt: ImgToPdf::Margin.new(
22
+ left: default_margin_pt,
23
+ right: default_margin_pt,
24
+ top: default_margin_pt,
25
+ bottom: default_margin_pt,
26
+ ),
27
+ n_horizontal_pages: 1,
28
+ n_vertical_pages: 1,
29
+ )
30
+ end
31
+
32
+ def from_argv(argv, stdout: STDOUT)
33
+ result = default
34
+
35
+ parser = OptionParser.new
36
+ parser.version = ImgToPdf::VERSION
37
+ parser.banner = BANNER
38
+ parser.summary_indent = ""
39
+ parser.separator("")
40
+ parser.separator("Options:")
41
+ parser.on("--paper-size=SIZE",
42
+ "specify paper size. 'a4-landscape'(default), 'b3-portrait', etc.") do |v|
43
+ result.paper_size_text = v
44
+ end
45
+ parser.on("--horizontal-pages=INTEGER",
46
+ "specify number of horizontal pages. default 1.") do |v|
47
+ result.n_horizontal_pages = ImgToPdf::IntegerParser.(v)
48
+ end
49
+ parser.on("--vertical-pages=INTEGER",
50
+ "specify number of vertical pages. default 1.") do |v|
51
+ result.n_vertical_pages = ImgToPdf::IntegerParser.(v)
52
+ end
53
+ parser.on("--debug") do
54
+ result.debug = true
55
+ end
56
+
57
+ input_path, output_path = *parser.parse(argv)
58
+ if !output_path
59
+ stdout.puts(parser.help)
60
+ exit(1)
61
+ end
62
+ result.input_path = Pathname(input_path).expand_path
63
+ result.output_path = Pathname(output_path).expand_path
64
+
65
+ return result
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,40 @@
1
+ require "img_to_pdf"
2
+
3
+ class ImgToPdf::Dimension < Struct.new(:width, :height, keyword_init: true)
4
+ class << self
5
+ # @param [Array<(Float, Float)>] ary `[width, height]`.
6
+ # @return ImgToPdf::Dimension parsed.
7
+ def from_array(ary)
8
+ return new(width: ary[0], height: ary[1])
9
+ end
10
+ end
11
+
12
+ # @return [Array<(Float, Float)>] array. `[width, height]`.
13
+ def to_a
14
+ return [width, height]
15
+ end
16
+
17
+ # @return [:landscape, :portrait] direction of dimension.
18
+ def direction
19
+ return width > height ? :landscape : :portrait
20
+ end
21
+
22
+ # @return [ImgToPdf::Dimension] transposed dimension.
23
+ def transpose
24
+ return self.class.new(width: height, height: width)
25
+ end
26
+
27
+ # @param [:landscape, :portrait] direction
28
+ # @return [ImgToPdf::Dimension] justified dimension.
29
+ def justify_direction(target_direction)
30
+ return direction == target_direction ? dup : transpose
31
+ end
32
+
33
+ # points to inches.
34
+ #
35
+ # @return [ImgToPdf::Dimension] inch dimension.
36
+ def pt_to_in
37
+ return self.class.new(width: ImgToPdf::Unit.convert_pt_to_in(width),
38
+ height: ImgToPdf::Unit.convert_pt_to_in(height))
39
+ end
40
+ end
@@ -0,0 +1,2 @@
1
+ class ImgToPdf::Error < StandardError
2
+ end
@@ -0,0 +1,92 @@
1
+ require "prawn"
2
+
3
+ require "img_to_pdf"
4
+
5
+ class ImgToPdf::FitPageDocument
6
+ # @param [ImgToPdf::Dimension] page_dimension_pt page size. points.
7
+ # @param [ImgToPdf::Margin] margin_pt margin size. points.
8
+ # @param [ImgToPdf::Image] image source image.
9
+ # @param [Integer] n_horizontal_pages number of horizontal pages.
10
+ # @param [Integer] n_vertical_pages number of vertical pages.
11
+ # @return [ImgToPdf::FitPageDocument] document to render PDF.
12
+ def self.create(page_dimension_pt:, margin_pt:, image:,
13
+ n_horizontal_pages: 1, n_vertical_pages: 1)
14
+ result = new(page_dimension_pt: page_dimension_pt, margin_pt: margin_pt,
15
+ n_horizontal_pages: n_horizontal_pages,
16
+ n_vertical_pages: n_vertical_pages,
17
+ image: image)
18
+ result.draw
19
+ return result
20
+ end
21
+
22
+ def initialize(page_dimension_pt:, margin_pt:, image:,
23
+ n_horizontal_pages:, n_vertical_pages:)
24
+ @page_dimension_pt = page_dimension_pt
25
+ @margin_pt = margin_pt
26
+ @image = image
27
+ @n_horizontal_pages = n_horizontal_pages
28
+ @n_vertical_pages = n_vertical_pages
29
+
30
+ @pdf = Prawn::Document.new(
31
+ page_size: @page_dimension_pt.to_a,
32
+ margin: @margin_pt.to_a,
33
+ skip_page_creation: true,
34
+ info: {
35
+ Creator: "img_to_pdf version #{ImgToPdf::VERSION}",
36
+ },
37
+ )
38
+ end
39
+
40
+ def draw
41
+ canvas_dimension_pt = determine_canvas_dimension_pt
42
+ canvas_scale = determine_canvas_scale(canvas_dimension_pt)
43
+ sub_image_dimension_px = ImgToPdf::Dimension.new(
44
+ width: @image.dimension_px.width / @n_horizontal_pages,
45
+ height: @image.dimension_px.height / @n_vertical_pages,
46
+ )
47
+ each_sub_image(sub_image_dimension_px) do |sub_image|
48
+ @pdf.start_new_page
49
+ @pdf.image(
50
+ sub_image.path,
51
+ scale: canvas_scale,
52
+ at: [0, canvas_dimension_pt.height / @n_vertical_pages],
53
+ )
54
+ end
55
+ end
56
+
57
+ # @param [Pathname] output_path path to PDF output.
58
+ def render_file(output_path)
59
+ @pdf.render_file(output_path)
60
+ end
61
+
62
+ private
63
+
64
+ def determine_canvas_dimension_pt
65
+ w = (@page_dimension_pt.width - @margin_pt.left - @margin_pt.right) *
66
+ @n_horizontal_pages
67
+ h = (@page_dimension_pt.height - @margin_pt.top - @margin_pt.bottom) *
68
+ @n_vertical_pages
69
+ return ImgToPdf::Dimension.new(width: w, height: h)
70
+ end
71
+
72
+ def determine_canvas_scale(canvas_dimension_pt)
73
+ canvas_dimension_in = canvas_dimension_pt.pt_to_in
74
+ dpi_from_width = @image.dimension_px.width / canvas_dimension_in.width
75
+ dpi_from_height = @image.dimension_px.height / canvas_dimension_in.height
76
+ canvas_dpi = [dpi_from_width, dpi_from_height].max
77
+ return 72 / canvas_dpi
78
+ end
79
+
80
+ def each_sub_image(sub_image_dimension_px)
81
+ @n_vertical_pages.times do |i_y|
82
+ @n_horizontal_pages.times do |i_x|
83
+ @image.crop(sub_image_dimension_px.width * i_x,
84
+ sub_image_dimension_px.height * i_y,
85
+ sub_image_dimension_px.width,
86
+ sub_image_dimension_px.height) do |sub_image|
87
+ yield(sub_image)
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,52 @@
1
+ require "tempfile"
2
+
3
+ require "mini_magick"
4
+ require "prawn"
5
+
6
+ require "img_to_pdf"
7
+
8
+ class ImgToPdf::Image
9
+ attr_reader :path
10
+
11
+ class << self
12
+ # @param [Pathname] path path to instantiate.
13
+ # @return [ImgToPdf::Image] instance.
14
+ def from_path(path)
15
+ return new(path)
16
+ end
17
+ end
18
+
19
+ def initialize(path)
20
+ @dimension_px = nil
21
+ @path = path
22
+ end
23
+
24
+ # @return [ImgToPdf::Dimension] image dimension. pixels.
25
+ def dimension_px
26
+ return @dimension_px if @dimension_px
27
+ image_klass = Prawn::Images.const_get(path.extname.upcase.sub(/\A\./, ""))
28
+ image = image_klass.new(path.read)
29
+ @dimension_px = ImgToPdf::Dimension.new(width: image.width,
30
+ height: image.height)
31
+ return @dimension_px
32
+ end
33
+
34
+ # @param [Numeric] x
35
+ # @param [Numeric] y
36
+ # @param [Numeric] width
37
+ # @param [Numeric] height
38
+ # @yieldparam [ImgToPdf::Image] sub_image cropped sub image.
39
+ def crop(x, y, width, height)
40
+ Tempfile.create(["img_to_pdf-image-", path.extname]) do |f|
41
+ f.close
42
+ sub_raw_image_path = Pathname(f.path)
43
+
44
+ raw_image = MiniMagick::Image.open(path)
45
+ raw_image.crop("#{width}x#{height}+#{x}+#{y}")
46
+ raw_image.write(sub_raw_image_path)
47
+
48
+ sub_image = self.class.from_path(sub_raw_image_path)
49
+ yield(sub_image)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,12 @@
1
+ require "img_to_pdf"
2
+
3
+ module ImgToPdf::IntegerParser
4
+ extend self
5
+
6
+ def call(s)
7
+ md = /\A\d+\z/.match(s)
8
+ raise ImgToPdf::ParserError, "invalid integer: #{s.inspect}" if !md
9
+
10
+ return s.to_i
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ require "img_to_pdf"
2
+
3
+ class ImgToPdf::Margin < Struct.new(:top, :right, :bottom, :left,
4
+ keyword_init: true)
5
+ end
@@ -0,0 +1,28 @@
1
+ require "pdf/core/page_geometry"
2
+
3
+ require "img_to_pdf"
4
+
5
+ module ImgToPdf::PaperSizeParser
6
+ extend self
7
+
8
+ AVAILABLE_DIRECTIONS = %i[landscape portrait]
9
+
10
+ # @param [String] s paper size text. "a4-landscape", "b3-portrait", etc.
11
+ # @return [ImgToPdf::Dimension] parsed paper dimension. points.
12
+ def call(s)
13
+ paper_size, direction = *s.split("-")
14
+ direction = direction.downcase.to_sym
15
+ if !AVAILABLE_DIRECTIONS.include?(direction)
16
+ raise ImgToPdf::ParserError, "invalid paper direction: #{s.inspect}"
17
+ end
18
+ raw_size_pt = PDF::Core::PageGeometry::SIZES[paper_size.upcase]
19
+ if !raw_size_pt
20
+ raise ImgToPdf::ParserError, "invalid paper size: #{s.inspect}"
21
+ end
22
+
23
+ paper_dimension_pt = ImgToPdf::Dimension.from_array(raw_size_pt)
24
+ paper_dimension_pt = paper_dimension_pt.justify_direction(direction)
25
+
26
+ return paper_dimension_pt
27
+ end
28
+ end
@@ -0,0 +1,4 @@
1
+ require "img_to_pdf"
2
+
3
+ class ImgToPdf::ParserError < ImgToPdf::Error
4
+ end
@@ -0,0 +1,17 @@
1
+ require "img_to_pdf"
2
+
3
+ module ImgToPdf::Unit
4
+ extend self
5
+
6
+ # @param [Float] mm source length. millimeters.
7
+ # @return [Float] destination length. points.
8
+ def convert_mm_to_pt(mm)
9
+ return mm / 25.4 * 72
10
+ end
11
+
12
+ # @param [Float] pt source length. points.
13
+ # @return [Float] destination length. inches.
14
+ def convert_pt_to_in(pt)
15
+ return pt / 72
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module ImgToPdf
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: img_to_pdf
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yuya.Nishida.
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-03-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: prawn
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mini_magick
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: test-unit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: A tool to create PDF from raster image.
70
+ email:
71
+ - yuya@j96.org
72
+ executables:
73
+ - img_to_pdf
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - Gemfile
79
+ - LICENSE.txt
80
+ - README.md
81
+ - Rakefile
82
+ - bin/console
83
+ - bin/setup
84
+ - exe/img_to_pdf
85
+ - img_to_pdf.gemspec
86
+ - lib/img_to_pdf.rb
87
+ - lib/img_to_pdf/cli.rb
88
+ - lib/img_to_pdf/cli_option.rb
89
+ - lib/img_to_pdf/dimension.rb
90
+ - lib/img_to_pdf/error.rb
91
+ - lib/img_to_pdf/fit_page_document.rb
92
+ - lib/img_to_pdf/image.rb
93
+ - lib/img_to_pdf/integer_parser.rb
94
+ - lib/img_to_pdf/margin.rb
95
+ - lib/img_to_pdf/paper_size_parser.rb
96
+ - lib/img_to_pdf/parser_error.rb
97
+ - lib/img_to_pdf/unit.rb
98
+ - lib/img_to_pdf/version.rb
99
+ homepage: https://github.com/nishidayuya/img_to_pdf
100
+ licenses:
101
+ - X11
102
+ metadata:
103
+ homepage_uri: https://github.com/nishidayuya/img_to_pdf
104
+ source_code_uri: https://github.com/nishidayuya/img_to_pdf
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: 2.3.0
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubygems_version: 3.0.3
121
+ signing_key:
122
+ specification_version: 4
123
+ summary: A tool to create PDF from raster image.
124
+ test_files: []