Rails: конвертировать HTML в PDF? [закрыто]

Какой самый лучший и самый простой способ взять HTML и преобразовать его в PDF, аналогично использованию CFDOCUMENT в ColdFusion?

ОБНОВЛЕНИЕ: Я действительно ценю все комментарии и предложения, которые люди дали до сих пор, однако я чувствую, что люди, оставляющие свои ответы, упускают суть.

1) решение должно быть бесплатным или открытым исходным кодом. один человек предложил использовать pricexml, а другой pd4ml. оба эти решения стоят денег (pricexml стоит рука и нога), которые я не собираюсь раскошелиться.

2) они должны быть в состоянии взять html (из файла, URL или строковой переменной) и затем создать PDF. такие библиотеки, как prawn, rprf, rtex, создаются с использованием собственных методов, а не с использованием html.

пожалуйста, не думайте, что я неблагодарен за предложения, просто создание PDF кажется действительно проблемой для таких людей, как я, которые используют ColdFusion, но хотят перейти на Rails.

10.12.2008 19:12:55
nicolas 6.03.2013 08:14:27
Так почему же тогда вы понизили HTMLDOC?
Kurt Pfeifle 17.12.2014 22:42:17
15 ОТВЕТОВ
РЕШЕНИЕ

Драгоценный камень, WickedPDF , делает именно это.

64
11.03.2015 22:26:01
Вы, сэр, мужчина. Именно то, что я искал!
rip747 6.12.2009 13:39:10
Я попытался нажать на ссылку пару раз, но затем я потерял след, что происходит (странно). Тогда я попытался скопировать вставить ссылку, и это сработало. Если вы получите% 5f в вставленном URL, просто замените его подчеркиванием.
Kinjal Dixit 2.07.2011 22:43:36
Это предпочтительнее PDFKit?
Matt 14.02.2013 16:34:25
@ Matt Согласно Ruby Toolbox, они примерно на одном уровне: ruby-toolbox.com/categories/pdf_generation Я могу говорить только с WickedPDF, но он, безусловно, выполняет свою работу и поддерживается довольно активно, судя по всему.
Joshua Pinter 11.03.2015 23:54:45
Это то, что я создал для создания PDF в Rails github.com/igorkasyanchuk/rails_pdf
Igor Kasyanchuk 28.02.2019 09:04:42

Если вы хотите иметь действительно хорошее качество (подумайте, правильная верстка / CSS и т. Д.), Вам нужно создать процесс, встраивающий настоящий веб-браузер, отображающий его вне экрана и печатающий его через драйвер принтера PDF.

-1
10.12.2008 19:21:52
на самом деле я не думаю, что это будет лучшим решением, так как большинство веб-сайтов имеют стиль «печати», который удаляет элементы сайта.
rip747 10.12.2008 19:30:04

В Ruby точно нет прямого способа сделать это (по крайней мере, не было, когда я пытался сделать это пару месяцев назад). Если вы действительно не можете избежать создания ваших PDF-файлов из HTML, вам, вероятно, следует поискать какие-то внешние инструменты или службы для этой цели.

Удачи!

-1
10.12.2008 19:44:36

Самое близкое, что я нашел в качестве «решения», - это использование JRuby, а затем проект «Летающая тарелка» . Я просто хотел бы, чтобы он был перенесен на Ruby, чтобы он мог быть нативным решением. Боже, если бы я был лучше на Яве.

1
12.12.2008 18:30:20
acts_as_flying_saucer - рубиновый порт библиотеки летающих тарелок
Amar 13.06.2011 09:46:44
  • Существует RPDF, в котором вы описываете свои PDF в качестве представления.
  • Также есть RTEX, который использует (La) TeX для генерации PDF.
1
11.12.2008 17:16:49

Я пробую библиотеку с www.pd4ml.com

вот фрагмент кода ....

Я втягиваю HTML в содержимое строки. Затем я делаю пару вещей, таких как замена переключателей на флажки, а затем запускаю их через библиотеку 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();
-1
17.12.2008 19:15:32

Вы пробовали смотреть на html2pdf? домашняя страница http://html2pdf.seven49.net/Web/

Есть также проект sourceforge.

Алан

-1
17.12.2008 20:09:54

Не относится к Ruby, но лучшее решение, которое я нашел для этого, - это HTMLDOC с открытым исходным кодом .

-1
7.10.2015 12:09:57
HTMLDOCне поддерживает utf-8, и автор не планирует поддерживать его
new2cpp 18.09.2018 01:26:44

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

Я решил ограничить параметры в редакторе wysiwyg настолько, насколько это возможно, так как некоторые параметры работают не совсем так, как ожидалось, но это ничто, что не может решить небольшая gsubing в случае необходимости.

Существует рубиновый гем, который оборачивает 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, с которой связан Трэвис Бил. Надеюсь, это поможет вам продвинуться по пути, и если ваши документы не очень сложны, этого должно быть достаточно. Дайте нам знать, как вы поживаете.

2
8.05.2009 14:43:45

Проект, возможно, застоялся, но Пиза (он же XHTML2PDF ) - это библиотека Python, которая делает CSS + HTML в PDF. использовал его в приложении Rails (с небольшим трафиком) некоторое время назад, используя его как инструмент командной строки - работал довольно хорошо.

0
5.06.2010 23:54:14

HTMLDOC ?

  • конвертирует HTML в PDF;
  • Бесплатный и открытый исходный код (коммерческая поддержка доступна);
  • можно использовать как ...
    • ... автономное приложение,
    • ... для пакетной обработки документов,
    • ... или работать как веб-сервис;
  • Интерфейс CLI или GUI.
-1
7.10.2015 12:06:33

Самая большая вещь в настоящее время - PDFKit для этой работы:

14
5.08.2012 10:08:26

Я знаю, что этому вопросу уже почти 5 лет. Тем не менее, новые опции доступны.

Попробуйте креветок! https://github.com/adeven/shrimp

3
5.06.2013 17:30:43

Попробуйте 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"))
11
4.08.2016 06:26:15
Это верный ответ
Abs 31.01.2016 00:58:23
почему вы создаете pdfвар?
Arnold Roa 24.03.2017 14:52:39
@ArnoldRoa для получения более подробной информации вы можете перейти по этой ссылке github.com/mileszs/wicked_pdf#super-advanced-usage
Sajjad Murtaza 27.03.2017 15:19:40

Я хотел бы предложить вам решение 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) 

Проверьте документацию для деталей о сохранении.

Это все. Можно получить и другие виды снимков экрана, например снимки экрана .

0
1.07.2017 11:40:38