Креветка: добавление фонового изображения большего разрешения - PullRequest
14 голосов
/ 10 августа 2011

Я создаю книгу в формате 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 точек на дюйм в качестве фонового изображения.

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

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

Спасибо.

Ответы [ 2 ]

11 голосов
/ 10 августа 2011

То, что вы пытаетесь сделать, невозможно сделать с помощью параметра :background, равного Prawn::Document.generate, поскольку параметр :background не может масштабировать изображение. Если вы хотите использовать опцию :background, вам нужно убедиться, что ваше изображение имеет тот же dpi, что и PDF (обычно 72 dpi).

Однако вы можете просто вставить изображение на странице, как обычное изображение, а затем поместить текст поверх него. Это работает, поскольку, когда вы встраиваете изображение, вы можете масштабировать его. Код может выглядеть примерно так:

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

Теперь вы можете вернуться к стандартному способу установки фона, и все должно работать.

На самом деле, вы даже можете избежать изменения строки 280 на эту:

canvas { image(@background, :width => bounds.width) } if @background

И все должно работать нормально, избавляя вас от необходимости вводить дополнительную строку :). Использование изображения с параметром :width должно автоматически масштабировать изображение, в то время как использование параметра :at, так как креветка не масштабирует изображение.

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

0 голосов
/ 10 апреля 2019

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

pdf.bounds.width
...