我在这里看到过关于这个问题的类似问题,尽管主要是在C#/ iTextSharp的背景下。
我有以下Java方法:
public byte[] prependCoversheet(byte[] pdfBytes)
{
InputStream pdfTemplate = getClass().getResourceAsStream("coversheet.pdf");
PdfReader reader = new PdfReader(pdfTemplate);
ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
PdfCopyFields copy = new PdfCopyFields(baos1);
PdfStamper stamper = new PdfStamper(reader, baos2);
AcroFields coversheet = stamper.getAcroFields();
/* Set all the field values here, etc. */
coversheet.setField("fieldName", "Lorem ipsum dolor sit amet.");
stamper.setFormFlattening(true);
stamper.close();
copy.addDocument(new PdfReader(baos2.toByteArray()));
copy.addDocument(new PdfReader(pdfBytes));
copy.close();
baos.flush();
return baos1.toByteArray();
}
返回的byte[]
非常好,并且可以在Adobe Reader中正确打开(与类似的,但可能不相关的earlier question of mine不同)。 问题是,当PDF关闭时,Reader会抛出一个确认对话框:
“你想在关闭之前保存对'someFilename.pdf'的更改吗?”
显然,保存没有变化。 SO上的其他线程在初始缓冲区的尾部暗示了无关的未使用字节作为罪魁祸首。我不清楚这种模式是否适用于这种情况,虽然如果我在调试模式下停止我的IDE,并在返回之前检查byte[]
,那么 是连续的大量数字带零的字节(0)。
但是,在这种情况下,我不知道如何确定字节数组应该的“正确”大小。
更新:上面的代码示例现在反映了hoaz在评论中使用两个ByteArrayOutputStream
的建议。这解决了问题!
答案 0 :(得分:1)
我会创建两个BAOS实例,一个用于压模,另一个用于拼接。
你的问题是你在盖章后给自己写了一个BAOS,这就混合了内容。