【发布时间】:2011-05-25 13:54:27
【问题描述】:
我需要能够为从模板创建的文档添加水印。我现在有以下代码:
# 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();
如果在我使用 Prawn 中的原始数据之前运行,我可以加水印,去 图。
所以我的问题是:
任何人都知道我如何使用 prawn 来实现相同的效果 的混合动力车?我宁愿在本地处理水印。
Prawn 中是否有与
GetOverContent()等效的基本形式?有没有更好的方法将一串原始 PDF 数据导入 Prawn 不使用
:template和StringIO? (我看到了#add_content方法 但这没有用)
TL;DR:我需要在 Prawn 模板文本上方浮动文本 给文档加水印。
我可以研究的任何见解或路径将不胜感激。如果这 没有意义,我可以澄清一下。
【问题讨论】:
-
**注意:我知道我有“d”而不是“document”——在实际代码中这是一个辅助方法,所以忽略它:)
-
你是如何应用模板的?这是图片吗?
-
不。它是 PDF 数据的原始字符串——这就是为什么我必须使用 StringIO 来避免将其写入文件的原因。
-
Prawn 移除了模板。查看类似问题的答案:stackoverflow.com/a/25044631/5307177