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?
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 :
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.
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:
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.
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"
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.
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.
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