Debugging Prawn reached end of graphics state stack
Asked Answered
T

1

7
class Report
  attr_reader :pdf
  def to_pdf
    Prawn::Document.new(page_layout: page_layout) do |pdf|
      @pdf = pdf

      pdf.repeat(:all) do
        frame_page
      end

      pdf.repeat(:all) do
        write_header 
      end
      #write_section_divider
      puts "wrote the header" #this is not getting hit
      write_body

In my subclass:

def write_header
    puts "Writing header"
    pdf.move_down 8
    pdf.text title, size: 22, style: :bold, align: :center
    puts "wrote title"

    pdf.bounding_box([0, pdf.cursor], width: pdf.bounds.right, height: 28) do
      puts "bounding box"
      pdf.move_down 8
      pdf.text date_title, size: 16, align: :center
      pdf.text current_day_title, size: 16, align: :center
      puts "moved down"
    end

    puts "exited bounding box"
  end


 F, [2015-02-23T02:18:30.106303 #6] FATAL -- :
2015-02-23T02:18:30.106684+00:00 app[web.1]:   app/reports/report.rb:6:in `to_pdf'
2015-02-23T02:18:30.106680+00:00 app[web.1]:   app/reports/report.rb:13:in `block in to_pdf'
2015-02-23T02:18:30.106682+00:00 app[web.1]:   app/reports/report.rb:6:in `new'
2015-02-23T02:18:30.106674+00:00 app[web.1]: Prawn::Errors::EmptyGraphicStateStack (
2015-02-23T02:18:30.106677+00:00 app[web.1]:  You have reached the end of the graphic state stack):
2015-02-23T02:18:30.106690+00:00 app[web.1]:
2015-02-23T02:18:30.106691+00:00 app[web.1]:
2015-02-23T02:18:30.106688+00:00 app[web.1]:   app/controllers/verified_return_money_reports_controller.rb:21:in `create'
2015-02-23T02:18:30.106687+00:00 app[web.1]:   app/reports/verified_return_money_report.rb:6:in `to_pdf'

Why is my Prawn drawing failing?

Telegram answered 23/2, 2015 at 2:21 Comment(0)
S
15

You have a repeater which is applied to every page, and whose content is more than one page wide. That's what Prawn is telling you with that not very self-explaining error.

Now, from the stacktrace the error comes from write_header call. It seems your bounding box on that method has a fixed height (28) and it's content is higher: two lines and the move down 8.

Try extending bounding_box's height or making it's content shorter.

Shipping answered 23/2, 2015 at 9:20 Comment(2)
That was it, the height wasn't enough to contain the content.Telegram
I continued to have this problem even after confirming that the image was correct. The only way I was able to resolve it was by replacing repeat(:all) with page_count.times do |i| and go_to_page(i+1).Ascogonium

© 2022 - 2024 — McMap. All rights reserved.