邪恶的PDF无法处理分页符

时间:2016-07-12 08:23:02

标签: ruby-on-rails ruby-on-rails-4 wicked-pdf

我在生成报告的Rails应用程序中使用 gem wiked_pdf

但是,当我有超过1页时,我无法解决数据中断问题。

请参阅图片。enter image description here

我尝试了很多时间来调整边距或间距,但仍然无法修复它。

respond_to do |format|
  format.html
  format.pdf do
    render title:         @report_title,
           pdf:           @report_title,
           template:      'applicants/generate_report.pdf.erb',
           encoding:      'UTF-8',
           orientation:   'Landscape',
           layout:        'pdf_template.html',               
           footer: {
                    center:    '[page] of [topage]',
                    right:     "",
                    font_name: 'Arial',
                    font_size: 8                        
                   },
           margin: {
                    top:     10, # default 10 (mm)
                    bottom:  12,
                    left:    7,
                    right:   7 
                   },
          spacing: 0
  end
end

我还尝试应用 CSS ,例如:

@media print {
  td, tr {page-break-inside: avoid; }
  table.full_report_table>tbody>tr>td {page-break-inside: avoid !important; }
}

没有任何作用!

请帮忙!

4 个答案:

答案 0 :(得分:3)

<强>解决

  

page-break-inside:avoid;

它在 div 标记中正常工作。

但我花了一段时间进行粗略研究,找出如何使其与长桌一起使用。

添加一些 CSS 样式可以帮助我。

与文档W3 page-break一样,它将与块元素一起使用。

我所做的是将显示样式与其一起添加。

<tr style="page-break-inside: avoid; display: inline-table;">

inline-table inline-block 适用于我的情况。

我希望这会帮助遇到与我相同的错误的其他人。

答案 1 :(得分:0)

您需要创建一个类并在其下面应用CSS:

div.alwaysbreak { page-break-before: always; }

例如,在我的情况下:

<div class="alwaysbreak">
   // My PDF Template
</div>

希望这会有所帮助..!

答案 2 :(得分:0)

我过去通过使用css div将每个表格行包裹在page-break-inside: avoid;中来解决此问题。

我知道它在语义上并不正确,但它确实有用。

这应该确保它在不中断行中间的表内容的情况下转换页面:

<style>
  .nobreak:before {
    clear: both;
  }
  .nobreak {
    page-break-inside: avoid;
  }
</style>
<table>
  <div class="nobreak">
    <tr>
      <td>First row</td>
    </tr>
  </div>
  <div class="nobreak">
    <tr>
      <td>Second row</td>
    </tr>
  </div>
</table>

答案 3 :(得分:0)

简单地在你的 html 代码的最后放一个 div。喜欢

<% @questions.each do |question| %>
  <% if question.id == @questions.last.id %>
    <div></div>
  <% end %>
<% end %>

在你的 html.put 中添加一个分区后,在你的 css 中添加以下行:

div.alwaysbreak { page-break-before: always; }
div.nobreak:before { clear:both; }
div.nobreak{ page-break-inside: avoid; }

它对我有用