14

各ページの背景画像を配置する必要がある pdf ブックを作成しています。

ページのサイズは (576 x 576) で、背景画像のサイズは 2700 x 2700 (300 dpi) です (これらのサイズは要件であるため、調整できません)。私の問題は、背景画像がページ内で不均衡に表示されることです。どうすればこれを修正できますか? これが私のコードです:

 Prawn::Document.generate("#{Rails.root.to_s}/public/#{filename}.pdf", :page_size => [576,576], :left_margin => 50, 
:right_margin => 50, :page_layout => :portrait, :skip_page_creation => true,   :skip_encoding => true, 
:background => "#{Rails.root.to_s}/public/images/pdf/bg_blank_low.jpg" ) do |pdf|
    ....
    ....
    ....
)

背景画像として 300 dpi の画像を配置できる他の方法はありますか。

背景としてpdfテンプレートを追加しようとしましたが、まだ運がありません.

どんな提案やヒントも大歓迎です。

ありがとう。

4

2 に答える 2

12

オプションは画像を拡大縮小できないため、あなたがしようとしていることは:backgroundオプションを使用して行うことはできません。このオプションを使用する場合は、画像が PDF と同じ dpi (通常は 72 dpi) であることを確認する必要があります。Prawn::Document.generate:background:background

ただし、通常の画像のようにページに画像を埋め込むだけで、その上にテキストを浮かせることができます。これは、画像を埋め込むときに拡大縮小できるため機能します。コードは次のようになります。

Prawn::Document.generate("#{Rails.root.to_s}/public/#{filename}.pdf", :page_size => [576,576], :left_margin => 50, :right_margin => 50, :page_layout => :portrait, :skip_page_creation => true, :skip_encoding => true) do |pdf|
  bg_image = "#{Rails.root.to_s}/public/images/pdf/bg_blank_low.jpg"
  pdf.image bg_image, :scale => 0.2311
  pdf.move_up 576
end

これにより、「背景」がページを完全に覆うようになります (スケール 2700/576 を手動で計算したため)。余白を尊重したい場合 (これはおそらく一般的にはより良い方法です)、次のように変更できます。

pdf.image bg_image, :width => pdf.bounds.width

これにより、ページの境界ボックスの幅に基づいて画像が自動的にスケーリングされます。move_upもちろん、次のように変更する必要があります。

pdf.move_up pdf.bounds.height

これを行った後、テキストの挿入を開始できます。テキストは画像の上に表示され、シミュレートされたスケーリングされた背景が得られます。

アップデート

これはコメントに関する更新です。自動的に作成されるページがあり、それらの背景を同じにしたい場合、現在の prawn リリースをそのまま使用しているとうまくいきません。この機能が本当に必要な場合は、エビにパッチを当てる必要があります。

エビのソース ( https://github.com/sandal/prawnから) を入手して見てください。あなたが求めているのはlib/document.rb、244行目にメソッドがありstart_new_page、これがあなたが求めているものです。このメソッドの 280 行目で、背景が設定されている場所を確認できます。残念ながら、それはcanvasつまり、画像がすでに適切なサイズである必要があることを意味します。これが、背景画像が自動的に拡大縮小されない理由です。

この動作をオーバーライドする必要があります。これは Ruby であるため、プロジェクト内でクラスを再度開き、このメソッドをコピーして貼り付けるだけです (これを行う方法についてさらに情報が必要な場合は、Ruby クラスのモンキー パッチに関する情報がたくさんあります)。ここで、このメソッドを思いのままに編集します。おそらく最も簡単な方法は、キャンバスをすべて削除してから、上記のイメージ トリックを使用することです。したがって、行は次のようになります。

image(@background, :width => bounds.width) if @background
move_up bounds.height

これで、背景を設定する標準的な方法に戻ることができ、すべてが機能するはずです。

実際、280行目を次のように変更することで回避できる場合もあります。

canvas { image(@background, :width => bounds.width) } if @background

そして、余分な行を入力する必要がなくなり、すべてが正常に機能するはずです:)。オプションで画像を使用すると、:width画像が自動的にスケーリング:atされますが、エビのようにオプションを使用しても画像はスケーリングされません。

注:私は実際にこれを行っていないので、ねじれを解決する必要があるかもしれません.

于 2011-08-10T13:50:43.603 に答える