Креветка: добавление фонового изображения с большим разрешением

Я создаю pdf-книгу, где мне нужно поместить фоновое изображение для каждой страницы.

Размер страницы (576 x 576), а размер фонового изображения - 2700 x 2700 (300 точек на дюйм.) (Эти размеры являются требованиями, поэтому их нельзя отрегулировать). Моя проблема заключается в том, что фоновое изображение отображается на странице не пропорционально. Как я могу это исправить? Здесь мой код:

 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, 
:background => "#{Rails.root.to_s}/public/images/pdf/bg_blank_low.jpg" ) do |pdf|
    ....
    ....
    ....
)

Есть ли другой способ, с помощью которого я могу разместить изображение с разрешением 300 dpi в качестве фонового изображения.

Я даже пытался добавить pdf-шаблон в качестве фона, но все равно не повезло.

Любое предложение или подсказка будут высоко оценены.

Спасибо.

Ответы

Ответ 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, поскольку креветка не будет масштабировать изображение.

Примечание: Я на самом деле не делал этого, поэтому вам может понадобиться работать с изломами.

Ответ 2

Если у вас есть только одна страница PDF, решение состоит в том, чтобы вообще не использовать свойство background, а просто поместить изображение в первую позицию каждой страницы и определить width как полную ширину с помощью

pdf.bounds.width