【问题标题】:Background images using prawn on all pages在所有页面上使用虾的背景图像
【发布时间】:2014-02-26 05:06:32
【问题描述】:

我在视图中有这段代码

prawn_document(:page_size=> "A4", :top_margin => 80, :bottom_margin => 40,
               :background => "public/uploads/1.png") do |pdf|

  creation_date = Time.now.strftime('%d-%m-%Y')
  posts = @posts.each do |post|
    pdf.pad(10) do
      pdf.text post.title
      pdf.text post.text
    end
  end

  pdf.page_count.times do |i|
    pdf.go_to_page(i + 1)
    pdf.draw_text "Creation Date : " + creation_date, :at => [200, 780]
    pdf.draw_text "Page : #{i + 1} / #{pdf.page_count}", :at => [450, -3]
  end
end

这给了我以下输出:

还有这个

正如您在第一张图片中看到的那样,图片没有居中。

在第二张图片上,您可以看到图片不适合整页。

我还尝试将图像添加到每个页面,就像我添加页码的方式一样,但是这里的图像与文本重叠。但是在这里我可以按照我想要的方式定位图像,但它只能与文本重叠。

如果我放入标题,我将无法定位和调整图像大小。

所以我需要帮助以使图像适合页面。图片为 700px x 700px。

我也尝试使用 PDFkit,但无法获得页码,我觉得我几乎可以使用 Prawn,但只是这张图片。即使是不同的解决方案也将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby pdf prawn


    【解决方案1】:

    不幸的是,Prawn 似乎无法通过选项拉伸背景图像以适应页面。但是,您可以。图像需要适应的页面是静态的,它永远不会改变大小。此外,我们知道确切的尺寸:

    p Prawn::Document::PageGeometry::SIZES['A4']
    # => [595.28, 841.89]
    

    因此,最好的解决方案是使用您选择的图像编辑器并创建该尺寸的图像。也就是说,创建一个该大小的画布并以任何您想要的方式适合您的原始图像。您可以选择拉伸它,尽管我可能会按比例缩小它以适应宽度并将其垂直居中。但这取决于你。只要确保创建一个 595px x 842px 的图像,它就应该很合适。

    【讨论】:

    • 您也可以使用页面几何信息以及图像大小来得出缩放比例,然后通过 :background_scale 选项。不过,我很乐意考虑合并一个补丁,以增加对页面适配的支持!
    • @GregoryBrown 哦,我不知道这个选项存在!我不经常使用 Prawn,所以我用 Google 搜索了 Document 的 API,显然最终得到了根本没有提到该选项的 0.11 版本。这是 'prawn document api' 的第一个结果。当前版本支持 (prawnpdf.org/api-docs/Prawn/Document.html)。我认为添加:background_fit 选项很好。用户通常不喜欢自己做数学并找出合适的比例。如果您有空闲时间,您还可以考虑添加定位选项,例如 :center 以使未缩放的背景居中。
    • 除了审查传入的拉取请求、削减版本和偶尔修复错误之外,我几乎没有时间做任何事情。但是欢迎为这个以及您在 Prawn 中发现的任何其他粗糙点提供补丁。
    【解决方案2】:

    考虑使用 Prawn templates。这将为您提供一个选项来轻松设置背景和任何重复的细节(页眉、页脚)的样式(使用任何设计软件,例如 Illustrator)然后在您的代码中您只需将 Prwan 指向模板文件 (templeate.pdf)

    prawn_document(:page_size=> "A4",:top_margin => 80,:bottom_margin => 40,:template => 'public/pdf/template.pdf') do |pdf|
    # Yout pdf building code here
    end
    

    也就是说,这个解决方案在性能方面可能不是最好的,特别是在您使用许多 PNG 时(请查看 issue

    此解决方法带来的另一个警告是,Prawn 团队决定将模板功能从主 gem 中 extract 转移到 seperate one。如果您使用的是旧版本,则不必担心这一点,但如果您使用的是最新版本,则可能需要确保此功能得到维护且不会失效。

    【讨论】:

    • 我是 Prawn 的维护者。几点:1) 最新版本的虾有更快的 PNG 支持,2) 模板已被提取,因为它们的实现存在根本缺陷,因此在所有版本的虾上使用它们都是不安全的。在所有已发布的版本中都存在文档损坏的可能性。
    • @GregoryBrown 感谢对模板点的澄清,问题是模板为我和其他许多人节省了很多时间,这些时间可能会浪费在绘制复杂的页眉和页脚上。我在这里缺少任何解决方法吗?
    • 没有任何变通方法,尽管希望随着我们对 Prawn 的稳定,会有越来越多的插件使它能够在更高级别上完成各种任务。模板的问题在于,我们在最低级别解析模板文件并将它们简单地合并到 Prawn 的输出中,而实际上并不知道模板中的内容。因此,只要您在 Prawn 代码中执行的操作与模板中发生的操作发生冲突,就会发生损坏。
    • 啊哈,我明白你的意思了。我希望我能尽快为一些插件做出贡献,因为我最近一直在玩 Prawn,它确实是一个不错且有用的宝石
    猜你喜欢
    • 2014-09-05
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2018-05-10
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多