【问题标题】:Rails: Convert HTML to PDF? [closed]Rails:将 HTML 转换为 PDF? [关闭]
【发布时间】:2010-09-26 07:29:49
【问题描述】:

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

更新:我非常感谢迄今为止人们提供的所有 cmets 和建议,但我觉得留下答案的人没有抓住重点。

1) 解决方案必须是免费的或开源的。一个人建议使用pricexml,另一个人建议使用pd4ml。这两种解决方案都需要花钱(pricexml 花费了一条胳膊和一条腿),我不是要分叉。

2) 他们必须能够接收 html(来自文件、url 或字符串变量),然后生成 pdf。 prawn、rprf、rtex 等库是使用自己的方法生成的,不包含 html。

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

【问题讨论】:

标签: ruby-on-rails pdf


【解决方案1】:

宝石,WickedPDF正是做到了这一点。

【讨论】:

  • 你先生是男人。正是我想要的!
  • 我尝试点击链接几次,但后来我忘记了发生的事情(奇怪)。然后我尝试复制粘贴链接,它工作。如果您在粘贴的 url 中得到 %5f,只需将其替换为下划线即可。
  • 这比 PDFKit 更受欢迎吗?
  • @Matt 根据 Ruby 工具箱,它们差不多:ruby-toolbox.com/categories/pdf_generation 我只能与 WickedPDF 交谈,但它确实完成了工作,并且从外观上看得到了非常积极的维护.
  • 这是我为在 Rails 中生成 PDF 而创建的 github.com/igorkasyanchuk/rails_pdf
【解决方案2】:

如今最棒的是 PDFKit 适合这项工作:

【讨论】:

    【解决方案3】:

    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 文件保存在 public 或 temp 文件夹中,然后保存在 mailer 类中(例如在 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"))
    

    【讨论】:

    【解决方案4】:

    我知道这个问题在这一点上已经有将近 5 年的历史了。但是,有新的选项可用。

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

    【讨论】:

      【解决方案5】:

      经过大量的汗水和泪水,我设法编写了一个非常简单的rails应用程序,允许用户通过TinyMce编写信件模板,然后将这些模板保存并可以作为pdf文档查看。

      我决定尽可能地限制所见即所得编辑器中的选项,因为某些选项不能完全按预期工作,但这不是一个小 gsub-ing 无法解决的问题。

      您需要一个封装 HTMLDOC 的 ruby​​ gem: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 网站上找到更多文档。希望这对您有所帮助,除非您的文件真的很复杂,否则就足够了。让我们知道您的进展情况。

      【讨论】:

        【解决方案6】:
        • RPDF 在其中将您的 pdf 描述为视图。
        • 还有RTEX 使用 (La)TeX 生成 pdf。

        【讨论】:

          【解决方案7】:

          我发现的最接近“解决方案”的方法是使用 JRuby,然后使用 The Flying Saucer Project。我只是希望它能够被移植到 Ruby 上,这样它就可以成为一个原生解决方案。上帝,我希望我在 Java 方面做得更好。

          【讨论】:

          【解决方案8】:

          该项目可能已经停滞不前,但 Pisa(又名XHTML2PDF)是一个 Python 库,可以将 CSS+HTML 转换为 PDF。不久前,通过将它作为命令行工具驱动它在(低流量)Rails 应用程序中使用它——效果很好。

          【讨论】:

            【解决方案9】:

            我想向您推荐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

            【讨论】:

              【解决方案10】:

              如果你想拥有真正好的质量(想想,适当的布局/CSS 等),你需要创建一个嵌入真正的网络浏览器的进程,将其呈现在屏幕外并通过 PDF 打印机驱动程序打印。

              【讨论】:

              • 实际上,我认为这不是最好的解决方案,因为大多数网站都有“打印”样式,可以删除网站的元素。
              【解决方案11】:

              在 Ruby 中肯定没有直接的方法可以做到这一点(至少几个月前我尝试这样做时没有)。如果您确实无法避免从 html 生成 pdf,您可能应该为此寻找一些外部工具或服务。

              祝你好运!

              【讨论】:

                【解决方案12】:

                我正在尝试来自 www.pd4ml.com 的库

                这是一个代码片段......

                我将 html 拉入字符串内容。然后我做了几件事,比如用复选框替换单选按钮,然后通过 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();
                

                【讨论】:

                  【解决方案13】:

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

                  它还有一个sourceforge项目。

                  艾伦

                  【讨论】:

                    【解决方案14】:

                    HTMLDOC?

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

                    【讨论】:

                      【解决方案15】:

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

                      【讨论】:

                      • HTMLDOC 不支持 utf-8 并且作者没有计划支持它
                      猜你喜欢
                      • 2010-10-31
                      • 1970-01-01
                      • 2010-10-12
                      • 2011-02-23
                      • 1970-01-01
                      • 1970-01-01
                      • 2022-03-07
                      • 2010-10-08
                      相关资源
                      最近更新 更多