Ответ 1
То, что вы пытаетесь сделать, не может быть выполнено с помощью параметра :background
Prawn::Document.generate
, поскольку параметр :background
не может масштабировать изображение. Если вы хотите использовать опцию :background
, вам нужно убедиться, что ваше изображение совпадает с разрешением на dpi, как PDF (обычно 72dpi).
Однако вы можете просто вставить изображение на страницу, как и обычный образ, а затем поместить текст поверх него. Это работает, когда вы вставляете изображение, которое вы можете его масштабировать. Код может выглядеть примерно так:
Prawn::Document.generate("#{Rails.root.to_s}/public/#{filename}.pdf", :page_size => [576,576], :left_margin => 50, :right_margin => 50, :page_layout => :portrait, :skip_page_creation => true, :skip_encoding => true) do |pdf|
bg_image = "#{Rails.root.to_s}/public/images/pdf/bg_blank_low.jpg"
pdf.image bg_image, :scale => 0.2311
pdf.move_up 576
end
Это сделает ваш "фон" полностью покрывающим страницу (поскольку мы вручную вычислили масштаб 2700/576), если вы хотите уважать свои поля (это, вероятно, лучший способ вообще), вы можете изменить что-то вроде
pdf.image bg_image, :width => pdf.bounds.width
Это должно автоматически масштабировать изображение в зависимости от ширины ограничивающего окна страницы. Конечно, вам нужно будет также изменить ваш move_up
, что-то вроде:
pdf.move_up pdf.bounds.height
После этого вы можете начать вводить текст, и он должен появиться поверх вашего изображения, и мы получим наш имитированный масштабированный фон.
Обновление
Это обновление в отношении комментария. Если у вас есть страницы, которые автоматически создаются, и вы хотите, чтобы они имели один и тот же фон, вам не повезло, если вы используете текущую версию креветок так, как есть. Если вам действительно нужна эта функциональность, вам нужно наложить креветку.
Возьмите источник креветок (от https://github.com/sandal/prawn) и взгляните на него. То, что вам нужно, это lib/document.rb
, в строке 244 есть метод start_new_page
, это тот, который вам нужен. В этом методе в строке 280 вы можете увидеть, где установлен фон. К сожалению, он использует canvas
, что означает, что ваше изображение уже должно иметь нужный размер. Вот почему фоновое изображение не масштабируется автоматически.
Вам необходимо переопределить это поведение. Поскольку это Ruby, все, что вам нужно сделать, - это снова открыть класс в вашем проекте, а затем скопировать его в этот метод (если вам нужна дополнительная информация о том, как это сделать, есть много возможностей для включения классов Ruby в обезьяны). Теперь вы редактируете этот метод в своем сердце. Самый простой способ - это, вероятно, удалить холст вместе, а затем использовать наш трюк изображения сверху. Таким образом, строка заканчивается как:
image(@background, :width => bounds.width) if @background
move_up bounds.height
Теперь вы можете вернуться к использованию стандартного способа настройки фона, и все должно работать.
Infact, вы даже можете уйти с меняющейся строкой 280:
canvas { image(@background, :width => bounds.width) } if @background
И все должно работать нормально, и вам нужно набрать дополнительную строку:). Использование изображения с опцией :width
должно автоматически масштабировать изображение, используя параметр :at
, поскольку креветка не будет масштабировать изображение.
Примечание: Я на самом деле не делал этого, поэтому вам может понадобиться работать с изломами.