Java 将PDF与iText相结合会导致;是否要保存更改…?“;关闭对话框

Java 将PDF与iText相结合会导致;是否要保存更改…?“;关闭对话框,java,stream,adobe,bytearray,itext,Java,Stream,Adobe,Bytearray,Itext,关于这个问题,我在这里也看到过类似的问题,尽管主要是在C#/iTextSharp的上下文中 我有以下Java方法: public byte[] prependCoversheet(byte[] pdfBytes) { InputStream pdfTemplate = getClass().getResourceAsStream("coversheet.pdf"); PdfReader reader = new PdfReader(pdfTemplate); ByteAr

关于这个问题,我在这里也看到过类似的问题,尽管主要是在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中正确打开(与类似的,但可能不相关)问题是当PDF关闭时,阅读器会弹出一个确认对话框:

“是否要在关闭前保存对'someFilename.pdf'的更改?”

显然,没有要保存的更改。SO上的其他线程将初始缓冲区尾部的无关、未使用的字节作为罪魁祸首。我不清楚这种模式是否适用于这种情况,尽管如果我在调试模式下停止IDE,并在返回之前检查
byte[]
,会有大量连续的字节带零(0)

但是,在这种情况下,我不知道如何确定字节数组的“正确”大小


更新:上面的代码示例现在反映了注释中的建议,即使用两个ByteArrayOutputStreams。这就解决了问题

我将创建两个BAO实例,一个用于压模,另一个用于缝合


您的问题是,您在盖章后将单个BAO写入自身,这会混合内容。

您确定将相同的BAO重新用于盖章和组合PDF是一个好主意吗?@hoaz实际上,不,我一点也不确定。到目前为止效果不错。可能存在什么潜在问题?或者这是我的问题?我会创建两个BAS实例,一个用于stamper,另一个用于stitchingIf,在应用@hoaz建议使用单独的字节数组输出流(我确实支持)后,您仍然会得到错误的PDF,请提供一个样本PDF供检查。我刚刚尝试了两个ByteArrayOutputStreams。我将编辑上面的问题来说明我所做的。