【问题标题】:extra pdf is downloading while exporting pdf in c# .net在 c# .net 中导出 pdf 时正在下载额外的 pdf
【发布时间】:2015-05-28 10:54:45
【问题描述】:

在导出时,一个 pdf 正在下载到所需位置,但另一个额外的 pdf 正在下载文件夹中下载

如何停止下载额外的 pdf?

            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "attachment;filename=" + Projname + ".pdf");
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            System.IO.StringWriter stringWrite = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
            design.RenderControl(htmlWrite);
            string myText = stringWrite.ToString().Replace("&", "&");
            StringReader sr = new StringReader(myText.ToString());
            Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0f);
            string strPath = "D:\\WeeklyReport of " + Projname + ".pdf";
            PdfWriter writer = PdfWriter.GetInstance(pdfDoc, new FileStream(strPath, FileMode.Create));
            pdfDoc.Open();
            XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
            pdfDoc.Close();
            pdfDoc.Dispose();

【问题讨论】:

  • 代码的前三行初始化 (HTTP?)Response 以将 PDF 作为附件返回,即下载;其余的创建一个 PDF 并将其保存到您的 D: 驱动器上。除非您隐藏相关内容,否则调用者应检索一个空的 PDF 文件作为下载文件。如果您不希望这样,请不要以这种方式初始化 Response。
  • 在本地主机中我能够导出,但在实时服务器中出现错误 - 访问路径“D:\WeeklyReport of Testing project.pdf”被拒绝。@mkl
  • 访问...被拒绝 - 听起来很自然。为什么生产服务器应该允许 Web 应用程序将某些内容存储到其 D:\ 文件夹中?
  • 我只想在任何地方下载,而不是在实时托管的应用程序文件夹中。我的意思是如果有人点击导出按钮,他们可以在他们的系统中获取文件。如果它保存在下载文件夹中也可以,但它应该在客户端/用户的系统中下载@mkl
  • 那么你为什么要在服务器上检索一个PdfWriterFileStream 为目标呢?

标签: asp.net pdf pdf-writer


【解决方案1】:

这一行

PdfWriter writer = PdfWriter.GetInstance(pdfDoc, new FileStream(strPath, FileMode.Create));

您的代码调用PdfWriter 写入服务器文件系统上的文件。

如果您不希望这样,则必须将 new FileStream(strPath, FileMode.Create) 替换为其他内容,例如HTTP 响应输出流:

PdfWriter writer = PdfWriter.GetInstance(pdfDoc, Response.OutputStream);

这有潜在的缺点,

  • HTTP 响应没有包含其有效负载大小的标头。已知某些浏览器版本在这种情况下会出现问题;和
  • 如果在 PDF 创建过程中出错,客户端会检索半个 PDF 而不是正确的错误消息。

如果这些缺点让您担心,您可能希望实例化 MemoryStream,将 PdfWriter 定位到它,构建 PDF,从流中检索 byte[],为大小创建内容长度标头该数组,最后将数组写入Response.OutputStream

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2016-06-18
    • 2019-04-18
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多