4

カテゴリ ヘッダー付きの PDF に表示したい製品が多数あります。カテゴリが現在のページに収まらない場合は、次のページに移動したいと考えています。このために、Prawn の group メソッドを使用しています。

Product.all.group_by(&:category).each do |category, products|
  pdf.group do
    # Simplified the data a bit for this example
    pdf.text category
    pdf.table products.map{ |p| [p.title, p.price] }
  end
end

これは少量の製品では非常にうまく機能しますが、100 個を超える製品を追加すると、非常に長い時間がかかり、「メモリの割り当てに失敗しました」で終了します。グループメソッドを使用しない場合、約 30 秒かかります。

明らかに、グループ メソッドはメモリ使用量を適切に管理していません。回避策の提案をいただければ幸いです。

4

2 に答える 2

2

あるプロジェクトでエビを使っていたのですが、申し訳ありませんが、それは惨事でした。ついに邪悪なpdfに切り替える必要がありました。多くのコードを必要としない前に、同じことを行うことをお勧めします。

于 2010-11-18T02:51:47.310 に答える
1

---------- 更新された回答 --------

以前の回避策は実稼働サーバーには十分ではなかったため、https ://github.com/sandal/prawn/wiki/ で説明されているように、ベンダー/エビの下にサブモジュールとしてインストールされた git リポジトリの開発バージョンを使用する必要がありました。エビのレールを使用

group メソッドのメモリの問題は解消されましたが、シンタックス/オプションが若干変更されました。そのため、コードを書き直して PDF を生成する必要がありました。

また、サブモジュールを Rails アプリの git リポジトリとうまく連携させるのは困難です。本番環境への展開は大変でした。

---------- 元の答え --------

これは修正ではありませんが、問題が発生する前にさらに数回のグループ反復が必要になります。

  • 'group' という名前の Prawn::Document インスタンス メソッドをオーバーライドします
  • prawn の最新の開発バージョン (github.com から) の「グループ」関数のコードを使用します。

これを行う方法は、Rails アプリの /lib フォルダーにファイルを追加することです。このファイルには Prawn gem が含まれ、PDF ドキュメントの MIME タイプが定義されています。

class PdfPrawn
  require 'prawn'
  require 'prawn/core'
  require 'prawn/table'
  MIME_TYPE = "application/pdf"
end
class Prawn::Document
  def group(second_attempt=false)
    old_bounding_box = @bounding_box
    @bounding_box = SimpleDelegator.new(@bounding_box)

    def @bounding_box.move_past_bottom
      raise RollbackTransaction
    end

    success = transaction { yield }

    @bounding_box = old_bounding_box

    unless success
      raise Prawn::Errors::CannotGroup if second_attempt
      old_bounding_box.move_past_bottom
      group(second_attempt=true) { yield }
    end

    success
  end
end

次に、モデル ファイルで、PDF を生成するメソッドを定義し、次のようなものを使用します。

def to_pdf
  require "#{File.expand_path(RAILS_ROOT)}/lib/pdf_prawn"
  pdf = Prawn::Document.new
  # code to add stuff to PDF
  pdf.render
end
于 2011-03-24T20:10:43.430 に答える