Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 直接向流中添加水印_Java_Itext_Watermark - Fatal编程技术网

Java 直接向流中添加水印

Java 直接向流中添加水印,java,itext,watermark,Java,Itext,Watermark,我正在Servletoutputstream上创建PDF。 我需要将水印直接添加到流中,然后再将其导出为PDF。 是否有任何解决方案可以在不保存PDF的情况下动态添加水印或从流中获取文档对象 您可以使用PdfStamper进行此操作。下面的groovy代码在每个页面上“动态”添加一个图像,并将生成的PDF直接写入out: import com.lowagie.text.pdf.* void addWM( ByteArrayOutputStream baos, com.itextpdf.

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


您可以使用
PdfStamper
进行此操作。下面的groovy代码在每个页面上“动态”添加一个图像,并将生成的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()
    }
  }
@injecteer的回答是正确的(除了他使用
com.lowagie
类这一事实告诉我他正在使用,但他建议分两步创建最终的PDF。首先创建PDF时没有水印,然后使用水印创建

正如@mkl在他的评论中所指出的,如果使用页面事件,您可以一次性创建PDF

这是页面事件类:

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
事件类中定义的文本将在每次页面完成时添加到现有内容下。

正如@injecteer的回答已经指出的那样,您可以将当前作为响应流传输的PDF导入
PdfReader
中,改为使用
PdfStamper
进行水印,然后发送作为响应的戳记结果。尽管如此,考虑到资源使用情况,最好在创建原始PDF时添加水印。先生,如何获取Servletoutputstream的文档对象。使用ireport我在流上创建PDF,在将其导出为PDF文件之前,在同一PDF中,我需要通过itext.我不明白你的问题。问题“如何获取
ServletOutputStream
文档
对象”听起来很尴尬。你突然引入了iReport(可能是JasperReports问题,而不是itext问题)。至于通过itext添加水印:你有两个答案(采矿和注射工)我不知道一个有经验的开发人员还需要什么信息。先生,我在开发方面非常新。在我的项目中,我使用JasperReports创建报告,并使用Itext在同一报告中添加水印。在这里,我必须编写两个单独的操作来制作pdf,一个用于使用JasperReport和t模板另一个原因是使用生成的pdf文件并在其中制作水印。因此,我需要直接在该模板上添加水印,而不是传递任何现有的pdf。Bruno的答案应该是可接受的答案。我尝试了很长时间,按照Injecteer使用Input和Output ByteArray来实现,但没有任何乐趣。OneDPage的类重写成功了第一次。