2

これはよくある問題のようですが、長い間検索した後、自分のニーズに合った解決策をまだ見つけていません。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;
    }
4

1 に答える 1

1

PDF生成コードを新しいページMyPDFPage.aspxに配置し、URLにパラメーターを設定します。たとえば、元のページのボタンに、javascriptのwindow.open()を使用するonclickイベントを追加します。

<html>
<head>
<script>
function open_win()
{
    window.open("MyPDFPage.aspx?fileid=0001", "_blank")
}
</script>
</head>
<body>

<input type="button" value="Open Window" onclick="open_win()">

</body>
</html>
于 2013-01-24T21:10:45.117 に答える