class Mrmanga::PdfRenderer

Public Class Methods

new(manga, volume, chapters, settings) click to toggle source
# File lib/mrmanga/pdf_renderer.rb, line 6
def initialize(manga, volume, chapters, settings)
  info = manga.info[:metadata].clone

  title = info[:Title]

  info[:Title] = "#{title} Vol.#{volume}"

  doc = Prawn::Document.new(skip_page_creation: true, info: info)

  outline_map = {}

  total_page_counter = 0

  chapters.each do |ch, pages|
    puts "Chapter #{ch}"
    outline_map[ch] = []

    pages.each do |page|
      doc.start_new_page(margin: 0, size: [page[:width], page[:height]], layout: :portrait)

      outline_map[ch].push(total_page_counter += 1)

      begin
        doc.image(page[:file])
      rescue Prawn::Errors::UnsupportedImageType
        # Some pngs may fail, so we convert them to jpg
        puts "Error in image #{page[:file]}, force converting to jpg and writing jpg version"
        conv = MiniMagick::Image.open(page[:file])

        conv.format 'jpg'
        conv.quality 100

        begin
          doc.image(conv.path)
        rescue Prawn::Errors::UnsupportedImageType
          puts "And again, error in image #{conv.path}, skipping it"
        end
      end
    end
  end

  doc.outline.define do
    section info[:Title]

    outline_map.each do |chapter, pages|
      section manga.info[:original_chapters][volume][chapter], destination: pages.first do
        unless settings[:disable_outline_pages]
          pages.each do |page_number|
            page title: "Page #{page_number}", destination: page_number
          end
        end
      end
    end
  end

  # Normalize filename (may contain inappropriate chars)

  # Removing non-word chars
  title.gsub!(/[^[[[:word:]]| |.]+]/, '')
  # Stripping spaces, dots, underscores, dashes from start and end
  title.gsub!(/^[\.|_| |-]+/, '')
  title.gsub!(/[\.|_| |-]+$/, '')

  filename = "#{manga.info[:info][:name]}/#{title} Vol. #{volume}.pdf"

  doc.render_file filename

  puts "Rendered to #{filename}"
end