虾:添加更大分辨率的背景图像

时间:2011-08-10 08:08:00

标签: ruby-on-rails background prawn

我正在创建一本pdf书籍,我需要为每个页面添加背景图像。

页面尺寸为(576 x 576),背景图像尺寸为2700 x 2700(300 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, 
:background => "#{Rails.root.to_s}/public/images/pdf/bg_blank_low.jpg" ) do |pdf|
    ....
    ....
    ....
)

还有其他方法可以将300 dpi的图像作为背景图像放置。

我甚至尝试添加pdf模板作为背景,但仍然没有运气。

非常感谢任何建议或暗示。

感谢。

2 个答案:

答案 0 :(得分:11)

由于:background选项无法缩放图片,因此无法使用Prawn::Document.generate的{​​{1}}选项完成您要执行的操作。如果您想使用:background选项,则需要确保您的图像与PDF相同(通常为72dpi)。

然而,您可以简单地将图像嵌入页面中,就像普通图像一样,然后将文本浮动到顶部。这是有效的,因为当您嵌入图像时,您可以缩放它。代码可能如下所示:

:background

这将使您的“背景”完全覆盖页面(因为我们手动计算了比例2700/576),如果您想要尊重您的边距(这可能是更好的方式),您可能会改为:

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

这应该根据页面边界框的宽度自动缩放图像。当然,您还需要更改pdf.image bg_image, :width => pdf.bounds.width ,例如:

move_up

完成此操作后,您可以开始放入文本,它应显示在图像的顶部,这样我们就可以得到模拟的缩放背景。

<强>更新

这是有关评论的更新。如果您有自动创建的页面,并且您希望它们具有相同的背景,那么如果您按原样使用当前的prawn版本,则运气不佳。如果你真的需要这个功能,那么你必须修补大虾。

抓住虾源(来自https://github.com/sandal/prawn)并查看它。你所追求的是pdf.move_up pdf.bounds.height ,在第244行有一个方法lib/document.rb,这就是你所追求的方法。在第280行的此方法中,您可以看到背景的设置位置。不幸的是,它正在使用start_new_page,这意味着您的图片必须具有合适的尺寸。这就是背景图像无法自动缩放的原因。

您需要覆盖此行为。由于这是Ruby,所以你要做的就是重新打开项目中的类,然后复制粘贴这个方法(如果你需要更多关于如何做到这一点的信息,那么猴子修补Ruby类就有很多)。现在,您可以根据自己的内容编辑此方法。最简单的方法可能是将画布全部移除,然后使用上面的图像技巧。因此该行最终为:

canvas

现在您可以回到使用标准的背景设置方式,一切都应该有效。

事实上,你甚至可以将280号线改为:

image(@background, :width => bounds.width) if @background
move_up bounds.height

一切都应该正常工作,省去你必须输入额外的行:)。使用带有canvas { image(@background, :width => bounds.width) } if @background 选项的图像应该会自动缩放图像,而使用:width选项时,prawn不会缩放图像。

注意: 我实际上并没有这样做,因此您可能需要解决问题。

答案 1 :(得分:0)

如果只有一个PDF页面,一种解决方案是根本不使用background属性,而只需将图像放置在每页的第一位置并将width定义为

pdf.bounds.width