Browse Source
Should satisfy #123 Needs some testing on printers but the functionality is there.dev
11 changed files with 1711 additions and 506 deletions
@ -0,0 +1,85 @@
|
||||
require_relative '../args/sheet' |
||||
|
||||
module Squib |
||||
module Graphics |
||||
class SavePDF |
||||
|
||||
def initialize(deck) |
||||
@deck = deck |
||||
end |
||||
|
||||
# :nodoc: |
||||
# @api private |
||||
def render_pdf(range, sheet) |
||||
cc = init_cc(sheet) |
||||
cc.scale(72.0 / @deck.dpi, 72.0 / @deck.dpi) # for bug #62 |
||||
x, y = sheet.margin, sheet.margin |
||||
card_width = @deck.width - 2 * sheet.trim |
||||
card_height = @deck.height - 2 * sheet.trim |
||||
track_progress(range, sheet) do |bar| |
||||
range.each do |i| |
||||
card = @deck.cards[i] |
||||
cc.translate(x, y) |
||||
cc.rectangle(sheet.trim, sheet.trim, card_width, card_height) |
||||
cc.clip |
||||
case card.backend.downcase.to_sym |
||||
when :memory |
||||
cc.set_source(card.cairo_surface, 0, 0) |
||||
cc.paint |
||||
when :svg |
||||
card.cairo_surface.finish |
||||
cc.save |
||||
cc.scale(0.8, 0.8) # I really don't know why I needed to do this at all. But 0.8 is the magic number to get this to scale right |
||||
cc.render_rsvg_handle(RSVG::Handle.new_from_file(card.svgfile), nil) |
||||
cc.restore |
||||
else |
||||
abort "No such back end supported for save_pdf: #{backend}" |
||||
end |
||||
bar.increment |
||||
cc.reset_clip |
||||
cc.translate(-x, -y) |
||||
draw_crop_marks(cc, x, y, sheet) if sheet.crop_marks |
||||
x += card.width + sheet.gap - 2 * sheet.trim |
||||
if x > (sheet.width - card_width - sheet.margin) |
||||
x = sheet.margin |
||||
y += card.height + sheet.gap - 2 * sheet.trim |
||||
if y > (sheet.height - card_height - sheet.margin) |
||||
cc.show_page # next page |
||||
x, y = sheet.margin, sheet.margin |
||||
end |
||||
end |
||||
end |
||||
end |
||||
cc.target.finish |
||||
end |
||||
|
||||
private |
||||
|
||||
# Initialize the Cairo Context |
||||
def init_cc(sheet) |
||||
Cairo::Context.new(Cairo::PDFSurface.new( |
||||
"#{sheet.dir}/#{sheet.file}", |
||||
sheet.width * 72.0 / @deck.dpi, #PDF thinks in 72 DPI "points" |
||||
sheet.height * 72.0 / @deck.dpi) |
||||
) |
||||
end |
||||
|
||||
def track_progress(range, sheet) |
||||
msg = "Saving PDF to #{sheet.full_filename}" |
||||
@deck.progress_bar.start(msg, range.size) { |bar| yield(bar) } |
||||
end |
||||
|
||||
def draw_crop_marks(cc, x, y, sheet) |
||||
sheet.crop_coords(x, y, @deck.width, @deck.height).each do |coord| |
||||
cc.move_to(coord[:x1], coord[:y1]) |
||||
cc.line_to(coord[:x2], coord[:y2]) |
||||
cc.set_source_color(sheet.crop_stroke_color) |
||||
cc.set_dash(sheet.crop_stroke_dash) |
||||
cc.set_line_width(sheet.crop_stroke_width) |
||||
cc.stroke |
||||
end |
||||
end |
||||
|
||||
end |
||||
end |
||||
end |
||||
@ -1 +1 @@
|
||||
Subproject commit 2b3a6498fdf4668f5d7a30aa2773e4a0f1f1c4f2 |
||||
Subproject commit 711ec5a0596a62f6b699a202b7f557d9cd5d20fe |
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue