当使用ByteArrayOutputStream时,Itext PdfStamper getOverContent返回null

时间:2017-08-22 15:55:29

标签: java itext bytearrayoutputstream pdfstamper

我正在制作一个pdf文件。我需要在现有的pdf文件上添加水印。这就是为什么,我写了下面的代码。当我使用FileOutputStream它完美地工作,但我需要使用ByteArrayOutputStream,因为我的数据来自数据库,我需要将其保存为字节数组。问题从这里开始。当我使用ByteArrayOutputStream时,PdfStamper的getOvercontent方法返回null。我怎么处理这个?提前致谢。

byte[] bytes = getAsByteArray();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(bytes.length);
PdfReader reader = new PdfReader(bytes);
int numberOfPages= reader.getNumberOfPages();
outputStream.write(bytes, 0, bytes.length);
PdfStamper stamper = new PdfStamper(reader, outputStream);
Font font = font(Font.NORMAL, 135, Color.RED);
for (int i = 0; i < numberOfPages; i++) {
     //over Content is null
     PdfContentByte over = stamper.getOverContent(i);
     Phrase p = new Phrase("WATERMARK", font);
     PdfGState gs = new PdfGState();
     gs.setFillOpacity(0.5f);
     over.setGState(gs);
     ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 330, 450, 45);
     over.saveState();
}

旧版本的代码就是这样。

byte[] bytes = FileUtils.readFileToByteArray(new File("myPdf.pdf"));
PdfReader reader = new PdfReader(bytes);
int numberOfPages= reader.getNumberOfPages();
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("MyPdfOut.pdf"));
Font f = font(Font.NORMAL, 135, Color.RED);
for (int i = 1; i <= numberOfPages; i++) {
    PdfContentByte over = stamper.getOverContent(i);
    Phrase p = new Phrase("WATERMARK", f);
    PdfGState gs = new PdfGState();
    gs.setFillOpacity(0.5f);
    over.setGState(gs);
    ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 330, 450, 45);
    over.saveState();
}

1 个答案:

答案 0 :(得分:2)

禁止

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(bytes.length);
outputStream.write(bytes, 0, bytes.length);
PdfStamper stamper = new PdfStamper(reader, outputStream);

您创建了一个名为OutputStream的{​​{1}},似乎您将完整的现有PDF复制到outputStream(使用OutputStream)。然后,您似乎有意通过将同一write()传递给OutputStream实例来向OutputStream添加另一个完整的PDF。这应该会导致PDF文件损坏。

这也会导致非法PDF语法

PdfStamper

您有一个 PdfContentByte over = stamper.getOverContent(i); Phrase p = new Phrase("WATERMARK"); PdfGState gs = new PdfGState(); gs.setFillOpacity(0.5f); over.setGState(gs); ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 330, 450, 45); over.saveState(); 运算符,但您从不使用saveState()。对于每个restoreState(),您应该有一个saveState()。你的restoreState()位置错误!好像你不知道saveState()saveState()是关于什么的。

最后,你开始计数0,但第一页是第1页,而不是第0页。因此restoreState()是错误的。它应该是for (int i = 0; i < numberOfPages; i++)。此错误导致for (int i = 1; i <= numberOfPages; i++)成为over

这是尝试修复您的代码:

null