Ответ 1
Драгоценный камень WickedPDF, делает именно это.
Каков наилучший и простой способ переноса HTML и преобразования его в PDF файл, аналогичный использованию CFDOCUMENT на ColdFusion?
ОБНОВЛЕНИЕ: Я очень ценю все замечания и предложения, которые люди дали до сих пор, однако я чувствую, что люди, оставляющие свои ответы, не имеют смысла.
1) решение должно быть бесплатным или открытым. один человек предложил использовать pricexml и другой pd4ml. оба этих решения стоят денег (pricexml стоит рука и нога), которые я не про вилку.
2) они должны иметь возможность принимать html (либо из файла, url, либо строковой переменной), а затем производить pdf. библиотеки, такие как prawn, rprf, rtex, создаются с использованием собственных методов и не берут в html.
пожалуйста, не думайте, что я неблагодарен в отношении предложений, это просто то, что генерация PDF кажется действительно проблемой для таких людей, как я, которые используют ColdFusion, но хотят конвертировать в Rails.
Драгоценный камень WickedPDF, делает именно это.
Самая большая вещь в настоящее время - PDFKit для этой работы:
Попробуйте WickedPDF, модуль PDF-генератора (из HTML).
Вот пример
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'
#wicked_pdf is a wrapper for wkhtmltopdf, you'll need to install that, too
В вашем контроллере (я предположил, что вы находитесь в методе show):
respond_to do |format|
format.html
format.pdf do
pdf = render_to_string :pdf => 'test',
layout: 'pdf.html.erb',
template: 'show.pdf.slim',
header: { :right => '[page] of [topage]'},
margin: {top: 0,
bottom: 0,
left: 0,
right: 0},
outline: {outline: true,
outline_depth: 2}
end
end
В вашем представлении для ссылки в формате PDF
= link_to 'Download Pdf', you_show_path(@uour_object, format: :pdf)
Если вы хотите отправить PDF в приложение электронной почты, сначала сохраните файл pdf в общедоступной или временной папке, а затем в классе почтовой программы (например, в mailers/e_mailer.rb)
attachments["test.pdf"] = File.read(Rails.root.join('public',"test.pdf"))
mail(:to => to, :cc => cc , :subject => "subject")
После отправки электронной почты вы можете удалить файл
File.delete(Rails.root.join("public", "test.pdf"))
Я знаю, что на этот вопрос уже почти 5 лет. Однако доступны новые параметры.
Попробуй креветку! https://github.com/adeven/shrimp
После того, как после большого количества пота и слез крови мне удалось написать довольно простое приложение для рельсов, которое позволяет пользователю писать шаблоны писем через TinyMce, они затем сохраняются и могут рассматриваться как документы PDF.
Я решил как можно больше ограничить параметры в редакторе wysiwyg, поскольку некоторые из параметров не работают точно так, как ожидалось, но что-то малое gsub-ing не удалось решить, если это необходимо.
Существует рубиновый камень, который обертывает HTMLDOC, который вам понадобится: PDF:: HTMLDoc
Как только вы получите это, зарегистрируйте тип mime, затем вы можете сделать что-то вроде:
@letter_template = LetterTemplate.find(params[:id])
respond_to do |format|
format.html
format.pdf { send_data render_to_pdf({:action => 'show.rpdf', :layout => 'pdf_report'}), :filename => @letter_template.name + ".pdf", :disposition => 'inline' }
end
В контроллере приложения я добавил метод render_to_pdf, например:
def render_to_pdf(options =nil)
data = render_to_string(options)
pdf = PDF::HTMLDoc.new
pdf.set_option :bodycolor, :white
pdf.set_option :toc, false
pdf.set_option :portrait, true
pdf.set_option :links, false
pdf.set_option :webpage, true
pdf.set_option :left, '2cm'
pdf.set_option :right, '2cm'
pdf.set_option :footer, "../"
pdf.set_option :header, "..."
pdf.set_option :bottom, '2cm'
pdf.set_option :top, '2cm'
pdf << data
pdf.generate
end
Вы найдете дополнительную документацию на сайте HTMLDOC, с которой связан Тревис Бил. Надеюсь, что это поможет вам на вашем пути, и если ваши документы действительно сложны, этого должно быть достаточно. Сообщите нам, как вы поживаете.
Самое близкое, что я нашел в качестве "решения" этого, - это использовать JRuby, а затем использовать Проект Flying Saucer. Я просто хочу, чтобы он был перенесен на Ruby, чтобы это могло быть родным решением. Боже, я бы хотел, чтобы я был лучше на Java.
Проект может застопориться, но Пиза (aka XHTML2PDF) - это библиотека Python, которая делает CSS + HTML в PDF. использовал его в приложении с низким трафиком Rails некоторое время назад, запустив его как инструмент командной строки - работал очень хорошо.
Я хотел бы предложить вам решение HTML для PDF https://grabz.it.
У них очень гибкий и простой в использовании скриншот API, который может быть использован любым типом приложения Ruby.
Если вы хотите попробовать, сначала вы должны получить авторизацию ключ приложения + секрет и разработка бесплатного SDK
Затем в вашем приложении шаги реализации:
//initialization
require 'grabzit'
grabzItClient = GrabzIt::Client.new("APPLICATION KEY", "APPLICATION SECRET")
//capturing the url to PDF
grabzItClient.url_to_pdf("http://www.google.com")
Далее - сохранение. Вы можете использовать один из двух методов сохранения, save
, если доступен доступный дескриптор обратного вызова:
grabzItClient.save("http://www.example.com/handler/index")
И save_to
, если вам требуется синхронное сохранение (что заставит ваше приложение ждать при создании скриншота):
filepath = "images/result.jpg"
grabzItClient.save_to(filepath)
Проверьте документацию подробнее о сохранении.
Это все. Также можно получить другие скриншоты, такие как скриншоты изображений.
Если вы хотите иметь действительно хорошее качество (подумайте, правильный макет /CSS и т.д.), вам нужно создать процесс, в который встроен реальный веб-браузер, который отображает его вне экрана и печатает его с помощью драйвера принтера PDF.
Наверняка нет прямого способа сделать это в Ruby (по крайней мере, не было, когда я пытался это сделать пару месяцев назад). Если вы действительно не можете избежать генерации ваших pdf файлов из html, вам следует, вероятно, осмотреть некоторые внешние инструменты или службы для этой цели.
Удачи!
Я пробую библиотеку с сайта www.pd4ml.com
вот код snip....
Я втягиваю html в содержимое String. Затем я делаю пару вещей, таких как замена радиокнопок с помощью флажков, а затем запуск через библиотеку pd4ml для рендеринга pdf.
Результат очень похож на исходную страницу....
String content = nextPage.generateResponse().contentString();
content = content.replace("Print", "");
content = content.replace("Back", "");
content = content.replace("border=\"1\"", "border=\"0\"");
content = content.replace("radio", "checkbox");
java.net.InetAddress i = java.net.InetAddress.getLocalHost();
String address = i.getHostAddress()+":53000";
content = content.replace("img src=\"/cgi-bin", "img src=\"http://"+address+"/cgi-bin");
System.out.println(content);
PD4ML html = new PD4ML();
html.setPageSize( new java.awt.Dimension(650, 700) );
html.setPageInsets( new java.awt.Insets(30, 30, 30, 30) );
html.setHtmlWidth( 750 );
html.enableImgSplit( false );
html.enableTableBreaks(true);
StringReader isr = new StringReader(content);
baos = new ByteArrayOutputStream();
html.render( isr, baos);
PDFRegForm pdfForm = (PDFRegForm)pageWithName("PDFRegForm");
pdfForm.baos = baos;
pdfForm.generateResponse();
Вы пробовали посмотреть на html2pdf? домашняя страница http://html2pdf.seven49.net/Web/
Существует также проект sourceforge.
Алан
Не определен для Ruby, но лучшим решением, которое я нашел, является открытый источник HTMLDOC.