Générer des PDF à partir de Rails

le Wiki Ruby On Rails Liste un couple de librarie s qui facilitent PDF génération dans Rails . J'ai besoin d'imprimer des étiquettes d'adresse (en format lettre, donc 12-15 adresses par page) et je ne peux pas décider laquelle utiliser. Toutes les recommandations?

37
demandé sur Sebastian 2009-01-11 19:16:37

10 réponses

Crevette avec Prawnto pour vous. La DSL est un véritable plaisir, comme l'est la simplicité de pouvoir traiter PDF comme tout autre format dans un bloc de format respond_to:

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

il y a une vidéo tutorielle sur la crevette ici :

9
répondu btw 2012-10-15 19:33:55

il y a aussi RTeX . Cela fonctionne bien si vous êtes prêt à traduire en LaTeX d'abord. LaTeX est un très bon moyen de stocker des documents marqués. Cela dépend de la nature statique de chaque document. Si la plupart du document est dynamique, vous pourriez faire mieux avec Prawn ou PDF::Writer. Si la plus grande partie est statique, avec seulement quelques remplacements de texte pour chacun, LaTeX pourrait être un meilleur choix.

3
répondu James A. Rosen 2009-01-11 18:20:54

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

, Voici un lien vers le ruby gem pour HTMLDOC:

aussi, voici un bon guide pour rendre vue dans les rails au format pdf à l'aide de HTMLDOC:

2
répondu dhulihan 2010-12-22 23:28:19

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

2
répondu babttz 2012-10-02 14:41:00

j'ai utilisé à la fois PDF::Writer et Prawn et trouver la crevette beaucoup plus agréable à utiliser. Découvrez Ruby Mendiants pour un comparaison qui montre les joies de la Crevette w/r/t PDF::Écrivain.

en fait, il suffit de vérifier Ruby Mendicant de toute façon pour un grand design pattern pour la vie juste en tant que développeur.

1
répondu Abie 2009-02-02 09:14:05

la Crevette est le chemin à parcourir. Maintenant avec des étiquettes de crevettes qui est vraiment facile à faire.

découvrez le README du projet ici:

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

c'est un exemple super simple utilisé dans un contrôleur Rails. N'oubliez pas d'ajouter gem 'prawn-labels' à votre fichier 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
répondu Jordan 2012-08-28 12:22:58

bien que pas complètement ruby, vous pouvez utiliser OpenOffice .odt pour générer des PDF en combinant serenity et docsplit.

http://github.com/kremso/serenity

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

ou vous pouvez utiliser le gem clamsy qui utilise odt et cups-pdf pour générer le PDF.

http://github.com/ngty/clamsy

0
répondu JasonOng 2010-04-29 07:27:33

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

pour générer des rapports PDF avec style de table intégré (opinionated), en-têtes, etc., vous pouvez utiliser le report gem - check out générer pdf à partir de Rails 3-Quel outil Choisir? pour un exemple d'utilisation.

0
répondu Seamus Abshere 2017-05-23 11:54:24

j'ai utilisé soucoupe volante pour la génération pdf de html. C'est une bibliothèque java, mais vous pouvez utiliser le Joyau du Pont Ruby-Java pour y accéder dans votre application rails. Il est conforme CSS 2.1 et a quelques ajouts de css3 pour permettre un contrôle supplémentaire sur la pagination. Je le recommande car il ne nécessite pas de mettre 'Code pdf' dans votre html, vous pouvez utiliser les mêmes vues et les partiels pour afficher sur le navigateur que vous le faites pour générer des PDF.

Soucoupe Volante: https://github.com/flyingsaucerproject/flyingsaucer

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

j'utilise ce code de module pour générer le pdfs

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/" +  + '"' } # re-route absolute paths
    html_string.gsub!( /url\(["']+([^:]+?)["']/i ) { |m| "url\(\"file:///#{RAILS_ROOT}/public/" +  + '"' } # 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="' + .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'appelant avec ce code:

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
répondu theirongiant 2013-04-10 10:14:06