【问题标题】:open byte array from memory stream in new tab or window在新选项卡或窗口中从内存流中打开字节数组
【发布时间】:2013-01-24 19:59:46
【问题描述】:

这似乎是一个常见问题,但经过长时间的搜索,我还没有找到适合我需要的解决方案。我正在使用 itextsharp 填写我创建字节数组的 pdf 表单。 (我将同一表格的多个页面包含相同的信息合并到一个 pdf 文档中)。我可以毫无问题地做到这一点,问题是当我向用户显示最终的 pdf 文档时,我需要在不同的窗口或选项卡中打开它,而无需先提示用户保存或打开文件。我也不想在服务器上保存文件并使用文件流重新打开它。如果我将内容配置更改为“内联”,则 pdf 将显示在同一浏览器窗口中。这会产生问题,因为用户必须单击浏览器后退按钮才能导航回重新启动表单提交过程的站点。就目前而言,我的代码成功生成了 pdf 并提示他们打开或保存它。这是我需要删除的步骤。我似乎记得一些 java sn-p 在新选项卡或窗口中打开了 pdf,但我未能成功复制/找到它。我也玩过不同的头球,但我碰壁了。任何帮助将不胜感激。

(在必要的数据验证后,我通过单击按钮调用下面代码的 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;
    }

【问题讨论】:

  • 如果不先提示用户保存或打开文件,您将无法执行此操作。因为Response.End 终止了页面的生命周期。

标签: c# asp.net pdf bytearray memorystream


【解决方案1】:

将您的 PDF 生成代码放入带有 URL 参数的新页面 MyPDFPage.aspx,然后在原始页面上添加一个按钮,该按钮带有使用 window.open() from javascript 的 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>

【讨论】:

  • 基本上,Steve 生成​​ PDF 时所做的完全相同,这或多或少正是我们在其自己的页面中显示它所做的:)
  • 在我的搜索过程中看到了类似的东西,但我想我的大脑并没有把这些点联系起来 :) 这就像我想要的一样,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 2019-01-09
  • 2014-02-02
  • 2013-03-11
  • 2013-01-18
  • 2010-09-12
相关资源
最近更新 更多