6

iTextSharp 5.3.2.0を使用して、W-2フォームを含む既存のPDFファイルに情報を追加しています。すべてが完全に機能しており、ブラウザの応答ストリームに書き込むとPDFファイルは見栄えがします。ただし、ユーザーがPDFの表示を終了すると、「閉じる前に「W2.pdf」への変更を保存しますか?」というメッセージが表示されます。彼がWebページからドキュメントを表示するたびに。

問題を絞り込もうとして、実際にすべての変更を削除しましたが、問題は解決しません。これが私のコードの単純なバージョンで、データ書き込みの呼び出しがコメントアウトされています。

PdfReader pdfReader = new PdfReader(dataSource.ReportTemplate);

using(MemoryStream outputStream = new MemoryStream())
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream))
{
   //dataSource.DrawDataFields(pdfStamper);
   pdfStamper.FormFlattening = true;
   return outputStream;
}

この場合、「空の」PDFはブラウザに書き込まれ、見栄えがしますが、Acrobatウィンドウを閉じると、「保存しますか」というメッセージが表示されます。

この時点で、ソースPDFファイルに何か問題があると思っていました。ただし、PDFファイルの生のバイトをブラウザに送り返すときに、以下のコードを使用するときに「保存しますか」という質問は表示されません。

byte[] bytes = File.ReadAllBytes(dataSource.ReportTemplate);

using (MemoryStream outputStream = new MemoryStream())
{
    outputStream.Write(bytes, 0, bytes.Length);
    return outputStream;
}

私の結論は、iTextSharpは、PDFを開いてストリームにバイトを書き込む過程で、PDFに対して「悪い」ことをしているということですが、私はiTextSharpを初めて使用するため、簡単に何かを見逃してしまう可能性があります。

FWIW、これは私たちが話しているAcobatReader10.1.4です。

編集:テンプレートとして使用される元のPDFのサイズは約80Kです。ブラウザからストリーミングされた一時ファイルを見ると、iTextSharpによって書き込まれたPDFファイルは約150Kです。ただし、Acrobat Readerからの「変更の保存」の質問に「はい」と答えると、結果のファイルは再び約80Kになります。iTextSharpは間違いなくこのファイルに予期しないことをしています。

4

2 に答える 2

15

動作しない:

public byte[] MergeDataByDrawing(int copies)
{
    PdfReader pdfReader = new PdfReader(reportTemplate);

    using (MemoryStream outputStream = new MemoryStream())
    using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream))
    {
        pdfStamper.FormFlattening = true;
        return outputStream.GetBuffer();
    }
} 

働く:

public byte[] MergeDataByDrawing(int copies)
{
    PdfReader pdfReader = new PdfReader(reportTemplate);

    using (MemoryStream outputStream = new MemoryStream())
    using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream))
    {
        pdfStamper.FormFlattening = true;
        return outputStream.ToArray();
    }
}

GetBufferメソッドに問題があるようです。理由はわかりませんが、結果を出します!

私にアイデアを与えてくれたMKLと、適切なタイミングで適切な例を示したFredrikの小道具。

于 2012-09-25T19:07:37.227 に答える
1

http://itextpdf.com/history/?branch=52&node=521を参照してください

バグ修正AcroForms:場合によっては、Adobe Reader Xは、フラット化されたPDFフォームを閉じた後に「変更を保存」するかどうかを尋ねます。これは、/ AcroFormディクショナリに不要なエントリがいくつか存在するためです(たとえば、フォームがOOoで作成されたときに追加されました)。

このバグを修正したのはブルーノです。Adobe Reader 10で発生したことを覚えていますが、Adobe Reader 9では発生しませんでした。バグを報告したのは、この動作を示すPDFを送ってくれた顧客だったためです。

/AcroFormPDFを共有する場合は、辞書から他のどのエントリを削除する必要があるかを確認できます。OpenOfficeを使用してフォームを作成するときに追加されたものだけを削除しました。PDFを共有したくない場合、原因は常に謎のままです。

于 2012-09-25T16:00:36.923 に答える