Ответ 1
Новый ответ на старый вопрос, если другие спотыкаются на это: WickedPDF (который использует wkhtmltopdf, как PDFkit) делает это мгновенно.
Мне нужно иметь возможность отображать некоторые представления в виде PDF файлов из проекта Rails 3. Я никогда раньше не использовал методы генерации PDF с рубинами/рельсами, поэтому я исследовал несколько популярных подходов, таких как Prawn и PDF:: Writer, но все примеры и статьи, которые я нашел до сих пор, выглядят устаревшими и применимы только для рельсов 2.x, Я еще не видел рабочий пример Rails3; попробовал самостоятельно установить креветку и драгоценные камни prawnto и воспроизвести пример, описанный в этот эпизод Railscasts, но я получаю ошибку в методе prawnto, который не распознается. Я не уверен, была ли это ошибкой реализации или просто признаком несовместимости, но, увидев, что другие люди делятся в Интернете, что креветка больше не работает для них в Rails3, я больше не стал отслеживать код.
Кто-нибудь нашел надежное решение для создания PDF файлов в Rails3? Не могли бы вы поделиться им или указать на внешние ресурсы и документацию? Большое спасибо!
Новый ответ на старый вопрос, если другие спотыкаются на это: WickedPDF (который использует wkhtmltopdf, как PDFkit) делает это мгновенно.
Prawn работает с Rails 3. Я лично использовал его без проблем. Вам нужно получить последние версии gem и prawnto плагин для рельсов.
PDFkit имеет то преимущество, что использует механизм рендеринга Webkit, поэтому вы можете использовать CSS для определения своих макетов, и вы получаете бесплатные веб-страницы с Safari и Chrome. У этого есть немного более хорошая кривая обучения чем Креветка.
Вы видели PDFkit? Я уверен, что работает с Rails 3, это часть промежуточного ПО Rack, которая может конвертировать любую HTML-страницу в PDF, которая соответствует маршруту, заканчивающемуся на .pdf
О кревете, вот бесшовная интеграция для Rails 3, которая, кажется, работает очень хорошо: https://github.com/Whoops/prawn-rails
Вы можете использовать Report gem, который генерирует PDF, а также XLSX и CSV.
# a fake Manufacturer class - you probably have an ActiveRecord model
Manufacturer = Struct.new(:name, :gsa)
require 'report'
class ManufacturerReport < Report
table 'Manufacturers' do # you can have multiple tables, which translate into multiple sheets in XLSX
head do
row 'Manufacturer report'
end
body do
rows :manufacturers
column 'Name', :name
column 'GSA?', :gsa
end
end
# you would want this so that you can pass in an array
# attr_reader :manufacturers
# def initialize(manufacturers)
# @manufacturers = manufacturers
# end
def manufacturers
[
Manufacturer.new('Ford', true),
Manufacturer.new('Fischer', false),
Manufacturer.new('Tesla', nil),
]
end
end
Когда вы вызываете report.pdf.path
, в каталоге tmp создается PDF файл:
report = ManufacturerReport.new
puts report.pdf.path #=> /tmp/185051406_Report__Pdf.pdf
puts report.xlsx.path #=> /tmp/185050541_Report__Xlsx.xlsx
Вы можете сделать это в своем контроллере, например:
@manufacturers = Manufacturer.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @manufacturers }
format.pdf do
report = ManufacturerReport.new(@manufacturers) # using the commented-out code
send_file report.pdf.path, :type => 'application/pdf', :disposition => 'attachment', :filename => 'ManufacturersReport.pdf'
# tmp files are periodically cleaned up by the operating system, but if you want to be extra clean you can call
# report.cleanup
# but this may remove the tmp files before apache/nginx/etc. finishes delivering the file
end
end
Конечный результат:
XLSX
Обратите внимание, что XLSX автоматически добавляет автофильтр.