2012-04-24 1 views
3

Я пытаюсь создать отчет в формате pdf с использованием креветок в приложении rails. Существует множество разделов, содержащих контент, созданный пользователем, который я хочу попробовать и объединить вместе. Иногда это перейдет больше, чем одна страница, из-за которой не удается сгруппировать ошибку. Затем я попытался использовать транзакцию, чтобы в случае ошибки я мог откат и затем вывод содержимого без использования группового метода.prawn pdf group, метод метода транзакций и отката

Проблема заключается в откате, заполняющем страницы. Он удаляет дополнительную страницу из pdf, но по-прежнему имеет неправильный счет страницы и выводит по притирному контенту, когда я пытаюсь его переделать. Я возвращаю позицию y после откат, согласно документации на креветки, но у меня все еще возникают проблемы.

например. Следующий тестовый код записывает 2 страницы чисел, выполняет откат к началу и затем пытается снова записать те же номера. Это приводит к одностраничной pdf-странице со второй страницей номеров, перекрывающей первое и количество страниц в 2. Количество страниц в нижней части страницы также перекрывает друг друга, хотя я использую метод prawn 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 

Проблемы, похоже, связаны с откатами транзакций. Главное, что я хочу, это использовать групповой метод. Есть ли другой способ?

Является ли мой код неправильным? Я что-то упускаю или делаю транзакции, которые в настоящее время не работают.

В настоящее время я использую мастерскую креветки в рубине на рельсах (драгоценный камень «креветка»,: git => 'git: //github.com/prawnpdf/prawn.git',: branch => 'мастер').

ответ

1

Похоже, Брэд Ediger ответил на ваш вопрос о Google Groups, но на благо всех, кто хочет помочь с этим, вот его ответ:

К сожалению, сделки пока не работает правильно, когда они начинают новую страницы или изменить коллекцию страниц. Это известная проблема:

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

-be

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