直接在流中添加水印

时间:2014-02-05 11:12:56

标签: java itext watermark

  

我正在Servletoutputstream上创建一个PDF。   我需要先将水印添加到流中,然后再将其导出为PDF。   是否有任何解决方案可以在没有保存PDF的情况下在飞行中添加水印或从流中获取文档对象。

2 个答案:

答案 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()
    }
  }