Skip to content

Instantly share code, notes, and snippets.

@djalmajr
Last active April 21, 2024 19:12
Show Gist options
  • Save djalmajr/87c670d70c399708a1adcc55f9ee7165 to your computer and use it in GitHub Desktop.
Save djalmajr/87c670d70c399708a1adcc55f9ee7165 to your computer and use it in GitHub Desktop.
Converts images in a directory to pdf
#!/usr/bin/env ruby
###############################################################################
# Pre-requirements
#
# - sudo apt update & sudo apt install imagemagick libmagick++-dev
# or
# - brew install imagemagick
#
# - gem install mini_magick prawn
###############################################################################
require 'prawn'
require 'mini_magick'
SIZES = {
"4A0" => [4767.87, 6740.79],
"2A0" => [3370.39, 4767.87],
"A0" => [2383.94, 3370.39],
"A1" => [1683.78, 2383.94],
"A2" => [1190.55, 1683.78],
"A3" => [841.89, 1190.55],
"A4" => [595.28, 841.89],
"A5" => [419.53, 595.28],
"A6" => [297.64, 419.53],
"A7" => [209.76, 297.64],
"A8" => [147.40, 209.76],
"A9" => [104.88, 147.40],
"A10" => [73.70, 104.88],
"B0" => [2834.65, 4008.19],
"B1" => [2004.09, 2834.65],
"B2" => [1417.32, 2004.09],
"B3" => [1000.63, 1417.32],
"B4" => [708.66, 1000.63],
"B5" => [498.90, 708.66],
"B6" => [354.33, 498.90],
"B7" => [249.45, 354.33],
"B8" => [175.75, 249.45],
"B9" => [124.72, 175.75],
"B10" => [87.87, 124.72],
"C0" => [2599.37, 3676.54],
"C1" => [1836.85, 2599.37],
"C2" => [1298.27, 1836.85],
"C3" => [918.43, 1298.27],
"C4" => [649.13, 918.43],
"C5" => [459.21, 649.13],
"C6" => [323.15, 459.21],
"C7" => [229.61, 323.15],
"C8" => [161.57, 229.61],
"C9" => [113.39, 161.57],
"C10" => [79.37, 113.39],
"RA0" => [2437.80, 3458.27],
"RA1" => [1729.13, 2437.80],
"RA2" => [1218.90, 1729.13],
"RA3" => [864.57, 1218.90],
"RA4" => [609.45, 864.57],
"SRA0" => [2551.18, 3628.35],
"SRA1" => [1814.17, 2551.18],
"SRA2" => [1275.59, 1814.17],
"SRA3" => [907.09, 1275.59],
"SRA4" => [637.80, 907.09],
"EXECUTIVE" => [521.86, 756.00],
"FOLIO" => [612.00, 936.00],
"LEGAL" => [612.00, 1008.00],
"LETTER" => [612.00, 792.00],
"TABLOID" => [792.00, 1224.00],
}
def get_page_size(img, paper)
paper = "A4" if paper.nil?
size = SIZES[paper.upcase]
ratio = img.width.to_f / img.height.to_f
[size[0], size[0] / ratio]
end
def get_images(image_folder, output_file)
unless Dir.exist?(image_folder)
puts "The image folder '#{image_folder}' does not exist."
exit
end
output_dir = File.dirname(output_file)
unless Dir.exist?(output_dir)
puts "The output directory '#{output_dir}' does not exist."
exit
end
images = Dir.glob(File.join(image_folder, '*.{png,jpg,jpeg}'))
if images.empty?
puts "No images found in the folder '#{image_folder}'."
exit
end
images
end
def images_to_pdf(image_folder, output_file, paper)
imgs = get_images(image_folder, output_file)
img = MiniMagick::Image.open(imgs.first)
pdf = Prawn::Document.new(margin: 0, page_size: get_page_size(img, paper))
imgs.sort!
imgs.each do |image_path|
puts "Processing '#{File.basename(image_path)}'..."
img = MiniMagick::Image.open(image_path)
unless ['jpg', 'jpeg', 'png'].include?(img[:format].downcase)
img.format 'png'
img.write(image_path)
end
pdf.start_new_page if pdf.page_count > 1
pdf.image img.path, fit: [pdf.bounds.width, pdf.bounds.height]
end
pdf.render_file output_file
end
if ARGV.length < 2 || ARGV.length > 3
puts "Usage: ruby script.rb <image_folder> <output_file.pdf> [A4|LETTER]"
exit
end
images_to_pdf(ARGV[0], ARGV[1], ARGV[2])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment