Ruby: PDF-файл не хватает при использовании группового метода - PullRequest
3 голосов
/ 18 ноября 2010

У меня есть большое количество продуктов, которые я хочу отобразить в формате PDF, с заголовками категорий. Если категория не помещается на текущей странице, я хочу переместить ее на следующую. Для этого я использую групповой метод Prawn.

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 секунд.

Очевидно, что групповой метод не очень хорошо управляет использованием памяти. Буду признателен за любые предложения по обходным путям.

Ответы [ 2 ]

2 голосов
/ 18 ноября 2010

Я использовал креветку в одном проекте, извините, что сказал, но это была катастрофа, в конце концов нам пришлось переключиться на wicked pdf .Я советую вам сделать то же самое, прежде чем вам не нужно много кода.

1 голос
/ 24 марта 2011

---------- ОБНОВЛЕННЫЙ ОТВЕТ --------

Предыдущий обходной путь был недостаточно хорош для производственного сервера, поэтому мне пришлось использовать версию для разработки изgit repo установлен как подмодуль в vendor / prawn, как описано здесь: https://github.com/sandal/prawn/wiki/Using-Prawn-in-Rails

Проблема с памятью в групповом методе исчезла, но синтаксис / опции для вещей несколько изменились.Поэтому мне пришлось переписать код для генерации PDF.

Кроме того, трудно заставить подмодуль хорошо играть с git-репо для приложения Rails.Развертывание в производство было трудным.

---------- ОРИГИНАЛЬНЫЙ ОТВЕТ --------

Это не исправление, но оно решает проблемусделайте еще несколько групповых итераций, прежде чем он проявится:

  • переопределите метод экземпляра Prawn :: Document с именем 'group'
  • , используйте код из функции 'group' из новейшеговерсия для разработки prawn (от github.com)

Я сделал это, добавив файл в папку / lib моего приложения Rails.Этот файл будет содержать самоцветы креветок и определит тип mime для документа PDF:

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