14

我正在创建一本 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 模板作为背景,但仍然没有运气。

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

谢谢。

4

2 回答 2

12

您尝试执行的操作无法使用:background选项完成,Prawn::Document.generate因为该:background选项无法缩放图像。如果您想使用该:background选项,您需要确保您的图像与 PDF 的 dpi 相同(通常为 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

您现在可以返回使用设置背景的标准方式,一切都应该正常工作。

事实上,您甚至可以将第 280 行更改为:

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

一切都应该正常工作,省去你输入额外的一行:)。使用带有:width选项的图像应该会自动缩放图像,而使用:atprawn 的选项不会缩放图像。

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

于 2011-08-10T13:50:43.603 回答
0

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

pdf.bounds.width
于 2019-04-10T02:28:30.493 回答