WKHTMLTOPDF avec pdfkit sur Rails ignoring table page breaks

je sais qu'il y a beaucoup de problèmes avec wkhtmltopdf et les sauts de page qui remontent à des années, mais je n'ai pas encore trouvé de solution. J'utilise le gem PDFKit pour générer mes pages html en PDF, mais je ne veux pas que les pages se cassent au milieu d'une rangée de tableaux.

j'utilise wkhtmltopdf-binaire( 0.9.9.3), qui semble être la version la plus mise à jour""

My CSS:

@media print {

  #scores table tr td, #scores table tr th {
    page-break-inside: avoid !important;
  }

  table, tr, td, th, tbody, thead, tfoot {
    page-break-inside: avoid !important;
  } 
}

ma table:

<div class="score_table">
    <table id="scores" class="print-friendly">
      <tbody>
            <% @chapters.each do |chapter| %>
                <tr>
                    <th colspan="3" ><%= chapter.name %></th>
                </tr>   
                <% chapter.rules.each do |rule| %>
                    <tr>
                        <th colspan="2" >Rule: <%= rule.name %></th>
                        <th></th>
                    </tr>     
    <!-- Triggers -->               
                    <% rule.triggers.each do |trigger| %>
                        <tr>
                            <td>T</td>
                            <td><%= markdown(trigger.body) %></td>
                            <td><%= markdown(trigger.explanation) %></td>
                        </tr>
                        <% if trigger.image? || trigger.image2? %>
                            <tr>    
                                <td></td>
                                <% if trigger.image? %>
                                    <td><%= image_tag trigger.image.url(:thumb) %></td>
                                <% else %>
                                    <td></td>
                                <% end %>   
                                <% if trigger.image2? %>    
                                <td><%= image_tag trigger.image2.url(:thumb) %></td>
                            <% else %>
                                <td></td>   
                            <% end %>   
                            </tr>   
                        <% end %>   
                    <% end %>   
    <!-- Questions -->  
                    <% rule.questions.each do |question| %>
                        <tr>
                            <td>Q</td>
                            <td><%= markdown(question.body) %></td>
                            <td><%= markdown(question.answer) %></td>
                        </tr>
                        <% if question.image? || question.image2? %>
                            <tr>    
                                <td></td>
                                <% if question.image? %>
                                    <td><%= image_tag question.image.url(:thumb) %></td>
                                <% else %>
                                    <td></td>
                                <% end %>
                                <% if question.image2? %>       
                                <td><%= image_tag question.image2.url(:thumb) %></td>
                            <% else %>
                                <td></td>
                            <% end %>       
                            </tr>   
                        <% end %>   
                    <% end %>   
    <!-- Hints -->  
                    <% rule.hints.each do |hint| %>
                        <tr>
                            <td>H</td>
                            <td><%= markdown(hint.body) %></td>
                            <td><%= markdown(hint.explanation) %></td>
                        </tr>
                        <% if hint.image? || hint.image2? %>
                            <tr>    
                                <td></td>
                                <% if hint.image? %>
                                    <td><%= image_tag hint.image.url(:thumb) %></td>
                                <% else %>  
                                    <td></td>
                                <% end %>   
                                <% if hint.image2? %>
                                <td><%= image_tag hint.image2.url(:thumb) %></td>
                            <% else %>  
                                <td></td>
                            <% end %>   
                            </tr>   
                        <% end %>   
                    <% end %>   
                <% end %>
            <% end %>
    </tbody>
    </table>
</div>

Est-il un travail autour de, ou est-il quelque chose que je fais mal? C'est le résultat:

enter image description here

je pourrais poster le code PDFKit aussi, mais ça ressemble à un problème wkhtmltopdf

***mise à Jour - Mon CSS @impression n'affecte pas la page quand .pdf est ajouté à l'url. J'ai mon lien de feuille de style avec les médias:" tous "

<%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>

Voici mon initialiseur pdfkit.RB:

ActionController::Base.asset_host = Proc.new { |source, request|  

if request.env["REQUEST_PATH"].include? ".pdf"
    "file://#{Rails.root.join('public')}"
  else
    "#{request.protocol}#{request.host_with_port}"
  end
}

si je peux corriger la CSS, alors je vais probablement résoudre le problème de page break!

1
demandé sur Tony Tambe 2014-11-28 20:25:25

4 réponses

j'ai ajouté ceci dans css Il a fonctionné pour moi

@media print {
#scores {
      page-break-before: always;
    }
}

2
répondu Hemanth M C 2014-12-12 14:33:58

j'utilise la version wkhtmltopdf 0.12.0

Pour moi, les sauts de page fonctionnent UNIQUEMENT avec --print-media-type. Sans elle, la protection de rupture de page pour les images fonctionne, mais pas Page-break-après ou avant.

j'ai dû faire un fichier css spécial pour les médias imprimés pour obtenir le travail.

le réglage de la taille du papier à " A3 "ou l'utilisation du" overflow: visible " n'a fait aucune différence.

j'ai fini avec le suivant:

dans config / initialiseurs:

PDFKit.configure do |config|
  config.wkhtmltopdf = '/usr/bin/wkhtmltopdf'
  config.default_options = {
    :encoding=>"UTF-8",
    :page_size => 'A3',
    :zoom => 0.9,
    :javascript_delay => 2000,
    :print_media_type => true,
    :footer_right => 'report, page [page] of [toPage]',
    :no_background => true,
  }
end

Je ne suis pas sûr à 100% si le no_background est nécessaire.

puis, dans le contrôleur:

def report_as_pdf
    require 'nokogiri'
    root_url = Rails.env.development? ? 'http://localhost:3000' : 'https://my.example.com'
    html = render_to_string(layout: true, template: "reports/report_as_pdf").gsub('/assets', root_url + '/assets') # since wkhtmltopdf can not find the css files, we add the root_url to all assets
    html_doc = Nokogiri::HTML(html)
    html_doc.css('div.contain-to-grid').remove
    html_doc.css('nav#rapportage_bar').remove
    # Had to remove certain elements on the page. Not relevant for this particular problem, but it may help.
    html = html_doc.to_html
    filename = 'report_' + Time.now.to_s(:db)[0..9]
    if Rails.env.development?
      File.write("/tmp/#{filename}.html", html)
      render :text => "wrote /tmp/#{filename}.html"
      fork do
        system("wkhtmltopdf --footer-right 'report, page [page] of [toPage]' --page-size 'A3' --zoom 0.9 --javascript-delay 2000 --no-background --print-media-type  file:////tmp/#{filename}.html  /tmp/#{filename}.pdf")
      end
      # forking was the only way I could get it to work in development mode, using thin as webserver instead of webrick (but it might work with webrick, I didn't try).
    else
      kit = PDFKit.new(html)
      send_data(kit.to_pdf, :filename => filename + '.pdf', :type => 'application/pdf')
      # all is simpeler in production mode.
    end
  end

Note, que dans la disposition par défaut (normalement app/views/layouts/application.HTML.erb) j'ai ajouté une ligne pour introduire un fichier css spécial pour imprimer:

stylesheet_link_tag    "application_print", media: "print"

ce fichier importe en fait quelques tables de la fondation ZURB, ce qui est cool.

@import "foundation/components/tables";

h1 {
  font-variant: small-caps;
  font-weight: bolder;
  font-size: 320%;
  border-bottom: 12px solid black;
  margin-bottom: 20px;
  margin-top: 80px;
  }

h2 { (etc etc etc)

pour faire des sauts de page dans une vue, je l'insère juste aux bons endroits:

j'espère que ce sera utile à quelqu'un un jour.

1
répondu Ace Suares user1266770 2015-02-21 18:39:53

pouvez-vous télécharger le code du contrôleur où vous avez appelé PDFkit.de nouveau ?

votre feuille de style pourrait ne pas être incluse. Essayez d'ajouter la feuille de style dans votre code de controller comme ceci:

def export
    kit = PDFKit.new(render_to_string(layout: false, handlers: [:haml], formats: :html, template: 'score_tables/export'))
    kit.stylesheets << "#{Rails.root}/vendor/assets/stylesheets/bootstrap.css"
    kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/score_tables.css"
    kit
end
0
répondu Shifa Khan 2015-01-06 09:37:33

Voici comment j'ai réglé mon problème. - Mise à jour PDFKIT comme d' ( 01/22/2014 ) - J'ai dû sortir ma table du <div> car la table emboîtée gâche tout.

exemple:

No div étiquette enveloppant la table.

de

<div class="score_table">
<table id="scores" class="print-friendly">
...rest of the HTML

à

<table id="scores" class="print-friendly">
...rest of the HTML

Espérons que cette aide.

0
répondu cph 2015-01-22 07:59:52