PDF::Writer Switching to Production Trouble (on rails)

Hello, i’m newbie for pdf::writer and also for
rails.
I’ve put PDF::Writer on rails to use rpdf views.
All ok in development mode (with webrick), ok in
./script/console test, in development and also in
production environment.
When I switch to production environment in apache
(fcgi mode) FPFD generate well graphics, but become
an arror when I wrote text (perhaps for font trouble
troble?)
ActionView::TemplateError (undefined method `[]’ for nil:NilClass) on
line #15
15: pdf.add_text_wrap left_base, top-30, width,
"Aula "

I try copy environmente/development.rb to
environmente/production.rb but all the same.
There is some troble in fcgi mode?

Bests, Tomaso

On 9/26/06, minni [email protected] wrote:

    troble?)

ActionView::TemplateError (undefined method `[]’ for nil:NilClass) on
line #15
15: pdf.add_text_wrap left_base, top-30, width, "Aula "

    I try copy environmente/development.rb to
    environmente/production.rb but all the same.
    There is some troble in fcgi mode?

I’m not sure what would be causing this. Is it possible to get a more
detailed stack trace?

-austin

Austin Z. * [email protected] * http://www.halostatue.ca/
* [email protected] * You are in a maze of twisty little passages, all alike. // halo • statue
* [email protected]

here the full stack trace.
If I remove all pdf.add_text_wrap commands, and I leave only draw
command (like
pdf.fill_color(Color::RGB.from_html(’#E6E6E6;’))
pdf.rectangle(left, cur_y-4, 610, 15).fill
pdf.line(left+70, cur_y-4 ,left+70, cur_y+11).stroke
no error happenz

Thanks, Tomaso

ActionView::TemplateError (undefined method `[]’ for nil:NilClass) on
line #15 of app/views/facolta/calendario/orario_aule.rpdf:
12: #if a == 8
13: pdf.start_new_page if a>1
14: #table = PDF::SimpleTable.new
15: pdf.add_text_wrap left_base, top-30, width,
“Aula #{aula} I Periodo - 2 OTTOBRE - 18 NOVEMBRE 2006”, 15,
:center
16: cur_y=top-60
17: (1…6).each { |g|
18:
pdf.fill_color(Color::RGB.from_html(’#E6E6E6;’))

/usr/lib/ruby/gems/1.8/gems/pdf-writer-1.1.3/lib/pdf/writer.rb:1540:in
`char_width’

/usr/lib/ruby/gems/1.8/gems/pdf-writer-1.1.3/lib/pdf/writer.rb:1702:in
`add_text_wrap’

/usr/lib/ruby/gems/1.8/gems/pdf-writer-1.1.3/lib/pdf/writer.rb:1690:in
`loop’

/usr/lib/ruby/gems/1.8/gems/pdf-writer-1.1.3/lib/pdf/writer.rb:1690:in
add_text_wrap' #{RAILS_ROOT}/app/views/facolta/calendario/orario_aule.rpdf:15:inrender’
#{RAILS_ROOT}/app/views/facolta/calendario/orario_aule.rpdf:9:in
each_index' #{RAILS_ROOT}/app/views/facolta/calendario/orario_aule.rpdf:9:inrender’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_view/base.rb:406:in
eval' #{RAILS_ROOT}/vendor/plugins/pdf_render/lib/pdf_render.rb:25:inrender’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_view/base.rb:406:in
`delegate_render’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_view/base.rb:290:in
`render_template’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_view/base.rb:251:in
`render_file’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/base.rb:726:in
`render_file’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/base.rb:695:in
`render_with_no_layout’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/layout.rb:253:in
`render_without_benchmark’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/benchmarking.rb:53:in
`render’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/benchmarking.rb:53:in
`measure’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/benchmarking.rb:53:in
`render’

#{RAILS_ROOT}/app/controllers/facolta/calendario_controller.rb:305:in
`orario_aule’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/base.rb:941:in
`send’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/base.rb:941:in
`perform_action_without_filters’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/filters.rb:368:in
`perform_action_without_benchmark’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/benchmarking.rb:69:in
`perform_action_without_rescue’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/benchmarking.rb:69:in
`measure’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/benchmarking.rb:69:in
`perform_action_without_rescue’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/rescue.rb:82:in
`perform_action’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/base.rb:408:in
`send’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/base.rb:408:in
`process_without_filters’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/filters.rb:377:in
`process_without_session_management_support’

/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_controller/session_management.rb:117:in
process' /usr/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/dispatcher.rb:38:indispatch’
/usr/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/fcgi_handler.rb:150:in
process_request' /usr/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/fcgi_handler.rb:54:inprocess!’
/usr/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/fcgi_handler.rb:53:in
each_cgi' /usr/lib/ruby/1.8/fcgi.rb:597:ineach’
/usr/lib/ruby/1.8/fcgi.rb:597:in each_cgi' /usr/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/fcgi_handler.rb:53:inprocess!’
/usr/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/fcgi_handler.rb:23:in
`process!’
/www/http/internos/lisa/dispatch.fcgi:24

Austin Z. ha scritto:

On 9/26/06, minni [email protected] wrote:

here the full stack trace.
If I remove all pdf.add_text_wrap commands, and I leave only draw
command (like
pdf.fill_color(Color::RGB.from_html(‘#E6E6E6;’))
pdf.rectangle(left, cur_y-4, 610, 15).fill
pdf.line(left+70, cur_y-4 ,left+70, cur_y+11).stroke
no error happenz

What character set are you using? It appears that you have some
characters that don’t have default widths defined and you need to put
them in a substitution map (see the manual for details on how the
manual added the copyright symbol, for example).

-austin

Austin Z. * [email protected] * http://www.halostatue.ca/
* [email protected] * You are in a maze of twisty little passages, all alike. // halo • statue
* [email protected]

I’m using “Times-Roman”, and if I wrote on
./script/console
require ‘pdf/simpletable’
pdf=PDF::Writer.new
pdf.select_font “Times-Roman”
pdf.add_text_wrap 100, 100, 400, “Aula”, 15
pdf.render

no error happen...
only in production mode, on apache fcgi...
Is possible a misconfiguration on www-user?
PDF::Writer use some ENV variable?
root and ww-user have same shell (bash) on /etc/passwd
something else? Really, I've no idea...
Trouble only on apache/fcgi... Argh!

Thank you for your kind help

Tomaso

Austin Z. ha scritto:

On 9/26/06, Tomaso M. [email protected] wrote:

    I'm using "Times-Roman", and if I wrote on
    ./script/console
    require 'pdf/simpletable'
    pdf=PDF::Writer.new
    pdf.select_font "Times-Roman"
    pdf.add_text_wrap 100, 100, 400, "Aula", 15
    pdf.render

Does this specific problem test case fail in production? If it does,
it sounds like a Rails problem and I don’t know what to say about it
– PDF::Writer does not use ENV variables.

-austin

Austin Z. * [email protected] * http://www.halostatue.ca/
* [email protected] * You are in a maze of twisty little passages, all alike. // halo • statue
* [email protected]

No, if I run
./script/console production
no erro happen…
Thank you anyware.

Tomaso

Austin Z. ha scritto:

No way!
I’ve decided to run application in development mode under apache/fcgi,
but using production environment, i.e. whith cahing class:
config.cache_classes = true
config.action_controller.consider_all_requests_local = false
config.action_controller.perform_caching = true
If I call development mode with other name (for example new_state),
and I correct database.yml and environments/new_state.rb the
error become like production mode…

Than I set DefaultInitEnv RAILS_ENV development and no preoblem found.
If someone know differences between devlopment status and other
status (production or elseware) tell me where I can read about it
(nothing in agile web and rail recipes)

Thank you Austin, right way is the problem in Rails…

Tomaso

minni ha scritto:

PDF::Writer do not work properly in fcgi mode, in linux.
The trouble is in PDF::Writer::FontMetrics class that try
to read afm in binary mode and do some operations that is
prohibited in fcgi.
The solution is the creation of rfm file who is only
unmarshaled. This workaround has beautiful side effect to
increase the performance of pdf generation.

Here the snipplet (whith Times-Roman):
cd <your application>
./script/console development
>> require 'pdf/writer'
>> p=PDF::Writer::FontMetrics.open("Times-Roman")
>> p.save_as_rfm
>> exit
mv Times-Roman.afm.rfm \
	/usr/lib/ruby/gems/1.8/gems/pdf-writer-1.1.3\
	/lib/pdf/writer/fonts/

To made this for all the fonts, simply execute in console:

Dir.foreach(’/usr/lib/ruby/gems/1.8/gems/pdf-writer-1.1.3/lib/pdf/writer/fonts/’)
{|d|; if d=~/.afm$/; p=PDF::Writer::FontMetrics.open(d); p.save_as_rfm;
end }
and copy all to destination
mv *.rfm /usr/lib/ruby/gems/1.8/gems/pdf-writer-1.1.3
/lib/pdf/writer/fonts/

Hope this is useful...

Minni


Solution to tread
PDF::Writer Switching to Production Trouble (on rails)