Rails:将HTML转换为PDF?

采用HTML并将其转换为PDF的最好和最简单的方法是什么,类似于在ColdFusion上使用CFDOCUMENT?

更新:我真的很感谢所有人迄今为止提出的意见和build议,但是我觉得离开他们答案的人是没有意义的。

1)解决scheme必须是免费或开源的。 一个人build议使用pricexml和其他pd4ml。 这两个解决scheme都花钱(价格xml花费一个arm和一条腿),我不是叉左右。

2)他们必须能够接受HTML(无论是从文件,url或stringvariables),然后生成PDF。 像prawn,rprf,rtex这样的库是使用自己的方法生成的,而不是使用html。

请不要以为我对这些build议不感兴趣,只是对于像我这样使用ColdFusion但想转换成Rails的人来说,pdf一代看起来真的是个问题。

gemWickedPDF就是 这么做的

现在最伟大的事情是PDFKit这个工作:

尝试WickedPDF ,PDF生成器(从HTML)插件。

这里是例子

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

在你的控制器(我假设你在显示方法):

  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文件在公共或临时文件夹,然后在邮件类(例如在邮件/ 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")) 

我知道这个问题现在已经快5岁了。 但是,新的选项是可用的。

尝试虾! https://github.com/adeven/shrimp

经过大量的血汗stream涕后,我设法写了一个非常简单的Rails应用程序,允许用户通过TinyMce写信模板,然后保存,并可以被视为PDF文件。

我决定尽可能限制在wysiwyg编辑器中的选项,因为有些选项不能像预期的那样工作,但是这并不是什么小事,如果需要的话也不能解决。

有一个ruby包装HTMLDOC,你将需要: PDF :: HTMLDoc

一旦你有了,注册mimetypes,然后你可以做一些事情:

 @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网站上find更多的文档。 希望这有助于你的方式,除非你的文件真的很复杂,它应该足够了。 让我们知道您的身体情况如何。

  • 有RPDF在其中你描述你的pdf作为一个视图。
  • 还有使用(La)TeX来生成pdf的RTEX 。

我发现作为一个“解决scheme”最接近的是使用JRuby,然后使用飞碟项目 。 我只是希望它能够移植到Ruby,所以它可能是一个本地解决scheme。 上帝,我希望我在Java更好。

该项目可能停滞不前,但比萨(又名XHTML2PDF )是一个Python的lib的CSS + HTML的PDF。 在一个(低stream量)的Rails应用程序中使用它作为一个命令行工具,但工作得很好。

我想通过https://grabz.it向您推荐HTML to PDF解决scheme。

他们有一个非常灵活和简单易用的截图API,可以被任何types的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可用的可访问callback句柄:

 grabzItClient.save("http://www.example.com/handler/index") 

如果需要同步保存(这将强制您的应用程序在创build屏幕截图的同时等待) save_to

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

检查文档以获取有关保存的详细信息 。

就这样。 有可能获得其他types的截图,如图片截图 。

如果你想有非常好的质量(想想,正确的布局/ CSS等),你需要创build一个embedded一个真正的浏览器,使其脱离屏幕并通过PDF打印机驱动程序打印它的过程。

在Ruby中确实没有直接的方法来做到这一点(至less在几个月前我没有试图做到这一点)。 如果你真的无法避免从html生成你的pdf,你可能应该为此目的寻找一些外部工具或服务。

祝你好运!

我正在尝试从www.pd4ml.com的图书馆

这里是一个代码片段….

我把HTML中的内容拉入。 然后我做了一些事情,如用checkboxreplace单选button,然后通过pd4ml库运行它来呈现PDF。
结果看起来非常像原始页面….

  String content = nextPage.generateResponse().contentString(); content = content.replace("Print", ""); content = content.replace("Back", ""); content = content.replace("border=\"1\"", "border=\"0\""); content = content.replace("radio", "checkbox"); java.net.InetAddress i = java.net.InetAddress.getLocalHost(); String address = i.getHostAddress()+":53000"; content = content.replace("img src=\"/cgi-bin", "img src=\"http://"+address+"/cgi-bin"); System.out.println(content); PD4ML html = new PD4ML(); html.setPageSize( new java.awt.Dimension(650, 700) ); html.setPageInsets( new java.awt.Insets(30, 30, 30, 30) ); html.setHtmlWidth( 750 ); html.enableImgSplit( false ); html.enableTableBreaks(true); StringReader isr = new StringReader(content); baos = new ByteArrayOutputStream(); html.render( isr, baos); PDFRegForm pdfForm = (PDFRegForm)pageWithName("PDFRegForm"); pdfForm.baos = baos; pdfForm.generateResponse(); 

你有没有试过看html2pdf? 主页是http://html2pdf.seven49.net/Web/

它也有一个sourceforge项目。

艾伦

HTMLDOC ?

  • 将HTML转换为PDF;
  • 免费和开放源代码(商业支持);
  • 可以用作…
    • 独立的应用程序,
    • …对于批量文件处理,
    • …或作为基于networking的服务运行;
  • 界面是CLI或GUI。

不是特定于Ruby,但是我发现的最好的解决scheme是开源的HTMLDOC 。