使用wicked_pdf生成pdf时进行分页

时间:2013-08-02 05:21:28

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

sample.erb.html

<p>Page 1</p1>

<p>Page 2</p2>

所以,“Page 1”后的所有内容我想在第二页上打印。

我该怎么做?

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

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

4 个答案:

答案 0 :(得分:3)

在你的CSS中

p{page-break-after: always;}

更新

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

1有时候,wickedpdf帮助器不起作用,所以我添加了一个初始化器

_config /初始化/ 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 /控制器/ 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 /控制器/ 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;}

答案 1 :(得分:1)

我遇到了同样的问题,我发现了一些可能有用的东西。这是我的分页CSS代码:

.page-break {
  display: block;
  clear: both;
  page-break-after: always;
}

由于两个原因,这不起作用:

<强>予。在其中一个SASS导入的文件中,我有这行代码:

html, body
  overflow-x: hidden !important

<强> II。另一个问题是bootstrap

@import "bootstrap"

看起来好像是因为float: left

.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;
}

分页符不再有效。因此,只需在之后添加导入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;
}

答案 2 :(得分:0)

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

要合并files,一个pdf文件名数组,我用

system("pdftk #{files.join(' ')} cat output merged_file_name.pdf")

<强>更新

我不记得我在哪里生成了2个pdf,但我确实设法通过手动计算.html.erb文件中的像素来在单个pdf文件中执行这些分页符。 <% @pixel_height = 0 %><% @page_height = 980 %>。将pdf视为html,查看每个部分占用的像素数。添加到@pixel_height

在分页符合意义的地方,我会检查@pixel_height + 20 >= @page_height(20是<tr>占用大多数pdf的像素数)并呈现手动分页符并重置{{ 1}}到@pixel_height。手动分页符关闭所有html标记,添加0像素高div与0,并再次打开html标记。

我这个方法只有2个问题:

  • 如果pdf中的某些文字太长,它会换行并抛出page-break-after: always导致奇数点的自动分页符和奇数点的手动分页符
  • WickedPdf很慢

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

答案 3 :(得分:0)

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

<div style="page-break-before: always;"></div>
From this line onwards HTML Content will come in next page