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



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



обновление: Я действительно ценю все комментарии и предложения, которые люди дали до сих пор, однако я чувствую, что люди, оставляющие свои ответы, упускают суть.



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



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



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

669   15  

15 ответов:

камень, 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

= link_to 'Download Pdf', you_show_path(@uour_object, format: :pdf)

если вы хотите отправить pdf в приложении электронной почты, сначала сохраните файл pdf в папке public или temp, а затем в классе mailer (например, в mailers/e_mailer.РБ)

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

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

  • здесь RPDF в котором вы описываете свой pdf-файл в виде представления.
  • есть RTEX который использует (La)TeX для создания pdf-файлов.

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

проект, возможно, застопорился, но Pisa (aka XHTML2PDF) - это Python lib, который делает 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

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

я втягиваю 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();

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

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

Алан

HTMLDOC?

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

не относится к Ruby, но лучшее решение, которое я нашел для этого, - это open source HTMLDOC.

Comments

    Ничего не найдено.