Rails:将HTML转换为PDF?

时间:2008-12-10 19:12:55

标签: ruby-on-rails pdf

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

更新:我非常感谢人们迄今为止提出的所有意见和建议,但我觉得人们遗漏了他们的答案。

1)解决方案必须是免费的或开源的。一个人建议使用pricexml和另一个pd4ml。这两种解决方案都需要花钱(售价和行程的费用),而不是岔路口。

2)他们必须能够接受html(从文件,url或字符串变量),然后生成pdf。像prawn,rprf,rtex这样的库是使用自己的方法生成的,而不是使用html。

请不要认为我对这些建议不感恩,只是对于像我这样使用ColdFusion但希望转换为Rails的人来说,pdf生成似乎是一个真正的问题。

15 个答案:

答案 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年了。但是,有新的选择。

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

答案 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)

  • 您可以在RPDF中将PDF格式描述为视图。
  • 还有RTEX使用(La)TeX生成pdf。

答案 7 :(得分:0)

该项目可能停滞不前,但Pisa(又名XHTML2PDF)是一个Python lib,它将CSS + HTML转换为PDF。通过将其作为命令行工具驱动它,在一段(低流量)Rails应用程序中使用它 - 工作得非常好。

答案 8 :(得分:0)

我想通过https://grabz.it向您推荐HTML到PDF的解决方案。

它们具有非常灵活且易于使用的屏幕截图API,可供任何类型的Ruby应用程序使用。

如果您想尝试一下,首先应该获得授权app key + secretdevelopment 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)

您是否尝试过查看html2pdf?主页为http://html2pdf.seven49.net/Web/

还有一个sourceforge项目。

艾伦

答案 13 :(得分:-1)

不是特定于Ruby,但我发现的最佳解决方案是开源HTMLDOC

答案 14 :(得分:-1)

HTMLDOC

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