用虾水印(使用模板)

时间:2011-05-25 13:54:27

标签: ruby pdf prawn pdftk

我需要能够为从模板创建的文档添加水印。我现在有以下代码:

# 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 /层,但是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();

如果在我使用Prawn中的原始数据之前运行,我可以加水印,去吧 图。

所以我的问题是:

  1. 任何人都知道如何使用prawn来实现相同的效果 混合动力?我宁愿在当地处理水印。

  2. Prawn中有GetOverContent()的基本等价物吗?

  3. 是否有更好的方法可以将一串原始PDF数据输入到Prawn中 没有使用:templateStringIO? (我看到了#add_content方法 但那不起作用)


  4. TL; DR:我需要在Prawn模板文本上方浮动文本a la 将文档加水印。

    我可以研究任何我可以研究的见解或路径。如果这 没有意义我可以澄清。

2 个答案:

答案 0 :(得分:2)

您可以尝试标记文档。

create_stamp("watermark") do
 rotate(30, :origin => [-5, -5]) do
   stroke_color "FF3333"
   stroke_ellipse [0, 0], 29, 15
   stroke_color "000000"
   fill_color "993333"
   font("Times-Roman") do
     draw_text "Watermark", :at => [-23, -3]
   end
   fill_color "000000"
 end
end

stamp_at "watermark", [210, 210] 

答案 1 :(得分:0)

        create_stamp("stamp") do
            fill_color "cc0000"
            text_rendering_mode(:fill_stroke) do
                transparent(0.5){
                text_box "WATERMARK",
                :size   => 50,
                :width  => bounds.width,
                :height => bounds.height,
                :align  => :center,
                :valign => :center,
                :at     => [0, bounds.height],
                :rotate => 45,
                :rotate_around => :center
            }
            end
          end

        repeat (:all) do
            stamp("stamp")
        end