0

私はこの問題に関して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による提案を反映しています。これで問題は解決します!

4

1 に答える 1

1

2つのBAOSインスタンスを作成します。1つはスタンパー用、もう1つはステッチ用です。

あなたの問題は、スタンプの後にそれ自体に単一のBAOSを書き込み、これがコンテンツを混合することです。

于 2012-12-08T18:46:50.643 に答える