我正在做一个pdf文件。我需要在exist 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();
}发布于 2017-08-22 16:09:38
这是禁忌
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(bytes.length);
outputStream.write(bytes, 0, bytes.length);
PdfStamper stamper = new PdfStamper(reader, outputStream);您创建一个名为OutputStream的outputStream,并且似乎将一个完整的现有PDF复制到该OutputStream (使用write())。然后,您似乎打算通过向OutputStream实例传递相同的OutputStream来向该PdfStamper添加另一个完整的PDF。这将导致PDF文件损坏。
这也会导致非法的PDF语法。
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()和restoreState()是关于什么的。
最后,开始计算0,但第一页是第1页,而不是0页。因此,for (int i = 0; i < numberOfPages; i++)是错误的。应该是for (int i = 1; i <= numberOfPages; i++)。这个错误是导致over成为null的原因。
这是一次修复代码的尝试:
// create a Phrase with a certain font
Font font = font(Font.NORMAL, 135, Color.RED);
Phrase p = new Phrase("WATERMARK", font);
// Create a reader and a stamper
PdfReader reader = new PdfReader(getAsByteArray());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, outputStream);
int numberOfPages= reader.getNumberOfPages();
for (int i = 1; i <= numberOfPages; i++) {
PdfContentByte over = stamper.getOverContent(i);
over.saveState();
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.5f);
over.setGState(gs);
ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 330, 450, 45);
over.restoreState();
}https://stackoverflow.com/questions/45822236
复制相似问题