как использовать PDFKit для захвата желаемого html div в Rails

Я хотел бы сгенерировать PDF в указанной мной области (например, в теге div id). Я начал использовать rails gem PDFKit, следуя руководству от railcast и документации.

Так что простая ссылка в формате .pdf сделала свое дело.

 <%= link_to 'Open PDF', invoice_path(@invoice, :format => "pdf"), :class => "btn btn-md btn-primary" %>

Теперь вопрос в том, как захватить только желаемую область? Я изучил здесь ответы в формате html: Печать ‹div id = printarea› ‹/div› only? < / а>

Я пробовал что-то подобное, и это не работает.

@media print
{  
  body * { visibility: hidden; }
  #printableArea * { visibility: visible; }
  #printableArea { position: absolute; top: 40px; left: 30px; }
}

в show.html.erb

<div id="printableArea">
something in PDF
</div>

Я нашел другой ресурс, например этот http://www.sitepoint.com/pdf-generation-rails/, но он просто просит поставить теги, чтобы скрыть это. Моя проблема больше в том, чтобы скрыть остальное и сделать видимым div, который я хочу.


person Axil    schedule 18.05.2014    source источник
comment
Что значит не работает?   -  person Mike Szyndel    schedule 18.05.2014


Ответы (2)


Не уверен, что это лучший способ сделать это, но я помещаю оператор if вокруг всего кода, который не хочу отображать в моем PDF-файле, например:

<% if params[:format] != "pdf" %>
  All the code I don't want to show in my pdf
<% end %>

или вы можете полностью отделить свой pdf-контент от html-контента

<% if params[:format] == "pdf" %>
  All the code I want to show in my pdf only
<% else %>
  All the code I want to show in html only
<% end %>

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

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title></title>
    <%= wicked_pdf_stylesheet_link_tag 'application' %>
  <link href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
  <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>

  <%= wicked_pdf_javascript_include_tag "application" %>
  <%= csrf_meta_tags %>
  <%= favicon_link_tag 'https://s3.amazonaws.com/url/favicon.ico' %>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://js.braintreegateway.com/v1/braintree.js"></script>
</head>
<body id="body_tag">

    <%= yield %>

</body>
</html>

Контроллер

respond_to do |format|
  format.html
  format.pdf do
    render :pdf => "show",
    template: 'deliveries/show.html.erb',
    layout: 'pdf.html'
  end
end
person avalente1    schedule 18.05.2014
comment
но вы все равно получите все остальное не в этом состоянии. считайте, что на вашей странице есть панель навигации, нижний колонтитул и т. д. все это попадет и в ваш pdf файл. теперь, как у вас их нет и просто хотите, чтобы содержимое говорило о вашем состоянии или div в сгенерированный PDF-файл? - person Axil; 18.05.2014
comment
Я использую другой макет для PDF-файлов - person avalente1; 18.05.2014
comment
хорошо, спасибо, это один ответ. Было бы неплохо, если бы css действительно мог это сделать (при включении той части, которая видна, а НЕ других). возможно, это невозможно, я не знаю? Я решил перейти на креветки, генерация действительно быстрая по сравнению с wkhtmltopdf. - person Axil; 19.05.2014
comment
Да, это было бы неплохо, и, возможно, кто-то укажет, как это сделать, но пока я не видел никаких объяснений в Интернете в моем поиске - person avalente1; 19.05.2014

Привет, попробуйте это в одном файле css

#mi_id_div{
display: none;
}

КОГДА #MI_ID_DIV ЯВЛЯЕТСЯ все содержимое не видимым в pdf

В вашем контроллере

html = render_to_string(:action => "tiempo_atencion.html.erb", :layout => false)
       kit = PDFKit.new(html)
       kit.stylesheets << "#{Rails.root}/vendor/assets/stylesheets/reportes-estilos/tablas.css"

       send_data(kit.to_pdf, :filename => 'test_report_with_table.pdf', :type => 'application/pdf')
person Zombie    schedule 23.02.2015