从存储器流中的新的标签页或窗口打开字节数组(open byte array from memory

2019-08-08 04:17发布

这似乎是一个常见的问题,而是一个漫长的搜索后,我还没有找到一个适合我的需求的解决方案。 我使用iTextSharp的填写从中我创建一个字节数组一个pdf格式。 (有与我结合成单一的PDF文档相同的信息相同形式的多页)。 我能做到这一点没有问题,问题是,当我显示最终PDF文档,我需要在不同的窗口或选项卡中打开它没有首先提示用户保存或打开该文件的用户。 我也不想有保存在服务器上的文件,并使用FILESTREAM重新打开它。 如果我改变了内容处置,以“内联”的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;
    }

Answer 1:

把你的PDF生成代码,在一个新的页面MyPDFPage.aspx上的URL参数,那么例如按钮原始网页上使用onclick事件从JavaScript window.open() :

<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>


文章来源: open byte array from memory stream in new tab or window