Подтвердить что ты не робот

Rails: конвертировать HTML в PDF?

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 3

Попробуйте 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"))

Ответ 4

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

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

Ответ 5

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

Ответ 6

Самое близкое, что я нашел в качестве "решения" этого, - это использовать JRuby, а затем использовать Проект Flying Saucer. Я просто хочу, чтобы он был перенесен на Ruby, чтобы это могло быть родным решением. Боже, я бы хотел, чтобы я был лучше на Java.

Ответ 7

  • RPDF, в котором вы описываете свой pdf файл в виде представления.
  • Также существует RTEX, который использует (La) TeX для генерации PDF файлов.

Ответ 8

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

Ответ 9

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

Проверьте документацию подробнее о сохранении.

Это все. Также можно получить другие скриншоты, такие как скриншоты изображений.

Ответ 10

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

Ответ 11

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

Удачи!

Ответ 12

Я пробую библиотеку с сайта 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();

Ответ 13

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

Существует также проект sourceforge.

Алан

Ответ 14

Не определен для Ruby, но лучшим решением, которое я нашел, является открытый источник HTMLDOC.

Ответ 15

HTMLDOC?

  • преобразует HTML в PDF;
  • Свободный и открытый источник (доступна коммерческая поддержка);
  • может использоваться как...
    • ... автономное приложение,
    • ... для пакетной обработки документов,
    • ... или работать как веб-служба;
  • интерфейс - это CLI или GUI.