我正在创建一本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模板作为背景,但仍然没有运气。
非常感谢任何建议或暗示。
感谢。
答案 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