3

Railsアプリケーションでエビを使用してpdfレポートを作成しようとしています。ユーザーが作成したコンテンツを含むセクションがたくさんあるので、まとめてグループ化してみたいと思います。場合によっては、これが複数のページにまたがり、グループ化できないというエラーが発生することがあります。次に、エラーが発生した場合にグループ メソッドを使用せずにロールバックしてコンテンツを出力できるように、トランザクションを使用しようとしました。

問題は、ロールバックによってページがいっぱいになることです。PDFから余分なページを削除しますが、ページ数が間違っていて、やり直そうとすると重複するコンテンツが出力されます。エビのドキュメントに従って、ロールバック後にy位置をリセットしましたが、それでも問題が発生します。

例えば。次のテスト コードは、2 ページの数値を書き込み、先頭にロールバックしてから、同じ数値の書き込みを再試行します。1 ページ目の pdf が生成され、2 ページ目の数字が最初のページと重複し、ページ数は 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 => 'git://github.com/prawnpdf/prawn.git', :branch => 'master')。

4

2 に答える 2

4

この質問はかなり古いものですが、例外を検索したときに Google で最初にヒットしたものの 1 つであるため、回答を投稿します。

トランザクションはまだ改ページ (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 でうまく機能する非公式のグループ化 gem があります: https://github.com/ddengler/prawn-grouping

于 2014-01-14T12:35:17.227 に答える
1

Brad Ediger が Google グループであなたの質問に答えたようですが、これについて助けを求めている他の人のために、彼の回答を以下に示します。

残念ながら、新しいページを開始したり、ページ コレクションを変更したりすると、トランザクションはまだ正しく機能しません。これは既知の問題です:

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

-なれ

于 2012-06-21T13:33:17.070 に答える