web-dev-qa-db-fra.com

Rails: Convertir HTML en PDF?

Quel est le moyen le plus simple et le plus simple de convertir HTML en HTML, de manière similaire à l'utilisation de CFDOCUMENT sur ColdFusion?

MISE À JOUR: J'apprécie vraiment tous les commentaires et suggestions que les gens ont formulés jusqu'à présent, mais j'estime que les personnes qui laissent leurs réponses manquent le point.

1) la solution doit être libre ou ouverte. Une personne a suggéré d'utiliser pricexml et l'autre pd4ml. Ces deux solutions coûtent de l'argent (pricexml coûte un bras et une jambe) que je ne suis pas sur la fourchette.

2) ils doivent être capables de prendre en HTML (à partir d’un fichier, d’une URL ou d’une variable chaîne) et de produire ensuite le pdf. Les bibliothèques telles que prawn, rprf, rtex sont produites en utilisant leurs propres méthodes et en ne prenant pas le langage HTML.

s'il vous plaît, ne pensez pas que je suis ingrat pour les suggestions, c'est simplement que la génération pdf semble être un réel problème pour les personnes comme moi qui utilisent ColdFusion mais souhaitent se convertir à Rails.

56
rip747

Le bijou, WickedPDF , fait exactement cela.

60
Sebastian

La meilleure chose à l’heure actuelle est PDFKit pour ce travail:

14
fl00r

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

Voici un 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 dans la méthode show):

    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

A votre avis pour PDF link

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

Si vous souhaitez envoyer un fichier PDF en pièce jointe à un e-mail, enregistrez d'abord votre fichier pdf dans un dossier public ou temporaire, 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 avoir envoyé un email, vous pouvez supprimer le fichier

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

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

3
Michael Irey

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

J'ai décidé de limiter autant que possible les options dans l'éditeur wysiwyg, car certaines options ne fonctionnent pas exactement comme prévu, mais rien de plus qu'un petit problème ne pourrait résoudre si nécessaire.

Il existe un bijou Ruby qui englobe HTMLDOC dont vous aurez besoin: PDF :: HTMLDoc

Une fois que vous avez cela, enregistrez le type mime, vous pouvez alors 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 ceci:

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

Vous trouverez plus de documentation sur le site HTMLDOC à laquelle Travis Beale est lié. J'espère que cela vous aidera à vous mettre en route et que si vos documents sont vraiment compliqués, cela devrait suffire. Fais nous savoir comment tu reussis.

2
tsdbrown

La solution la plus proche que j'ai trouvée est d'utiliser JRuby, puis The Flying Saucer Project . Je souhaite juste que cela soit porté sur Ruby afin que ce soit une solution native. Dieu, j'aimerais être meilleur à Java.

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

Le projet a peut-être stagné, mais Pisa (alias XHTML2PDF ) est une lib Python qui gère CSS + HTML en PDF. utilisé dans une application Rails (à faible trafic) il y a longtemps en utilisant l'outil de ligne de commande - fonctionnait plutôt bien.

0
Thomas

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

Ils ont une API de capture d'écran très flexible et simple à utiliser qui peut être utilisée par tout type d'application Ruby.

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

Ensuite, dans votre application, les étapes de mise en œuvre 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")   

Suivant est la sauvegarde. Vous pouvez utiliser l'une des deux méthodes de sauvegarde, save si le descripteur 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 obligera votre application à attendre pendant la création de la capture d'écran):

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

Consultez la documentation pour détails à propos de la sauvegarde.

C'est tout. Il est également possible d’obtenir d’autres types de captures d’écran, telles que captures d’image .

0
Stas