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?
Le meilleur que j'ai vu jusqu'à présent est Prawn:
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 :
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.
Il y a aussi PDFKit . C'est assez intéressant aussi.
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:
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.
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"
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
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.
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.