Создать PDF из Rails - PullRequest
       44

Создать PDF из Rails

37 голосов
/ 11 января 2009

Вики Ruby On Rails перечисляют пару библиотек , которые облегчают генерацию PDF в Rails . Мне нужно распечатать адресные этикетки (в буквенном формате, таким образом, 12-15 адресов на страницу) и не могу решить, какой из них использовать. Любые рекомендации?

Ответы [ 10 ]

42 голосов
/ 11 января 2009
9 голосов
/ 11 января 2009

Креветка с Prawnto точно. DSL - настоящее удовольствие, равно как и простота возможности обрабатывать PDF как любой другой формат в блоке формата response_to:

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

Здесь есть обучающее видео по креветкам здесь :

3 голосов
/ 11 января 2009

Там также RTeX . Это хорошо работает, если вы готовы сначала перевести на LaTeX . LaTeX - очень хороший способ хранения размеченных документов. Это зависит только от того, насколько статичен каждый документ. Если большая часть документа является динамической, вы можете лучше использовать Prawn или PDF :: Writer. Если большинство из них статические, с несколькими заменами текста для каждого, LaTeX может быть лучшим выбором.

2 голосов
/ 02 октября 2012

Существует также PDFKit . Это тоже довольно интересно.

2 голосов
/ 23 декабря 2010

Если вы не делаете ничего слишком сложного, вы также можете использовать HTMLDOC, который преобразует базовый HTML в PDF. Это избавляет вас от необходимости изучать собственный синтаксис макета (как в случае с Prawn). Это может избавить вас от головной боли :)

Вот ссылка на гем ruby ​​для HTMLDOC:

Кроме того, вот хорошее руководство для рендеринга представления в рельсах в pdf с использованием HTMLDOC:

1 голос
/ 16 октября 2009

Креветка - это путь. Теперь с этикетками креветок, которые действительно легко сделать.

Ознакомьтесь с README проекта здесь:

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

Это очень простой пример, используемый в контроллере Rails. Не забудьте добавить gem 'prawn-labels' в ваш 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 голос
/ 11 января 2009

Я использовал PDF :: Writer и Prawn и считаю Prawn гораздо более приятным в использовании. Проверьте Ruby Mendicant для сравнения , которое демонстрирует радости Prawn w / r / t PDF :: Writer.

На самом деле, в любом случае, просто посмотрите на Ruby Mendicant для отличного шаблона проектирования для правильной жизни разработчика.

0 голосов
/ 10 апреля 2013

Я использовал летающую тарелку для создания PDF из HTML. Это библиотека java, но вы можете использовать гем Ruby-Java Bridge для доступа к нему в вашем приложении rails. Он совместим с css 2.1 и имеет несколько дополнений из css3, чтобы обеспечить дополнительный контроль над подкачкой. Я бы порекомендовал его, так как он не требует, чтобы вы добавили «pdf code» в ваш html, вы можете использовать те же представления и частичные значения для отображения в браузере, что и для создания pdf.

Летающая тарелка: https://github.com/flyingsaucerproject/flyingsaucer

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

Я использую этот код модуля для генерации 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

Вызывая это с кодом как это:

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 голосов
/ 09 апреля 2013

Для вашего случая использования, я согласен с большинством других ответов, что prawn - правильный выбор, потому что вам нужен контроль на уровне пикселей на выходе.

Для создания отчетов в формате PDF со встроенным (многоватым) стилем таблицы, заголовками и т. Д. Вы можете использовать report gem - проверить Создать PDF из Rails 3 - какой инструмент выбрать? для примера использования.

0 голосов
/ 29 апреля 2010

Хотя это и не совсем ruby, вы можете использовать OpenOffice .odt для создания PDF-файлов, сочетая спокойствие и docsplit.

http://github.com/kremso/serenity

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

Или вы можете использовать драгоценный камень, который использует odt и cups-pdf для генерации PDF.

http://github.com/ngty/clamsy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...