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岁了。 但是,新的选项是可用的。
经过大量的血汗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();
HTMLDOC ?
- 将HTML转换为PDF;
- 免费和开放源代码(商业支持);
- 可以用作…
- 独立的应用程序,
- …对于批量文件处理,
- …或作为基于networking的服务运行;
- 界面是CLI或GUI。
不是特定于Ruby,但是我发现的最好的解决scheme是开源的HTMLDOC 。