2008-12-10 21 views
53

¿Cuál es la mejor y más fácil forma de tomar HTML y convertirlo a PDF, similar al uso de CFDOCUMENT en ColdFusion?Rieles: ¿Convertir HTML a PDF?

ACTUALIZACIÓN: Realmente aprecio todos los comentarios y sugerencias que la gente ha dado hasta ahora, sin embargo, siento que las personas que dejan sus respuestas están perdiendo el sentido.

1) la solución debe ser gratuita o de fuente abierta. una persona sugirió usar pricexml y el otro pd4ml. Ambas soluciones cuestan dinero (pricexml cuesta un brazo y una pierna) y no me refiero al tenedor.

2) deben poder tomar html (ya sea desde un archivo, url o una variable de cadena) y luego generar el pdf. bibliotecas como gamba, rprf, rtex se producen usando sus propios métodos y no tomando html.

por favor no crean que soy desagradecido por las sugerencias, es solo que la generación de PDF parece ser un problema para las personas como yo que usan ColdFusion pero que quieren convertir a Rails.

+0

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

+0

Entonces, ¿por qué downvote HTMLDOC entonces? –

Respuesta

60

La gema, WickedPDF, hace exactamente eso.

+1

usted señor es el hombre. ¡Exactamente lo que estaba buscando! – rip747

+1

intenté hacer clic en el enlace un par de veces, pero luego perdí la pista de lo que estaba pasando (extraño). Luego intenté copiar y pegar el enlace, y funcionó. Si obtiene un% 5f en la URL pegada, simplemente reemplácelo con un guión bajo. –

+0

¿Se prefiere esto a PDFKit? – Matt

-1

Si quiere tener una calidad realmente buena (piense, diseño adecuado/CSS, etc.) necesita crear un proceso que incruste un navegador web real, dejándolo fuera de pantalla e imprimiéndolo a través de un controlador de impresora PDF.

+0

en realidad, no creo que sea la mejor solución, ya que la mayoría de los sitios web tienen un estilo de "impresión" para eliminar elementos del sitio. – rip747

-1

No hay manera directa de hacer esto en Ruby (al menos no cuando estaba tratando de hacerlo hace unos meses). Si realmente no puede evitar generar sus pdfs desde html, probablemente deba buscar algunas herramientas o servicios externos para este fin.

¡Buena suerte!

1

Lo más parecido que encontré como una "solución" a esto es usando JRuby y luego usando The Flying Saucer Project. Solo desearía que se transfiera a Ruby para que sea una solución nativa. Dios, desearía ser mejor en Java.

+0

[acts_as_flying_saucer] (http://github.com/amardaxini/acts_as_flying_saucer) es un puerto de rubí de la biblioteca de platillo volador – Amar

1
  • Hay RPDF en el que usted describe su pdf como una vista.
  • También está RTEX que usa (La) TeX para generar archivos PDF.
-1

estoy tratando la biblioteca de www.pd4ml.com

que aquí hay una sección de código ....

me tire en el HTML en el contenido de la cadena. Luego hago un par de cosas como reemplazar los botones de radio con casillas de verificación y luego ejecutarlo a través de la biblioteca pd4ml para procesar el pdf.
el resultado es muy parecido a la página original ....

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

no específica a Ruby, pero la mejor solución que he encontrado que este es el código abierto HTMLDOC.

2

After Después de un montón de sangre sudada y lágrimas logré escribir una aplicación de rieles bastante simple que permite al usuario escribir plantillas de letras a través de TinyMce, estas se guardan y se pueden ver como documentos pdf.

Decidí restringir las opciones en el editor wysiwyg tanto como sea posible ya que algunas de las opciones no funcionan exactamente como se esperaba, pero eso no es nada que un poco de gsub-ing no podría resolver si fuera necesario.

Hay una gema de rubíes que envuelve HTMLDOC que necesitará: PDF::HTMLDoc

Una vez que tenga que registrar el tipo mime, a continuación, puede hacer algo como:

@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 

En el controlador de aplicación que he añadido el método render_to_pdf como:

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 

encontrará más documentación en el sitio HTMLDOC que Travis Beale vinculado. Espero que esto lo ayude a seguir su camino y, a menos que sus documentos sean realmente complicados, debería ser suficiente. Háganos saber cómo le va.

0

El proyecto puede haberse estancado, pero Pisa (también conocido como XHTML2PDF) es una lib de Python que hace CSS + HTML a PDF. lo usé en una aplicación de Rails (de poco tráfico) hace un tiempo al manejarlo como una herramienta de línea de comandos, funcionó bastante bien.

-1

HTMLDOC?

  • convierte HTML a PDF;
  • Fuente libre y de código abierto (soporte comercial disponible);
  • se puede utilizar como ...
    • ... aplicación independiente,
    • ... para el procesamiento de lotes de documentos,
    • ... o correr como un servicio basado en la web;
  • interfaz es CLI o GUI.
10

Try WickedPDF, plugin de generador de PDF (desde HTML).

Aquí es ejemplo

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

en su controlador (se supone que está en el método de demostración):

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 

En su opinión de enlace PDF

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

Si desea para enviar un archivo PDF en un archivo adjunto de correo electrónico, primero guarde su archivo PDF en una carpeta pública o temporal y luego en la clase de correo (por ejemplo, en los correos/e _mailer.rb)

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

Después de enviar e-mail se puede eliminar el archivo

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

Esta es la verdadera respuesta – Abs

+0

¿por qué creas una var 'pdf'? –

+0

@ArnoldRoa para obtener más información, puede seguir este enlace https://github.com/mileszs/wicked_pdf#super-advanced-usage –

0

me gustaría sugerir el código HTML a PDF solución por https://grabz.it.

Tienen una API de captura de pantalla muy flexible y fácil de usar que puede ser utilizada por cualquier tipo de aplicación Ruby.

Si quieres probarlo, en un primer momento que debe obtener la autorización app key + secret y la development free SDK

Luego, en su aplicación, los pasos de implementación sería:

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

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

El siguiente es el ahorro. Puede utilizar uno de los dos Guardar métodos, save si manija de devolución de llamada accesibles disponibles:

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

Y save_to si necesita una sincrónica guardar (lo que obligará a la aplicación que esperar mientras se crea la captura de pantalla):

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

Consulte la documentación para details sobre el guardado.

Eso es todo. También es posible obtener otros tipos de capturas de pantalla como image screenshots.