web-dev-qa-db-fra.com

Produire PDF de Rails

Le _ { Ruby on Rails Wiki répertorie quelques bibliothèques } qui facilitent la génération PDF dans Rails. Je dois imprimer des étiquettes d’adresse (au format lettre, soit 12 à 15 adresses par page) et je ne peux pas choisir laquelle utiliser. Des recommandations?

37
Sebastian
42
Marston A.

Prawn with Prawnto for sure .. La DSL est un vrai régal, tout comme la simplicité de pouvoir traiter PDF comme n'importe quel autre format d'un bloc de format respond_to:

respond_to do |format|
format.pdf { render :layout => false }

Il y a un tutoriel vidéo sur Prawn ici :

9
btw

Il y a aussi RTeX . Cela fonctionne bien si vous souhaitez traduire vers LaTeX first. LaTeX est un très bon moyen de stocker des documents annotés. Cela dépend de la statique de chaque document. Si la majeure partie du document est dynamique, vous ferez peut-être mieux avec Prawn ou PDF :: Writer. Si la majeure partie est statique, avec seulement quelques remplacements de texte pour chacun, LaTeX pourrait être un meilleur choix.

3
James A. Rosen

Il y a aussi PDFKit . C'est assez intéressant aussi.

2
babttz

Si vous ne faites rien de trop complexe, vous pouvez également utiliser HTMLDOC, qui convertit le HTML de base en PDF. Cela vous évite d'avoir à apprendre davantage de syntaxe de mise en page propriétaire (comme dans le cas de Prawn). Cela pourrait vous éviter des maux de tête :) 

Voici un lien vers le joyau Ruby pour HTMLDOC:

En outre, voici un bon guide pour le rendu d'une vue dans Rails au format PDF à l'aide de HTMLDOC:

2
dhulihan

J'ai utilisé à la fois PDF :: Writer et Prawn et trouve Prawn beaucoup plus agréable à utiliser. Découvrez (Ruby Mendicant } _ pour une comparaison qui illustre les joies de Prawn w/r/t PDF :: Writer.

En fait, il suffit de regarder Ruby Mendicant de toute façon pour un excellent { modèle de conception } _ pour un moyen de subsistance convenable en tant que développeur.

1
Abie

La crevette est la voie à suivre. Maintenant, avec les étiquettes de crevettes, c'est très facile à faire.

Découvrez le README du projet ici:

https://github.com/jordanbyron/prawn-labels#readme

Ceci est un exemple très simple utilisé dans un contrôleur Rails. N'oubliez pas d'ajouter gem 'prawn-labels' à votre Gemfile.

names = %w{Jordan Kelly Greg Bob}

labels = Prawn::Labels.render(names, :type => "Avery5160") do |pdf, name|
  pdf.text name
end

send_data labels, :filename => "names.pdf", :type => "application/pdf"
1
Jordan

J'ai utilisé une soucoupe volante pour la génération pdf à partir de HTML. C'est une bibliothèque Java, mais vous pouvez utiliser le joyau Ruby-Java Bridge pour y accéder dans votre application Rails. Il est compatible css 2.1 et contient quelques ajouts de css3 pour permettre un contrôle supplémentaire de la pagination. Je le recommande car cela ne vous oblige pas à mettre du "code pdf" dans votre code html, vous pouvez utiliser les mêmes vues et partiels à afficher pour le navigateur que pour générer des fichiers PDF.

Flying Saucer: https://github.com/flyingsaucerproject/flyingsaucer

Ruby Java Bridge: http://rjb.rubyforge.org/

J'utilise ce code de module pour générer les fichiers PDF

require 'rubygems'
require 'rjb'

module Html2Pdf

  def self.included(controller)
      controller.send :helper_method, :create_pdf
  end

  def create_pdf(options = {})
      itext = "#{Rails_ROOT}/lib/html2pdf/jars/iText-2.0.8.jar"
      core_renderer = "#{Rails_ROOT}/lib/html2pdf/jars/core-renderer.jar"
      xerces = "#{Rails_ROOT}/lib/html2pdf/jars/xml-apis-xerces-2.9.1.jar" 
      joinchar = (Ruby_PLATFORM.include? 'mswin') ? ';' : ':'
          classpath = [itext, core_renderer, xerces].join(joinchar)
      Rjb::load(classpath, jvmargs=['-Djava.awt.headless=true'])
      if options[:htmlstring].nil?
      options[:layout] ||= false
          options[:template] ||= File.join(controller_path,action_name+".pdf.erb")
          html_string = render_to_string(:template => options[:template], :layout => options[:layout])
    else
          html_string = options[:htmlstring]
    end
    # Make all paths relative, on disk paths...
    html_string.gsub!(".com:/",".com/") # strip out bad attachment_fu URLs
    html_string.gsub!( /src=["']+([^:]+?)["']/i ) { |m| "src=\"file:///#{Rails_ROOT}/public/" + $1 + '"' } # re-route absolute paths
    html_string.gsub!( /url\(["']+([^:]+?)["']/i ) { |m| "url\(\"file:///#{Rails_ROOT}/public/" + $1 + '"' } # re-route absolute paths
    # Remove asset ids on images with a regex // tbh i can't remember what this line is for but i'm sure it did something awesome
    html_string.gsub!( /src=["'](\S+\?\d*)["']/i ) { |m| 'src="' + $1.split('?').first + '"' } 
    filename = "#{Rails_ROOT}/public/pdfs/"+options[:filename]+".pdf"
    fileOutputStream = Rjb::import('Java.io.FileOutputStream')
      iTextRenderer = Rjb::import('org.xhtmlrenderer.pdf.ITextRenderer')
      renderer = iTextRenderer.new
      renderer.setDocumentFromString(html_string)
      os = fileOutputStream.new(filename)
      renderer.layout()
      renderer.createPDF(os)
      os.close()
  end

end

L'appeler avec un code comme celui-ci:

def generate_pdf  
  htmlsrc = render_to_string(:partial => 'invoice', :layout => false)
  rnd = Time.now.to_s(:datentime).gsub!(/[\/ \.:]/,'')
  filename = "docstore/tmp_#{rnd}"
  create_pdf(:htmlstring => htmlsrc, :filename => filename)
  contents = open("#{Rails_ROOT}/public/pdfs/#{filename}.pdf", "rb") { |io| io.read }
  File.delete("#{Rails_ROOT}/public/pdfs/#{filename}.pdf")
  respond_to do | wants |
    wants.html { render :text => contents, :content_type => 'application/pdf' }
  end    
end
0
theirongiant

Pour votre cas d'utilisation, je suis d'accord avec la plupart des autres réponses pour dire que prawn est le bon choix, car vous avez besoin d'un contrôle au niveau du pixel sur la sortie.

Pour générer des rapports PDF avec un style de table (en-tête, etc.) intégré (avec opinion), vous pouvez utiliser la variable report gem - check out Generate pdf from Rails 3 - quel outil choisir? pour un exemple d'utilisation.

0
Seamus Abshere

Bien que n'étant pas complètement Ruby, vous pouvez utiliser OpenOffice .odt pour générer des PDF en combinant sérénité et docsplit.

http://github.com/kremso/serenity

http://documentcloud.github.com/docsplit/

Vous pouvez également utiliser la gemme moelleuse qui utilise odt et cups-pdf pour générer le fichier PDF.

http://github.com/ngty/clamsy

0
JasonOng