我正在制作一个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();
}
答案 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