これはよくある問題のようですが、長い間検索した後、自分のニーズに合った解決策をまだ見つけていません。itextsharpを使用して、バイト配列を作成するpdfフォームに入力しています。(同じフォームの複数のページがあり、同じ情報を1つのPDFドキュメントにまとめています)。これは問題なく実行できます。問題は、最終的なpdfドキュメントをユーザーに表示するときに、最初にファイルを保存または開くようにユーザーに求めることなく、別のウィンドウまたはタブで開く必要があることです。また、サーバーにファイルを保存して、filestreamを使用して再度開く必要はありません。content-dispositionを「inline」に変更すると、PDFが同じブラウザウィンドウに表示されます。これにより、ユーザーはブラウザの戻るボタンをクリックしてサイトに戻る必要があり、フォーム送信プロセスが再開されるため、問題が発生します。現在のところ、私のコードはpdfを正常に生成し、開くか保存するように促します。これは私が削除する必要があるステップです。新しいタブまたはウィンドウでPDFを開いたJavaスニペットを覚えているようですが、複製/検索に失敗しました。私もさまざまなヘッダーで遊んだことがありますが、壁にぶつかりました。どんな助けでも大歓迎です。
(必要なデータ検証の後、ボタンをクリックして以下のコードのgoメソッドを呼び出します。)
private void go()
{
List<byte[]> pdfs = new List<byte[]>();
while (PageNumber <= Convert.ToInt32(PageCountLabel.Text))
{
pdfs.Add(PopulatePDF());
}
MemoryStream ms = MergePDFs(pdfs);
//opens pdf in new tab after save/open option
Response.AddHeader("Content-Disposition", "attachment; filename=TheDocument.pdf");
Response.ContentType = "application/pdf";
Response.BinaryWrite(ms.ToArray());
Response.End();
}
//************fills in pdf form****************//
private byte[] PopulatePDF()
{
MemoryStream ms = new MemoryStream();
PdfStamper Stamper = null;
PdfReader Reader = new PdfReader(Server.MapPath("~/PDFTemplates/template1.pdf"));
try
{
string temp = Profile.ToString().ToUpper();
PdfCopyFields Copier = new PdfCopyFields(ms);
Copier.AddDocument(Reader);
Copier.Close();
PdfReader docReader = new PdfReader(ms.ToArray());
ms = new MemoryStream();
Stamper = new PdfStamper(docReader, ms);
AcroFields Fields = Stamper.AcroFields;
//fill form fields here
PageNumber++;
Stamper.FormFlattening = true;
}
finally
{
if (Stamper != null)
{
Stamper.Close();
}
}
return ms.ToArray();
}
//combines pdf pages into single document
private MemoryStream MergePDFs(List<byte[]> pdfs)
{
MemoryStream ms = new MemoryStream();
PdfCopyFields Copier = new PdfCopyFields(ms);
foreach (var pdf in pdfs)
Copier.AddDocument(new PdfReader(pdf));
Copier.Close();
return ms;
}