---------- 更新された回答 --------
以前の回避策は実稼働サーバーには十分ではなかったため、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