我正在Servletoutputstream上创建一个PDF。 我需要先将水印添加到流中,然后再将其导出为PDF。 是否有任何解决方案可以在没有保存PDF的情况下在飞行中添加水印或从流中获取文档对象。
答案 0 :(得分:1)
injecteer的答案是正确的(除了他使用com.lowagie
类告诉我他正在使用an obsolete version of iText)这一事实,但他建议在两遍中创建最终PDF。首先PDF是创建没有水印,然后用水印创建。
正如mkl在评论中指出的那样,如果您使用页面事件,则可以一次性创建PDF。我写了一个小Watermarking例子。
这是页面事件类:
public class Watermark extends PdfPageEventHelper {
protected Phrase watermark = new Phrase("WATERMARK", new Font(FontFamily.HELVETICA, 60, Font.NORMAL, BaseColor.LIGHT_GRAY));
@Override
public void onEndPage(PdfWriter writer, Document document) {
PdfContentByte canvas = writer.getDirectContentUnder();
ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER, watermark, 298, 421, 45);
}
}
此事件已添加到PdfWriter
,如下所示:
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
writer.setPageEvent(new Watermark());
从现在开始,每次页面完成时,Watermark
事件类中定义的文本都将添加到现有内容下。
答案 1 :(得分:0)
您可以使用PdfStamper
。下面的groovy代码“在运行中”在每个页面上添加一个Image,并将生成的PDF直接写入out
:
import com.lowagie.text.pdf.*
void addWM( ByteArrayOutputStream baos, com.itextpdf.text.Image image, out ){
PdfReader reader = new PdfReader( baos.toByteArray() )
PdfStamper stamp = new PdfStamper( reader, out, reader.pdfVersion )
try{
( 1..reader.numberOfPages ).each{ int page ->
PdfContentByte over = stamp.getOverContent( page )
over.beginText()
addImage()
over.endText()
}
}finally{
stamp.close()
baos.close()
}
}