テンプレートから作成されたドキュメントに透かしを入れることができる必要があります。私は今次のコードを持っています:
# Note: the raw PDF text (body variable below) is sent from a remote server.
Prawn::Document.new(:template => StringIO.new(body), :page_size =>
'A4') do |document|
# ... including other pages and sections to the template here ...
# watermark
d.page_count.times do |i|
d.go_to_page i
d.stroke_line [d.bounds.left, d.bounds.bottom], [d.bounds.right, d.bounds.top]
d.draw_text "Watermark", :rotate => 45, :at => [100,100], :size => 100
end
end
これは、私が理解できない何らかの理由でテンプレート化されたページを無視しています。ここでプロットが厚くなります。サーバーが透かしを追加すると、このコードは期待どおりに機能します(たとえば、ストレートRubyコード=エビが生成されていないページにテキストをオーバーレイしないが、透かしは事前に透かしを入れたテンプレートで機能します)。私の唯一の推測は、サーバーが実行しているz-index / layerを作成する方法はあるが、Prawn自体は作成できないということです。
これは、PDF生成自体を実行するサーバーからのコードの一部です。これは、iTextを使用して透かしを実行します。
PdfStamper stamper = new PdfStamper(...);
PdfContentByte over = stamper.GetOverContent(i + 1);
over.BeginText();
over.SetTextMatrix(20, 40);
over.SetFontAndSize(bf, 20);
over.SetColorFill(new Color(97, 150, 58));
over.ShowTextAligned(Element.ALIGN_CENTER,
watermarkText,
document.PageSize.Width / 2,
document.PageSize.Height / 2,
55);
over.EndText();
over.Stroke();
エビの生データを使用する前にそれが実行された場合は、透かしを入れることができます。図を参照してください。
だから私の質問は:
ハイブリッドの代わりにエビを使って同じ効果を達成する方法を知っている人はいますか?透かしをローカルで処理したいです。
GetOverContent()
エビに相当する基本的なものはありますか?:template
とを使用せずに生のPDFデータの文字列をPrawnに取り込むためのより良い方法はありStringIO
ますか?(私は#add_content
方法を見ましたが、それはうまくいきませんでした)
TL; DR:ドキュメントに透かしを入れるために、エビのテンプレートテキストの上にテキストをフロートさせる必要があります。
私が研究できる洞察や道はありがたいです。これが意味をなさない場合、私は明確にすることができます。