私はこの問題に関してSOで同様の質問を見てきましたが、ほとんどは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を閉じると、Readerが確認ダイアログをスローすることです。
「閉じる前に「someFilename.pdf」への変更を保存しますか?」
明らかに、保存する変更はありません。SOの他のスレッドは、原因として、初期バッファー量の末尾にある無関係な未使用のバイトを関係付けています。このパターンがこの状況に当てはまるかどうかはわかりませんが、IDEをデバッグモードで停止しbyte[]
、戻る直前を調べると、ゼロ(0)の連続したバイトがかなりの数あります。
ただし、この状況では、バイト配列の「正しい」サイズを決定する方法がわかりません。
更新:上記のコード例は、2つのsを使用するというコメントのhoazByteArrayOutputStream
による提案を反映しています。これで問題は解決します!