prawn pdf group,transaction和rollback方法问题

时间:2012-04-24 01:40:50

标签: ruby-on-rails pdf prawn

我正在尝试使用rails应用程序中的prawn创建pdf报告。有很多部分包含我想要尝试和组合在一起的用户生成的内容。有时,这将超过一页,导致无法分组错误。然后我尝试使用事务,以便在发生错误时我可以回滚然后输出内容而不使用组方法。

问题是页面上的回滚内容。它从pdf中删除了额外的页面,但是当我尝试重做它时,仍然有错误的页数并且输出超过了研磨内容。 我在回滚后重置了y位置,根据虾文档,但我仍然遇到问题。

例如。以下测试代码写入2页数字,回滚到开头,然后再次尝试写入相同的数字。它导致单页pdf,第二页数字与第一页重叠,页数为2.页面底部的页面计数也相互重叠,即使我使用了对虾number_pages方法

class TestReport < Prawn::Document 
  def to_pdf   
    font('Helvetica')
  bounding_box([bounds.left, bounds.top - 50], :width  => bounds.width, :height => bounds.height - 100) do   

text 'begin'
  y_pos = y
  transaction do
    begin
      group do
        64.times do|i|
          text i.to_s
        end
      end
    rescue
      rollback
    end
  end
  self.y = y_pos

  64.times do|i|
    text i.to_s
  end

  text 'end'
  text page_number.to_s
end

    page_numbers(1)
    #render
  end

 def page_numbers(start)
    string = "page <page> of <total>"
    options = { :at => [bounds.right - 150, 40],
              :width => 150,
              :align => :right,
              :start_count_at => start,
              :color => "000000" }
    number_pages string, options
 end
end

 def test_report
    pdf = TestReport.new()
     pdf.to_pdf
     send_data pdf.render, filename: "test.pdf",
                      type: "application/pdf",
                      disposition: "inline"
 end

问题似乎与事务回滚有关。我想要的主要是能够使用组方法。还有另一种方式吗?

我的代码错了吗?我错过了什么或做了当前没有工作的交易。

我目前正在使用ruby on rails应用程序中的master prawn分支(gem'prawn',:git =&gt; 'git://github.com/prawnpdf/prawn.git',: branch =&gt; '主')。

2 个答案:

答案 0 :(得分:3)

这个问题现在已经很老了,但我会发布一个答案,因为它是Google搜索例外时首次点击的答案之一。

事务仍然不适用于分页符(v 1.0.0.rc2),所以我创建了一个帮助方法,尝试首先使用分组,然后如果发生异常,它只是在没有分组的情况下重试,使内容跨度不止一个页。

def group_if_possible(pdf, &block)
  begin
    pdf.group { block.call }
  rescue Prawn::Errors::CannotGroup
    block.call
  end
end

示例:创建表时使用它:

group_if_possible(pdf) do
  pdf.table(rows)
end

编辑:
从Prawn 1.x中删除了分组,但有一个非官方的分组宝石,对于Prawn 2很有效: https://github.com/ddengler/prawn-grouping

答案 1 :(得分:1)

看起来Brad Ediger在Google网上论坛上回答了你的问题,但为了其他寻求帮助的人的利益,这是他的回答:

可悲的是,当他们开始新事务时,交易仍无法正常运作 页面或更改页面集合。这是一个众所周知的问题:

https://github.com/prawnpdf/prawn/issues/268

-be