Last active
April 21, 2024 19:12
-
-
Save djalmajr/87c670d70c399708a1adcc55f9ee7165 to your computer and use it in GitHub Desktop.
Converts images in a directory to pdf
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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