5

示例.erb.html

<p>Page 1</p1>

<p>Page 2</p2>

因此,“第 1 页”之后的所有内容我都想在第 2 页上打印。

我怎样才能做到这一点?

SO中有一个解决方案,但它对我不起作用。

例如,在 Prawn 的情况下,它有一个很好的特性,叫做start_new_page

4

4 回答 4

4

在你的 CSS

p{page-break-after: always;}

更新

在几个问题之后,我将扩展我的答案以及我如何在我的应用程序中使用它。

1 有时,wickedpdf 助手不起作用,所以我添加了一个初始化程序

_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

2 在应用程序控制器中使用通用配置参数创建一个配置方法

_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

3 为所有 pdf 文件创建一个通用布局。在这里,我使用我的应用程序 css 来保持 pdf 报告中网页的相同外观,只有我必须使用相同的类和 id

应用程序/布局/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>

4 在控制器中添加 pdf 重定向

_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

5 现在,在你的 css 中,选择哪个 html id 是页面刹车

 #brake{page-break-after: always;}
于 2013-08-09T01:56:39.707 回答
1

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;
}
于 2014-08-27T10:26:26.243 回答
0

对于仍然有这个问题但这些答案都没有的人,就像我一样,只是不起作用:我放弃了使用 CSS 来修复分页符,而是生成了 2 个 pdf 并将它们合并在一起并改用生成的文件,即方式不可能不存在分页符。

要合并filespdf 文件名数组,我使用了

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_height0. 手动分页符关闭所有 html 标记,添加一个0像素高的 div page-break-after: always,并再次打开 html 标记。

这种方法我只有两个问题:

  • 如果 pdf 中的某些文本太长,它将换行并抛出@pixel_count导致在奇数点自动分页符和在奇数点手动分页符
  • WickedPdf 很慢

为了解决这两个问题,我们一直在慢慢地将我们的 pdf 迁移到 Prawn,特别是 Prawn::Table。它要快得多,它会在绘制 pdf 之前计算每行的高度,因此分页符更加可预测和一致

于 2017-04-21T13:03:12.607 回答
0

一种快速的方法是使用以下 HTML:

<div style="page-break-before: always;"></div>
From this line onwards HTML Content will come in next page
于 2020-03-03T14:26:04.233 回答