Java 直接向流中添加水印
我正在Servletoutputstream上创建PDF。 我需要将水印直接添加到流中,然后再将其导出为PDF。 是否有任何解决方案可以在不保存PDF的情况下动态添加水印或从流中获取文档对象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.
您可以使用
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的类重写成功了第一次。