采用HTML并将其转换为PDF的最佳和最简单的方法是什么,类似于在ColdFusion上使用CFDOCUMENT?
更新:我非常感谢人们迄今为止提出的所有意见和建议,但我觉得人们遗漏了他们的答案。
1)解决方案必须是免费的或开源的。一个人建议使用pricexml和另一个pd4ml。这两种解决方案都需要花钱(售价和行程的费用),而不是岔路口。
2)他们必须能够接受html(从文件,url或字符串变量),然后生成pdf。像prawn,rprf,rtex这样的库是使用自己的方法生成的,而不是使用html。
请不要认为我对这些建议不感恩,只是对于像我这样使用ColdFusion但希望转换为Rails的人来说,pdf生成似乎是一个真正的问题。
答案 0 :(得分:61)
宝石WickedPDF完全完全。
答案 1 :(得分:14)
现在最伟大的事情就是PDFKit这项工作:
答案 2 :(得分:11)
Try WickedPDF,PDF生成器(来自HTML)插件。
这是示例
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"))
答案 3 :(得分:3)
我知道这个问题差不多已有5年了。但是,有新的选择。
答案 4 :(得分:2)
经过大量的血汗和泪水后,我设法编写了一个非常简单的rails应用程序,允许用户通过TinyMce编写信件模板,然后保存这些模板并可以将其视为pdf文档。
我决定尽可能地限制wysiwyg编辑器中的选项,因为有些选项并不能完全按照预期工作,但如果需要,那就没有什么可以解决的。
有一个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网站上找到更多文档。希望这有助于您的工作,除非您的文档非常复杂,否则就足够了。让我们知道你是如何上场的。
答案 5 :(得分:1)
我发现最接近于此的“解决方案”是使用JRuby然后使用The Flying Saucer Project。我只是希望将它移植到Ruby,因此它可能是一个本机解决方案。上帝,我希望自己在Java方面做得更好。
答案 6 :(得分:1)
答案 7 :(得分:0)
该项目可能停滞不前,但Pisa(又名XHTML2PDF)是一个Python lib,它将CSS + HTML转换为PDF。通过将其作为命令行工具驱动它,在一段(低流量)Rails应用程序中使用它 - 工作得非常好。
答案 8 :(得分:0)
我想通过https://grabz.it向您推荐HTML到PDF的解决方案。
它们具有非常灵活且易于使用的屏幕截图API,可供任何类型的Ruby应用程序使用。
如果您想尝试一下,首先应该获得授权app key + secret和development free 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)
查看details有关保存的文档。
这就是全部。也可以获得其他类型的屏幕截图,例如image screenshots。
答案 9 :(得分:-1)
如果你想拥有非常好的质量(想想,正确的布局/ CSS等),你需要创建一个嵌入真实网络浏览器的过程,将其渲染到屏幕外并通过PDF打印机驱动程序打印。
答案 10 :(得分:-1)
确实没有直接的方法可以在Ruby中执行此操作(至少在几个月前我没有尝试过这样做)。如果你真的无法避免从html生成pdf,那么你应该为此寻找一些外部工具或服务。
祝你好运!答案 11 :(得分:-1)
我正在尝试www.pd4ml.com上的图书馆
这是一个代码片段....
我将html引入String内容。然后我做了一些事情,比如用复选框替换单选按钮,然后通过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();
答案 12 :(得分:-1)
答案 13 :(得分:-1)
不是特定于Ruby,但我发现的最佳解决方案是开源HTMLDOC。
答案 14 :(得分:-1)