module Despeck::PdfTools

Read/Write PDF files

Constants

DEFAULT_DPI

Increase to improve image quality, decrease to improve performance

Public Class Methods

for_each_page(pdf_path) { |page_no| ... } click to toggle source
# File lib/despeck/pdf_tools.rb, line 40
def for_each_page(pdf_path)
  pages_count(pdf_path).times do |page_no|
    yield page_no
  end
end
images_to_pdf(images, pdf_path, origin_images = []) click to toggle source
# File lib/despeck/pdf_tools.rb, line 20
def images_to_pdf(images, pdf_path, origin_images = [])
  doc = nil

  for_each_image_file(images,
                      origin_images) do |path, pg_size, pic_size, layout|
    if doc
      doc.start_new_page(size: pg_size, layout: layout)
    else
      doc = Prawn::Document.new(page_size: pg_size, page_layout: layout)
    end
    doc.image(path, position: :left, vposition: :top, fit: pic_size)
  end

  doc.render_file(pdf_path)
end
pages_count(pdf_path) click to toggle source
# File lib/despeck/pdf_tools.rb, line 36
def pages_count(pdf_path)
  PDF::Reader.new(pdf_path).pages.count
end
pdf_to_images(pdf_path, dpi: DEFAULT_DPI) click to toggle source
# File lib/despeck/pdf_tools.rb, line 12
def pdf_to_images(pdf_path, dpi: DEFAULT_DPI)
  images = []
  for_each_page(pdf_path) do |page_no|
    images << Vips::Image.pdfload(pdf_path, page: page_no, dpi: dpi)
  end
  images
end

Private Class Methods

for_each_image_file(images, origin_images) { |path, page_size, size, layout| ... } click to toggle source
# File lib/despeck/pdf_tools.rb, line 48
def for_each_image_file(images, origin_images)
  images.each_with_index do |picture, i|
    tempfile = Tempfile.new(['despeck', '.jpg'])
    pic = picture || origin_images[i]
    picture.write_to_file(tempfile.path)

    page_size = pdf_size(pic)
    layout = page_size.max == page_size.first ? :landscape : :portrait
    yield tempfile.path, page_size, pic.size, layout
  end
end
pdf_size(image) click to toggle source
# File lib/despeck/pdf_tools.rb, line 60
def pdf_size(image)
  image.size.map { |p| p + in2pt(1) }
end