ruby-on-rails - rails - wicked pdf example
Rieles: ¿Convertir HTML a PDF? (15)
¿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?
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 no están entendiendo el punto.
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.
¿Has probado mirar html2pdf? la página de inicio es http://html2pdf.seven49.net/Web/
También hay un proyecto de sourceforge de él.
Alan
Después Después de mucha 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í que envuelve HTMLDOC que necesitará: PDF::HTMLDoc
Una vez que lo tienes, registra el tipo de mimo, entonces puedes 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 la aplicación agregué 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 con la que Travis Beale Linked. 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.
Estoy intentando la biblioteca de www.pd4ml.com
aquí hay un fragmento de código ...
Tomo el html en el contenido de String. 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 se parece mucho 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();
La gema, WickedPDF , hace exactamente eso.
Lo más parecido que encontré como una "solución" a esto es usar JRuby y luego usar 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.
Lo mejor hoy en día es PDFKit para este trabajo:
Me gustaría sugerirle la solución de HTML a PDF 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, al principio deberías obtener la clave de la aplicación de autorización + secreto y el SDK gratis de desarrollo.
Luego, en su aplicación, los pasos de implementación serían:
//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 usar uno de los dos métodos de save
, save
si está disponible el manejador de devolución de llamada accesible:
grabzItClient.save("http://www.example.com/handler/index")
Y save_to
si necesita guardar de forma síncrona (lo que obligará a su aplicación a 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 capturas de pantalla de imágenes.
Sé que esta pregunta tiene casi 5 años en este punto. Sin embargo, hay nuevas opciones disponibles.
Prueba Camarón! https://github.com/adeven/shrimp
Seguro que no hay una 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!
Si desea 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.
WickedPDF , generador de PDF (desde HTML).
Aquí hay un ejemplo
gem ''wicked_pdf''
gem ''wkhtmltopdf-binary''
#wicked_pdf is a wrapper for wkhtmltopdf, you''ll need to install that, too
En tu controlador (supongo que estás en el método de mostrar):
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 vista para el enlace PDF
= link_to ''Download Pdf'', you_show_path(@uour_object, format: :pdf)
Si desea enviar un archivo PDF por correo electrónico adjunto, primero guarde su archivo PDF en una carpeta pública o temporal y luego en la clase de correo (por ejemplo, en mailers / 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 un correo electrónico, puede eliminar el archivo
File.delete(Rails.root.join("public", "test.pdf"))
HTMLDOC ?
- convierte HTML a PDF;
- Libre y de código abierto (soporte comercial disponible);
- se puede usar como ...
- ...aplicación independiente,
- ... para el procesamiento de documentos por lotes,
- ... o ejecutar como un servicio basado en la web;
- la interfaz es CLI o GUI.