【问题标题】:Create pdf file from multiple models in rails app在 Rails 应用程序中从多个模型创建 pdf 文件
【发布时间】:2020-09-18 01:06:32
【问题描述】:

在我的 rails 应用程序中,用户在不同的模型中输入了大量数据。用户应该可以从他在不同模型中输入的所有数据创建一个 pdf 文件。哪个 ruby​​ gem 确实提供了这个功能,如何使用它?我已经研究过 Prawn,但不知道它是否提供了使用来自不同模型的数据创建一个 pdf 的功能。

【问题讨论】:

  • 你可以使用 Prawn 生成 pdf 数据源来自多个模型,关键是你如何关联你的模型并通过活动记录访问它的数据,图像 prawn 就像视图一样
  • 试试 wkhtmltopdf
  • @widjajayd 我看到可以从一个模型生成 pdf。例如,我有一个称为期限的模型,我将创建一个类 DeadlinesPdf,在其中我可以从期限控制器传递期限变量,其中存储了所有期限,并在 pdf 中显示值。但是,如果我有另一个名为 tasks 的模型应该显示在同一个 pdf 中,那该怎么做呢?因为在控制器中我说:format.pdf do { pdf = PdfName.new(@deadlines, view_context) ... }。所以我会在每个控制器中创建一个新的 pdf。但是数据应该放在同一个pdf中。
  • @MDTawabAlamKhan 据我了解,对于 wkhtmltopdf,我需要一个 html 站点,其中包含来自所有模型的所有数据。由于应该有大约 15 个模型被渲染并转换为 pdf,我担心这可能会产生非常糟糕的性能。生成的 pdf 将包含大约 60 到 100 个包含大量图像的站点。你怎么看?
  • @widjajayd 这是我找到的从一个模型创建 pdf 的示例的链接:riptutorial.com/ruby-on-rails/example/14560/advanced-example

标签: ruby-on-rails pdf-generation prawn html-to-pdf


【解决方案1】:

Prawn 是一个用于从 any 数据生成 PDF 的库。如何创建 PDF 取决于您。还有你的数据来自哪里。因此,请查看 Prawn 关于如何做事的文档。

您可能还想查看prawn-table,因为它支持将表格添加到 PDF 文档。

我认为您不会为您想做的事情找到任何预构建的解决方案。

【讨论】:

  • 我已经查看了文档和教程。但我只找到了有关如何从一个模型创建 pdf 的信息。这是资源:riptutorial.com/ruby-on-rails/example/14560/advanced-example。您是否知道如何为多个模型执行此操作?我遇到的问题是,在每个控制器中都会创建一个新的 pdf,我希望他们使用相同的 pdf 将它们的实例变量传递给。
【解决方案2】:

这里排序教程如何使用大虾pdf打印相关模型

例如,我有父模型,它有很多汽车(相关模型)

class Parent < ActiveRecord::Base
  has_many :cars, dependent: :destroy
  accepts_nested_attributes_for :cars, allow_destroy: :true
end

在我的控制器内部我定义如下

class ParentsController < ApplicationController

  def show
      @parent = Parent.find(params[:id])

      respond_to do |format|
        format.html     
        format.pdf do
            # here you call prawn pdf class (see below)
            pdf = ParentPdf.new(@parent)
            send_data pdf.render, filename: 'family.pdf',
                                  type: 'application/pdf',
                                  disposition: 'inline'
          end
        end
      end
    end
  end
end

您可以按照 app/pdf/parent_pdf.rb 创建文件夹和文件,它继承自 Prawn::Document 类

class ParentPdf < Prawn::Document

  def initialize(parent)
    # init margin and size
    super(top_margin: 5, left_margin: 5, page_size: 'A4', page_layout: :landscape, print_scaling: :none)

    # pass argument to variable
    @parent = parent
    # here is you access related models like you access from your controller
    @cars = @parent.cars
    # you print the model
    print_header 
    # and print related model
    print_detail
  end 

  def print_header
    bounding_box([420, 510], width: 350, height: 90) do
      text "name: #{@parent.name}", size: 11
    end
  end

  def print_detail
    font 'Helvetica'
    font_size 9
    @cars.each do |car|
      text "car: #{car.name}", size: 11
    end
  end

end

最后是通过超链接打印pdf的命令

<%= link_to 'print pdf', parent_path(parent, format: "pdf"), :class => 'btn btn-sm btn-secondary' %>

【讨论】:

  • 这听起来很有希望,因为我所有的模型都属于名为 project 的模型。我会试试这个!告诉你(y)
  • 按预期工作!谢谢你:)
猜你喜欢
  • 2011-07-05
  • 2013-08-06
  • 2012-07-13
  • 2011-10-23
  • 2011-05-24
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2013-11-23
相关资源
最近更新 更多