2008-12-10 60 views
53

Cách tốt nhất và dễ nhất để lấy HTML và chuyển đổi nó thành một tệp PDF, tương tự như sử dụng CFDOCUMENT trên ColdFusion là gì?Rails: Chuyển đổi HTML sang PDF?

CẬP NHẬT: Tôi thực sự đánh giá cao tất cả nhận xét và đề xuất mà mọi người đã đưa ra cho đến nay, tuy nhiên tôi cảm thấy rằng mọi người để lại câu trả lời của họ bị thiếu điểm.

1) giải pháp phải là nguồn mở miễn phí. một người đã đề xuất sử dụng pricexml và pd4ml khác. cả hai giải pháp này đều tốn tiền (pricexml chi phí một cánh tay và một chân) mà tôi không phải về ngã ba.

2) họ phải có khả năng nhận html (hoặc từ tệp, url hoặc biến chuỗi) và sau đó tạo bản pdf. các thư viện như tôm, rprf, rtex được sản xuất bằng cách sử dụng các phương pháp riêng của chúng và không tham gia vào html.

xin đừng nghĩ rằng tôi vô ơn vì những gợi ý, nó chỉ là thế hệ pdf có vẻ như là một vấn đề thực sự đối với những người như tôi, những người sử dụng Coldfusion nhưng muốn chuyển sang Rails.

+0

https://github.com/itkin/proselytism.git – nicolas

+0

Vậy tại sao bạn downvote HTMLDOC sau đó? –

Trả lời

60

Đá quý, WickedPDF, không chính xác.

+1

bạn thưa bạn là người đàn ông. Chính xác những gì tôi đang tìm kiếm! – rip747

+1

tôi đã thử nhấp vào liên kết một vài lần, nhưng sau đó tôi bị mất theo dõi những gì đang diễn ra (lạ). Sau đó, tôi đã thử sao chép dán liên kết và nó hoạt động. Nếu bạn nhận được% 5f trong url được dán, chỉ cần thay thế bằng dấu gạch dưới. –

+0

Điều này có được ưu tiên hơn PDFKit không? – Matt

-1

Nếu bạn muốn có chất lượng thực sự tốt (suy nghĩ, bố cục thích hợp/CSS vv), bạn cần tạo quy trình nhúng trình duyệt web thực để hiển thị và in qua trình điều khiển máy in PDF.

+0

thực sự tôi không nghĩ rằng sẽ là giải pháp tốt nhất vì hầu hết các trang web có một phong cách "in" cho họ để loại bỏ các yếu tố của trang web. – rip747

-1

Có chắc chắn không có cách nào trực tiếp để làm điều này trong Ruby (ít nhất là không có khi tôi đã cố gắng để làm điều đó vài tháng trước đây). Nếu bạn thực sự không thể tránh tạo các tệp PDF của mình từ html, bạn có thể nên xem xét một số công cụ hoặc dịch vụ bên ngoài cho mục đích này.

Chúc may mắn!

1

Điều gần nhất tôi thấy là "giải pháp" cho điều này là sử dụng JRuby và sau đó sử dụng The Flying Saucer Project. Tôi chỉ ước rằng nó sẽ được chuyển sang Ruby để nó có thể là một giải pháp bản địa. Chúa ơi, tôi ước tôi giỏi hơn ở Java.

+0

[actions_as_flying_saucer] (http://github.com/amardaxini/acts_as_flying_saucer) là một cổng ruby ​​của thư viện đĩa bay – Amar

1
  • RPDF trong đó bạn mô tả pdf của mình dưới dạng chế độ xem.
  • Ngoài ra còn có RTEX sử dụng (La) TeX để tạo pdf.
-1

tôi đang cố gắng thư viện từ www.pd4ml.com

đây là một mã snip ....

tôi kéo trong html vào nội dung String. Sau đó, tôi làm một vài điều như thay thế các nút radio bằng hộp kiểm và sau đó chạy nó thông qua thư viện pd4ml để hiển thị pdf.
Kết quả trông khá giống với trang gốc ....

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

Không cụ thể với Ruby, nhưng giải pháp tốt nhất tôi đã tìm thấy đây là mã nguồn mở HTMLDOC.

2

Sau khi rất nhiều mồ hôi máu và nước mắt, tôi đã viết một ứng dụng đường ray khá đơn giản cho phép người dùng viết mẫu thư qua TinyMce, sau đó được lưu và có thể xem dưới dạng tài liệu pdf.

Tôi đã quyết định hạn chế các tùy chọn trong trình chỉnh sửa wysiwyg càng nhiều càng tốt vì một số tùy chọn không hoạt động chính xác như mong đợi, nhưng không có gì khó hiểu nếu cần.

Có một viên ngọc ruby ​​rằng kết thúc tốt đẹp HTMLDOC mà bạn sẽ cần: PDF::HTMLDoc

Khi bạn đã có điều đó, đăng ký loại mime, sau đó bạn có thể làm một cái gì đó như:

@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 

Trong bộ điều khiển ứng dụng tôi đã thêm phương thức render_to_pdf như:

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 

Bạn sẽ tìm thấy thêm tài liệu trên trang HTMLDOC mà Travis Beale liên kết tới. Hy vọng điều này sẽ giúp bạn có được trên con đường của bạn và trừ khi tài liệu của bạn là thực sự phức tạp, nó là đủ. Hãy cho chúng tôi biết bạn lấy như thế nào.

0

Dự án có thể đã bị trì trệ, nhưng Pisa (còn gọi là XHTML2PDF) là một thư viện Python làm CSS + HTML thành PDF. sử dụng nó trong một ứng dụng Rails (lưu lượng thấp) một thời gian ngắn bằng cách lái nó như một công cụ dòng lệnh - đã làm việc khá tốt.

-1

HTMLDOC?

  • chuyển đổi HTML sang PDF;
  • Nguồn mở và miễn phí (hỗ trợ thương mại có sẵn);
  • có thể được sử dụng như ...
    • ... độc lập ứng dụng,
    • ... để chế biến tài liệu hàng loạt,
    • ... hoặc chạy như một dịch vụ dựa trên web;
  • Giao diện
  • là CLI hoặc GUI.
3

Tôi biết câu hỏi này là gần 5 tuổi vào thời điểm này. Tuy nhiên, các tùy chọn mới có sẵn.

Hãy thử tôm! https://github.com/adeven/shrimp

10

Try WickedPDF, trình tạo trình tạo PDF (từ HTML).

Dưới đây là ví dụ

gem 'wicked_pdf' 
gem 'wkhtmltopdf-binary' 
#wicked_pdf is a wrapper for wkhtmltopdf, you'll need to install that, too 

Trong điều khiển của bạn (tôi cho là bạn đang ở trong chương trình phương pháp):

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 

Theo quan điểm của bạn để liên kết PDF

= link_to 'Download Pdf', you_show_path(@uour_object, format: :pdf) 

Nếu bạn muốn để gửi pdf trong tập tin đính kèm email, đầu tiên lưu tập tin pdf của bạn trong thư mục công cộng hoặc tạm thời sau đó trong lớp gửi thư (ví dụ như trong bưu phẩm/e _mailer.rb)

attachments["test.pdf"] = File.read(Rails.root.join('public',"test.pdf")) 
mail(:to => to, :cc => cc , :subject => "subject") 

Sau khi gửi email bạn có thể xóa tập tin

File.delete(Rails.root.join("public", "test.pdf")) 
+0

Đây là câu trả lời đúng – Abs

+0

tại sao bạn tạo một 'pdf' var? –

+0

@ArnoldRoa để biết thêm chi tiết, bạn có thể theo liên kết này https://github.com/mileszs/wicked_pdf#super-advanced-usage –

0

Tôi muốn đề nghị bạn HTML để giải pháp PDF bằng cách https://grabz.it.

Chúng có API ảnh chụp màn hình rất linh hoạt và dễ sử dụng, có thể được sử dụng bởi bất kỳ loại ứng dụng Ruby nào.

Nếu bạn muốn thử nó, lúc đầu bạn sẽ nhận được sự cho phép app key + secretdevelopment free SDK

Sau đó, trong ứng dụng của bạn, các bước thực hiện sẽ là:

//initialization  
require 'grabzit' 
grabzItClient = GrabzIt::Client.new("APPLICATION KEY", "APPLICATION SECRET") 

//capturing the url to PDF 
grabzItClient.url_to_pdf("http://www.google.com") 

Tiếp theo là tiết kiệm. Bạn có thể sử dụng một trong hai tiết kiệm phương pháp, save nếu xử lý gọi lại truy cập có sẵn:

grabzItClient.save("http://www.example.com/handler/index") 

save_to nếu bạn cần một đồng bộ tiết kiệm (trong đó sẽ buộc ứng dụng của bạn phải chờ trong khi ảnh chụp màn hình được tạo ra):

filepath = "images/result.jpg" 
grabzItClient.save_to(filepath) 

Kiểm tra tài liệu cho details về việc lưu.

Đó là tất cả. Có thể nhận các loại ảnh chụp màn hình khác như image screenshots.