2008-12-10 218 views
53

採用HTML並將其轉換爲PDF格式的最佳和最簡單的方法是什麼?類似於在ColdFusion上使用CFDOCUMENT?Rails:將HTML轉換爲PDF?

更新:我真的很感謝大家迄今爲止提出的所有意見和建議,但是我覺得離開答案的人沒有意義。

1)解決方案必須是免費或開源的。一個人建議使用pricexml和其他pd4ml。這兩個解決方案都需要花錢(價格xml花費一隻手臂和一條腿),而我並不關心這個問題。

2)他們必須能夠接受HTML(無論是從文件,網址或字符串變量),然後生成PDF。像prawn,rprf,rtex這樣的庫是使用它們自己的方法生成的,而不是使用html。

請不要以爲我對這些建議不感興趣,這只是對於像我這樣使用ColdFusion但想要轉換爲Rails的人來說,似乎是一代pdf問題。

+0

https://github.com/itkin/proselytism.git – nicolas 2013-03-06 08:14:27

+0

那麼,爲什麼你downvote HTMLDOC呢? – 2014-12-17 22:42:17

回答

60

這個寶石,WickedPDF,確實正好那。

+1

您先生是男人。完全是我在找什麼! – rip747 2009-12-06 13:39:10

-1

如果你想有非常好的質量(想想,適當的佈局/ CSS等),你需要創建一個嵌入一個真正的瀏覽器,使其脫離屏幕並通過PDF打印機驅動程序打印它的過程。

+0

實際上我不認爲這將是最好的解決方案,因爲大多數網站都有一個「打印」樣式,以刪除網站的元素。 – rip747 2008-12-10 19:30:04

-1

在Ruby中確實沒有直接的方法來做到這一點(至少在幾個月前我沒有試圖做到這一點)。如果你真的無法避免從html生成你的pdf,你應該爲此目的尋找一些外部工具或服務。

祝你好運!

1

我發現作爲「解決方案」的最接近的東西是使用JRuby,然後使用The Flying Saucer Project。我只是希望它能夠移植到Ruby,所以它可能是一個本地解決方案。上帝,我希望我在Java更好。

+0

[acts_as_flying_saucer](http://github.com/amardaxini/acts_as_flying_saucer)是飛碟庫的紅寶石端口 – Amar 2011-06-13 09:46:44

1
  • RPDF在其中你描述你的pdf作爲視圖。
  • 還有RTEX它使用(La)TeX來生成PDF的。
-1

我從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(); 
-1

不具體到紅寶石,但我發現這個最好的解決辦法是開源HTMLDOC

2

後經過大量血液汗水和淚水的我設法寫一個非常簡單的Rails應用程序,允許用戶通過TinyMce寫信函模板,然後這些保存,並且可以被看作是PDF文檔。

我決定儘可能限制wysiwyg編輯器中的選項,因爲有些選項並不像預期的那樣完全正常工作,但這沒什麼用處,如果需要,gsub-ing也無法解決。

有一個包裝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 

你會發現對特拉維斯比爾掛HTMLDOC網站更多的文檔。希望這可以幫助你順利完成任務,除非你的文件非常複雜,否則就足夠了。讓我們知道您的身體情況如何。

0

該項目可能停滯不前,但比薩(又名XHTML2PDF)是一個Python CSS,可以將CSS + HTML轉換爲PDF。在一個(低流量)的Rails應用中使用它作爲一個命令行工具,而且工作得很好。

-1

HTMLDOC

  • 將HTML轉換爲PDF;
  • 自由和開源(可用商業支持);
  • 可以用作...
    • ...獨立的應用程序,
    • ...批量文件處理,
    • ...或運行作爲基於web的服務;
  • 接口是CLI或GUI。
10

Try 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")) 
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