示例.erb.html
<p>Page 1</p1>
<p>Page 2</p2>
因此,“第 1 页”之后的所有内容我都想在第 2 页上打印。
我怎样才能做到这一点?
SO中有一个解决方案,但它对我不起作用。
例如,在 Prawn 的情况下,它有一个很好的特性,叫做start_new_page
示例.erb.html
<p>Page 1</p1>
<p>Page 2</p2>
因此,“第 1 页”之后的所有内容我都想在第 2 页上打印。
我怎样才能做到这一点?
SO中有一个解决方案,但它对我不起作用。
例如,在 Prawn 的情况下,它有一个很好的特性,叫做start_new_page
在你的 CSS
p{page-break-after: always;}
在几个问题之后,我将扩展我的答案以及我如何在我的应用程序中使用它。
_config/initializers/wiked_pdf.rb_
module WickedPdfHelper
def wicked_pdf_stylesheet_link_tag(*sources)
sources.collect { |source|
"<style type='text/css'>#{Rails.application.assets.find_asset("#{source}.css")}</style>"
}.join("\n").gsub(/url\(['"](.+)['"]\)(.+)/,%[url("#{wicked_pdf_image_location("\\1")}")\\2]).html_safe
end
def wicked_pdf_image_tag(img, options={})
image_tag wicked_pdf_image_location(img), options
end
def wicked_pdf_image_location(img)
"file://#{Rails.root.join('app', 'assets', 'images', img)}"
end
def wicked_pdf_javascript_src_tag(source)
"<script type='text/javascript'>#{Rails.application.assets.find_asset("#{source}.js").body}</script>"
end
def wicked_pdf_javascript_include_tag(*sources)
sources.collect{ |source| wicked_pdf_javascript_src_tag(source) }.join("\n").html_safe
end
WickedPdf.config = {
}
end
_app/controllers/application_controller.rb_
class ApplicationController < ActionController::Base
def pdf_config
WickedPdf.config = {
:wkhtmltopdf => "/usr/local/bin/wkhtmltopdf",
:orientation => 'Landscape',
:layout => "pdf.html",
:footer => {
:left => "Rectores Lideres Transformadores",
#:left => "#{Entidad.find(@current_user.entidad).nombre}",
:right => "#{Time.now}",
:font_size => 5,
:center => '[page] de [topage]'
},
:disposition => 'attachment'
}
end
end
应用程序/布局/pdf.html.erb
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<%= wicked_pdf_stylesheet_link_tag "application" %> ----- HERE YOUR APPLICATION CSS -----
</head>
<div id="content">
<%= yield %>
</div>
</body>
</html>
_app/controllers/users_controller.rb_
def index
@users = User.all
respond_to do |format|
format.pdf do
pdf_config
render :pdf => "filename"
end
end
end
#brake{page-break-after: always;}
I had the same problem and I discovered something that might help. This was my page break CSS code:
.page-break {
display: block;
clear: both;
page-break-after: always;
}
This didn't work because of TWO reasons:
I. In one of the SASS imported file I had this line of code:
html, body overflow-x: hidden !important
II. The other problem was bootstrap
@import "bootstrap"
It looks like because of the float: left
in:
.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
float: left;
}
the page break is no longer working. So, just add this after you import bootstrap.
.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
float: initial !important;
}
对于仍然有这个问题但这些答案都没有的人,就像我一样,只是不起作用:我放弃了使用 CSS 来修复分页符,而是生成了 2 个 pdf 并将它们合并在一起并改用生成的文件,即方式不可能不存在分页符。
要合并files
pdf 文件名数组,我使用了
system("pdftk #{files.join(' ')} cat output merged_file_name.pdf")
更新
我不记得我在哪里生成了 2 个 pdf,但我确实设法通过手动计算文件中的像素来在单个 pdf 文件中完成这些分页符.html.erb
。
<% @pixel_height = 0 %>
和<% @page_height = 980 %>
。以 html 格式查看 pdf 以查看每个部分占用了多少像素。添加到@pixel_height
.
在分页符有意义的地方,我检查@pixel_height + 20 >= @page_height
(20 是<tr>
我们大多数 pdf 占用的像素数)并呈现手动分页符并重置@pixel_height
为0
. 手动分页符关闭所有 html 标记,添加一个0
像素高的 div page-break-after: always
,并再次打开 html 标记。
这种方法我只有两个问题:
@pixel_count
导致在奇数点自动分页符和在奇数点手动分页符为了解决这两个问题,我们一直在慢慢地将我们的 pdf 迁移到 Prawn,特别是 Prawn::Table。它要快得多,它会在绘制 pdf 之前计算每行的高度,因此分页符更加可预测和一致
一种快速的方法是使用以下 HTML:
<div style="page-break-before: always;"></div>
From this line onwards HTML Content will come in next page