gpt4 book ai didi

java - 使用 ByteArrayOutputStream 时,Itext PdfStamper getOverContent 返回 null

转载 作者:行者123 更新时间:2023-12-02 02:38:53 28 4
gpt4 key购买 nike

我正在处理 pdf 文件。我需要在现有的 pdf 文件上添加水印。这就是为什么,我编写了以下代码。当我使用 FileOutputStream 时,它工作得很好,但我需要使用 ByteArrayOutputStream 因为我的数据来自数据库,我需要将其保存为字节数组。问题从这里开始。当我使用 PdfStamper 的 ByteArrayOutputStream 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();
}

最佳答案

这是禁止的:

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

您创建一个OutputStream ,名为outputStream ,并且您似乎将完整的现有 PDF 复制到 OutputStream (使用 write() )。那么您似乎打算向该 OutputStream 添加另一个完整的 PDF通过传递相同的 OutputStreamPdfStamper实例。这会导致 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();
}

关于java - 使用 ByteArrayOutputStream 时,Itext PdfStamper getOverContent 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45822236/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com