Generuj PDF z Rails

Ruby on Rails Wiki wymienia kilka bibliotek , które ułatwiają Generowanie PDF w Rails . Muszę wydrukować etykiety adresowe (w formacie literowym, czyli 12-15 adresów na stronę) i nie mogę zdecydować, który z nich użyć. Jakieś zalecenia?

Author: Sebastian, 2009-01-11

10 answers

 42
Author: Marston A.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-11 16:52:54

Krewetka z krewetką na pewno. DSL to prawdziwa uczta, podobnie jak prostota bycia w stanie traktować PDF jak każdy inny format w bloku formatu respond_to:

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

Jest tutorial video o krewetkach tutaj :

 9
Author: btw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-15 19:33:55

Jest też RTeX . To działa dobrze, jeśli chcesz najpierw przetłumaczyć na LaTeX. LaTeX to bardzo dobry sposób na przechowywanie oznakowanych dokumentów. To zależy tylko od tego, jak statyczny jest każdy dokument. Jeśli większość dokumentu jest dynamiczna, możesz zrobić lepiej z Prawn lub PDF:: Writer. Jeśli większość z nich jest statyczna, z kilkoma zamiennikami tekstu dla każdego, LaTeX może być lepszym wyborem.

 3
Author: James A. Rosen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-11 18:20:54

Jeśli nie robisz nic zbyt skomplikowanego, możesz również użyć HTMLDOC, który konwertuje podstawowy HTML na PDF. Zapobiega to konieczności poznawania bardziej zastrzeżonej składni układu (jak w przypadku krewetek). To może oszczędzić Ci bólów głowy:)

Oto link do ruby gem dla HTMLDOC:

Również, oto dobry przewodnik do renderowania widoku w rails do pdf przy użyciu HTMLDOC:

 2
Author: dhulihan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-22 23:28:19

Istnieje również PDFKit . To też całkiem interesujące.

 2
Author: babttz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-02 14:41:00

Użyłem zarówno PDF:: Writer, jak i krewetki i uważam krewetkę za znacznie przyjemniejszą w użyciu. Sprawdź Ruby Mendicant dla Porównanie które demonstruje radości krewetki w/R/T PDF::Writer.

Właściwie, po prostu sprawdź Ruby Mendicant i tak dla świetnego wzorca projektowego dla right livelihood jako programista.

 1
Author: Abie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 09:14:05

Krewetka to najlepszy sposób. Teraz z etykietami krewetek, które są naprawdę łatwe do zrobienia.

Zobacz README projektu tutaj:

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

Jest to bardzo prosty przykład użycia w sterowniku Rails. Nie zapomnij dodać gem 'prawn-labels' do swojego 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
Author: Jordan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-28 12:22:58

Choć nie do końca ruby, możesz użyć OpenOffice .ODT do generowania plików PDF poprzez połączenie serenity i docsplit.

Http://github.com/kremso/serenity

Http://documentcloud.github.com/docsplit/

LUB możesz użyć clamsy gem, który używa odt i cups-pdf do generowania pliku PDF.

Http://github.com/ngty/clamsy

 0
Author: JasonOng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-29 07:27:33

Jeśli chodzi o Twój przypadek użycia, zgadzam się z większością innych odpowiedzi, które prawn jest właściwym wyborem, ponieważ potrzebujesz kontroli na poziomie pikseli nad wyjściem.

Do generowania raportów PDF z wbudowanymi (opiniowanymi) stylami tabel, nagłówkami itp., możesz użyć report gem-sprawdź Generuj pdf z Rails 3 - Jakie narzędzie wybrać? na przykład jak używać.

 0
Author: Seamus Abshere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:24

Użyłem latającego spodka do generowania plików pdf z html. Jest to biblioteka java, ale możesz użyć Ruby-Java Bridge gem, aby uzyskać do niej dostęp w aplikacji rails. Jest zgodny z css 2.1 i ma kilka dodatków z css3, aby umożliwić dodatkową kontrolę nad stronicowaniem. Polecam go, ponieważ nie wymaga umieszczania "kodu pdf" w html, możesz użyć tych samych widoków i częściowych do wyświetlania w przeglądarce, tak jak do generowania plików PDF.

Latający Spodek: https://github.com/flyingsaucerproject/flyingsaucer

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

Używam tego kodu modułu do generowania plików 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

Wywołanie go kodem w ten sposób:

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
Author: theirongiant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-10 10:14:06