Java 使用ByteArrayOutputStream时,Itext PdfStamper getOverContent返回null
我正在处理一个pdf文件。我需要在现有pdf文件上添加水印。这就是为什么,我写了下面的代码。当我使用FileOutputStream时,它工作得非常好,但我需要使用ByteArrayOutputStream,因为我的数据来自数据库,我需要将其保存为字节数组。问题从这里开始。当我使用PdfStamper的ByteArrayOutputStream getOvercontent方法时,返回null。我该怎么办?提前谢谢。Java 使用ByteArrayOutputStream时,Itext PdfStamper getOverContent返回null,java,itext,bytearrayoutputstream,pdfstamper,Java,Itext,Bytearrayoutputstream,Pdfstamper,我正在处理一个pdf文件。我需要在现有pdf文件上添加水印。这就是为什么,我写了下面的代码。当我使用FileOutputStream时,它工作得非常好,但我需要使用ByteArrayOutputStream,因为我的数据来自数据库,我需要将其保存为字节数组。问题从这里开始。当我使用PdfStamper的ByteArrayOutputStream getOvercontent方法时,返回null。我该怎么办?提前谢谢。 byte[]bytes=getAsByteArray(); ByteArra
byte[]bytes=getAsByteArray();
ByteArrayOutputStream outputStream=新的ByteArrayOutputStream(bytes.length);
PdfReader reader=新PdfReader(字节);
int numberOfPages=reader.getNumberOfPages();
outputStream.write(字节,0,字节.长度);
PdfStamper压模=新的PdfStamper(读卡器,输出流);
Font=Font(Font.NORMAL,135,Color.RED);
对于(int i=0;i
旧版本的代码是这样的
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();
}
byte[]bytes=FileUtils.readFileToByteArray(新文件(“myPdf.pdf”);
PdfReader reader=新PdfReader(字节);
int numberOfPages=reader.getNumberOfPages();
PdfStamper stamper=新PdfStamper(读取器,新文件输出流(“MyPdfOut.pdf”);
Font f=Font(Font.NORMAL,135,Color.RED);
对于(inti=1;i这是禁止的:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(bytes.length);
outputStream.write(bytes, 0, bytes.length);
PdfStamper stamper = new PdfStamper(reader, outputStream);
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();
您创建了一个名为OutputStream
,名为OutputStream
,并且似乎将完整的现有PDF复制到了该OutputStream
(使用write()
)。然后,您似乎打算通过将相同的OutputStream
传递到PdfStamper
实例,向该OutputStream
添加另一个完整的PDF。这将导致PDF文件损坏
这也将导致非法的PDF语法:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(bytes.length);
outputStream.write(bytes, 0, bytes.length);
PdfStamper stamper = new PdfStamper(reader, outputStream);
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页。因此,(int i=0;i是错误的。它应该是(int i=1;i这是禁止的:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(bytes.length);
outputStream.write(bytes, 0, bytes.length);
PdfStamper stamper = new PdfStamper(reader, outputStream);
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();
您创建了一个名为OutputStream
,名为OutputStream
,并且似乎将完整的现有PDF复制到了该OutputStream
(使用write()
)。然后,您似乎打算通过将相同的OutputStream
传递到PdfStamper
实例,向该OutputStream
添加另一个完整的PDF。这将导致PDF文件损坏
这也将导致非法的PDF语法:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(bytes.length);
outputStream.write(bytes, 0, bytes.length);
PdfStamper stamper = new PdfStamper(reader, outputStream);
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
是错误的。它应该是(for(int i=1;i