Rails: Convertir HTML en PDF?

Quelle est la meilleure et la plus simple façon de prendre du HTML et de le convertir en PDF, de la même manière que CFDOCUMENT sur ColdFusion?

MISE À JOUR: J’apprécie vraiment tous les commentaires et suggestions que les gens ont donnés jusqu’ici, mais je pense que les gens qui quittent leurs réponses manquent le point.

1) la solution doit être gratuite ou ouverte. une personne a suggéré d’utiliser pricexml et l’autre pd4ml. Ces deux solutions coûtent de l’argent (prix xml coûtant un arm et une jambe), ce qui ne me concerne pas.

2) ils doivent être capables de prendre en HTML (soit à partir d’un fichier, d’une URL ou d’une variable de chaîne), puis de produire le pdf. les bibliothèques comme les crevettes, rprf, rtex sont produites en utilisant leurs propres méthodes et ne prennent pas en HTML.

S’il vous plaît, ne pensez pas que je suis ingrat pour les suggestions, c’est juste que la génération de pdf semble être un problème pour des gens comme moi qui utilisent ColdFusion mais veulent convertir en Rails.

La gemme, WickedPDF , fait exactement cela.

La meilleure chose aujourd’hui est PDFKit pour ce travail:

Essayez le plugin WickedPDF , générateur PDF (à partir de HTML).

Voici l’exemple

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

Dans votre contrôleur (je suppose que vous êtes en mode show):

  respond_to do |format| format.html format.pdf do pdf = render_to_ssortingng :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 

À votre avis pour le lien PDF

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

Si vous voulez envoyer un pdf en pièce jointe, sauvegardez d’abord votre fichier pdf dans le dossier public ou temp puis dans la classe mailer (par exemple dans mailers / e_mailer.rb)

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

Après l’envoi de l’email, vous pouvez supprimer le fichier

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

Je sais que cette question a presque 5 ans à ce stade. Cependant, de nouvelles options sont disponibles.

Essayez les crevettes! https://github.com/adeven/shrimp

Après beaucoup de sueur et de larmes de sang, j’ai réussi à écrire une application de rails assez simple qui permet à l’utilisateur d’écrire des modèles de lettres via TinyMce , ceux-ci sont ensuite enregistrés et peuvent être visualisés sous forme de documents pdf.

J’ai décidé de restreindre autant que possible les options de l’éditeur wysiwyg, car certaines des options ne fonctionnaient pas exactement comme prévu, mais rien ne pouvait être résolu si nécessaire.

Il y a un bijou ruby ​​qui encapsule HTMLDOC dont vous aurez besoin: PDF :: HTMLDoc

Une fois que vous avez cela, enregistrez le type MIME, puis vous pouvez faire quelque chose comme:

 @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 

Dans le contrôleur d’application, j’ai ajouté la méthode render_to_pdf comme:

 def render_to_pdf(options =nil) data = render_to_ssortingng(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 

Vous trouverez plus de documentation sur le site HTMLDOC auquel Travis Beale est lié. J'espère que cela vous aidera à progresser et à moins que vos documents ne soient vraiment compliqués, cela devrait suffire. Fais nous savoir comment tu reussis.

  • Il y a RPDF dans lequel vous décrivez votre pdf comme vue.
  • Il y a aussi RTEX qui utilise (La) TeX pour générer des pdf.

La chose la plus proche que j’ai trouvée en tant que “solution” à ceci est en utilisant JRuby et ensuite en utilisant le projet de soucoupe volante . Je souhaite juste que cela soit transféré à Ruby pour que ce soit une solution native. J’espère que j’aurais été mieux à Java.

Le projet a peut-être stagné, mais Pisa (alias XHTML2PDF ) est une librairie Python qui utilise CSS + HTML au format PDF. l’ont utilisé dans une application Rails (à faible trafic) il ya quelque temps en le pilotant en tant qu’outil de ligne de commande – cela a plutôt bien fonctionné.

Je voudrais vous suggérer la solution HTML vers PDF par https://grabz.it .

Ils disposent d’une API de capture d’écran très flexible et simple d’utilisation, utilisable par n’importe quel type d’application Ruby.

Si vous voulez l’essayer, vous devez d’abord obtenir la clé de l’application d’ autorisation + secret et le SDK sans développement.

Ensuite, dans votre application, les étapes d’implémentation seraient les suivantes:

 //initialization require 'grabzit' grabzItClient = GrabzIt::Client.new("APPLICATION KEY", "APPLICATION SECRET") //capturing the url to PDF grabzItClient.url_to_pdf("http://www.google.com") 

La prochaine est l’économie. Vous pouvez utiliser l’une des deux méthodes de save , save si un handle de rappel accessible est disponible:

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

Et save_to si vous avez besoin d’une sauvegarde synchrone (ce qui forcera votre application à attendre que la capture d’écran soit créée):

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

Consultez la documentation pour plus de détails sur la sauvegarde.

C’est tout. Il est possible d’obtenir d’autres types de captures d’écran, telles que des captures d’écran d’ images .

Si vous voulez avoir une très bonne qualité (pensez à une bonne mise en page / CSS, etc.), vous devez créer un processus intégrant un véritable navigateur Web pour le rendre hors écran et l’imprimer via un pilote d’imprimante PDF.

Il n’y a aucun moyen direct de le faire dans Ruby (au moins, il n’y en avait pas quand j’essayais de le faire il y a quelques mois). Si vous ne pouvez vraiment pas éviter de générer vos fichiers PDF à partir de HTML, vous devriez probablement chercher des outils ou des services externes à cette fin.

Bonne chance!

J’essaie la bibliothèque de http://www.pd4ml.com

voici un code snip ….

Je tire le HTML dans le contenu de la chaîne. Ensuite, je fais deux choses comme remplacer les boutons radio par des cases à cocher et ensuite les exécuter à travers la bibliothèque pd4ml pour rendre le pdf.
Le résultat ressemble beaucoup à la page originale ….

  Ssortingng content = nextPage.generateResponse().contentSsortingng(); 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(); Ssortingng 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); SsortingngReader isr = new SsortingngReader(content); baos = new ByteArrayOutputStream(); html.render( isr, baos); PDFRegForm pdfForm = (PDFRegForm)pageWithName("PDFRegForm"); pdfForm.baos = baos; pdfForm.generateResponse(); 

Avez-vous essayé de regarder html2pdf? la page d’accueil est http://html2pdf.seven49.net/Web/

Il en existe également un projet sourceforge.

Alan

HTMLDOC

  • convertit le HTML en PDF;
  • Free et Open Source (support commercial disponible);
  • peut être utilisé comme …
    • … application autonome,
    • … pour le traitement des documents par lots,
    • … ou fonctionner comme un service Web;
  • l’interface est CLI ou GUI.

Non spécifique à Ruby, mais la meilleure solution que j’ai trouvée est le code HTML open source.