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

saf*_*lmj 14 background ruby-on-rails 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|
    ....
    ....
    ....
)
Run Code Online (Sandbox Code Playgroud)

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

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

任何建议或提示将不胜感激.

谢谢.

sko*_*rks 13

您尝试做的事情无法使用:background选项,Prawn::Document.generate因为该:background选项无法缩放图像.如果要使用该:background选项,则需要确保图像与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
Run Code Online (Sandbox Code Playgroud)

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

pdf.image bg_image, :width => pdf.bounds.width
Run Code Online (Sandbox Code Playgroud)

这应该根据页面边界框的宽度自动缩放图像.当然你也需要改变你的move_up东西,比如:

pdf.move_up pdf.bounds.height
Run Code Online (Sandbox Code Playgroud)

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

更新

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

抓住虾源(来自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
Run Code Online (Sandbox Code Playgroud)

您现在可以回到使用标准方式设置背景,一切都应该工作.

事实上,您甚至可以通过更改第280行来逃避:

canvas { image(@background, :width => bounds.width) } if @background
Run Code Online (Sandbox Code Playgroud)

一切都应该工作正常,省去你必须输入额外的行:).使用带有:width选项的图像应该自动缩放图像,而使用:at选项,因为对虾不会缩放图像.

注意:我实际上没有这样做,所以你可能需要解决问题.