Rails:如何将HTML转换为PDF?

63
什么是将HTML转换为PDF的最佳且最简单的方法,类似于在ColdFusion上使用CFDOCUMENT?
更新:我非常感谢人们提供的所有评论和建议,但我觉得留下自己的答案的人们都错过了重点。
1)解决方案必须是免费或开源的。有人建议使用pricexml和pd4ml。这些解决方案都需要花钱(pricexml的成本很高),而我不想支付这笔费用。
2)它们必须能够接收HTML(来自文件、URL或字符串变量),然后生成PDF。像prawn、rprf、rtex这样的库是使用自己的方法而不是接收HTML来生成PDF。
请不要认为我对建议不感激,只是对我这样的使用ColdFusion却想转换到Rails的人来说,PDF生成似乎是一个真正的问题。

https://github.com/itkin/proselytism.git - nicolas
那你为什么要踩 HTMLDOC 呢? - Kurt Pfeifle
15个回答

67

这个宝石,WickedPDF恰好可以做到这一点。


1
我尝试点击链接几次,但后来就不知道发生了什么(很奇怪)。然后我尝试复制粘贴链接,它起作用了。如果你在粘贴的URL中看到%5f,请将其替换为下划线。 - Kinjal Dixit
这比PDFKit更受欢迎吗? - Matt
根据Ruby Toolbox的数据,它们大致相当:https://www.ruby-toolbox.com/categories/pdf_generation 我只能谈论WickedPDF,但它肯定可以完成工作,并且从外观上来看维护得非常活跃。 - Joshua Pinter
1
这是我在Rails中创建的用于生成PDF的工具 https://github.com/igorkasyanchuk/rails_pdf - Igor Kasyanchuk
从问题来看,WickedPDF不能生成可访问的PDF :( - callumacrae

15

13
试试WickedPDF,将HTML转换为PDF的插件。

这是一个示例

gem 'wicked_pdf'  
gem 'wkhtmltopdf-binary' 
#wicked_pdf is a wrapper for wkhtmltopdf, you'll need to install that, too

在您的控制器中(我假设您在show方法中):

    respond_to  do |format|
      format.html
      format.pdf do
        pdf = render_to_string :pdf => 'test',
                         layout: 'pdf.html.erb',
                         template: 'show.pdf.slim',
                         header: { :right => '[page] of [topage]'},
                         margin: {top: 0,
                                  bottom: 0,
                                  left: 0,
                                  right: 0},
                         outline: {outline: true,
                                   outline_depth: 2}
        end
     end

在您看来,PDF链接应该是什么样子?

= link_to 'Download Pdf', you_show_path(@uour_object, format: :pdf)
如果您想将PDF文件作为电子邮件附件发送,请先将PDF文件保存在公共或临时文件夹中,然后在邮件类(例如,在mailers/e_mailer.rb中)中进行设置。
attachments["test.pdf"] = File.read(Rails.root.join('public',"test.pdf"))
mail(:to => to, :cc => cc , :subject => "subject")

发送电子邮件后,您可以删除文件

File.delete(Rails.root.join("public", "test.pdf"))

1
这是正确的答案。 - Abs
为什么要创建一个 pdf 变量? - Arnold Roa
@ArnoldRoa 更多细节可以通过此链接进行查看 https://github.com/mileszs/wicked_pdf#super-advanced-usage - Sajjad Murtaza

4

使用phantomjs从URL创建PDF的好选择。 - Fernando Kosh

2
经过许多的心血和泪水,我成功地编写了一个非常简单的 Rails 应用程序,允许用户通过 TinyMce 写信模板,这些模板将被保存并可作为 PDF 文档查看。
我决定尽可能地限制所见即所得编辑器中的选项,因为有些选项不完全按预期工作,但如果需要,这并不是无法解决的问题。
有一个 Ruby gem 可以包装 HTMLDOC,你需要使用它:PDF::HTMLDoc 一旦你安装好了它,注册 MIME 类型,然后你可以做如下操作:
@letter_template = LetterTemplate.find(params[:id])

respond_to do |format|
      format.html
      format.pdf { send_data render_to_pdf({:action => 'show.rpdf',  :layout => 'pdf_report'}), :filename => @letter_template.name + ".pdf",  :disposition => 'inline' }
    end

在应用控制器中,我添加了render_to_pdf方法,如下所示:
def render_to_pdf(options =nil)
    data = render_to_string(options)
    pdf = PDF::HTMLDoc.new
    pdf.set_option :bodycolor, :white
    pdf.set_option :toc, false
    pdf.set_option :portrait, true
    pdf.set_option :links, false
    pdf.set_option :webpage, true
    pdf.set_option :left, '2cm'
    pdf.set_option :right, '2cm'
    pdf.set_option :footer, "../"
    pdf.set_option :header, "..."
    pdf.set_option :bottom, '2cm'
    pdf.set_option :top, '2cm'
    pdf << data
    pdf.generate
  end

你会在Travis Beale链接的HTMLDOC网站上找到更多文档。希望这能帮助你上手,除非你的文档真的很复杂,否则它应该足够了。让我们知道你的进展如何。

1

我在这个问题上找到的最接近的“解决方案”是使用JRuby,然后使用The Flying Saucer Project。 我只希望它能被移植到Ruby中,这样就可以成为本地解决方案。 上帝啊,我真希望自己更擅长Java。


acts_as_flying_saucer 是飞碟库的 Ruby 移植版。 - Amar

1
  • 您可以使用RPDF来描述您的pdf视图。
  • 还有RTEX也可以使用(La)TeX生成pdf。

0

我想向您推荐https://grabz.it提供的HTML转PDF解决方案。

他们拥有非常灵活和易于使用的屏幕截图API,可用于任何类型的Ruby应用程序。

如果您想尝试它,首先应该获取授权应用程序密钥+密钥开发免费SDK

然后,在您的应用程序中,实现步骤如下:

//initialization    
require 'grabzit'
grabzItClient = GrabzIt::Client.new("APPLICATION KEY", "APPLICATION SECRET")

//capturing the url to PDF
grabzItClient.url_to_pdf("http://www.google.com")   

下面是保存。如果可访问回调句柄,则可以使用两种保存方法之一:save
grabzItClient.save("http://www.example.com/handler/index")  

如果您需要同步保存(这将强制您的应用程序等待截图创建),可以使用 save_to

filepath = "images/result.jpg"
grabzItClient.save_to(filepath) 

请查看详细信息以了解有关保存的内容。

就这些。还可以获取其他类型的截图,例如图像截图


0
这个项目可能已经停滞不前了,但是Pisa(又名XHTML2PDF)是一个Python库,可以将CSS+HTML转换成PDF。我曾经在一个(低流量的)Rails应用程序中使用它,通过命令行工具来驱动它——效果还不错。

-1

HTMLDOC?

  • 将HTML转换为PDF;
  • 免费且开源(提供商业支持);
  • 可用作...
    • ...独立应用程序,
    • ...用于批处理文档处理,
    • ...或作为基于Web的服务运行;
  • 界面为CLI或GUI。

我没有点踩,但是当前版本(1.9.16)的GUI对我来说无法工作。 - Ray Woodcock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接