【问题标题】:Convert web form content to PDF using c# in asp.net web forms在 asp.net web 表单中使用 c# 将 web 表单内容转换为 PDF
【发布时间】:2023-04-11 05:38:01
【问题描述】:

我在 for 循环中调用 ExportToPDF2 方法来生成 pdf 文档。

问题是循环在Respons.End() 之后停止。

我怎样才能解决这个问题,有没有比使用这种技术更好的方法?

private int ExportToPDF2()
{
    using (StringWriter sw = new StringWriter())
    {
        using (HtmlTextWriter hw = new HtmlTextWriter(sw))
        {
            Page.RenderControl(hw);
            StringReader sr = new StringReader(sw.ToString());
            Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
            PdfWriter writer = PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
            pdfDoc.Open();
            XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
            pdfDoc.Close();
            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.pdf");
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Write(pdfDoc);
            Response.End();
        }                
    }
    return 0;
}

【问题讨论】:

  • 您不能像那样一次下载多个文档。您可以在服务器上生成一堆 PDF,然后将它们放入某种存档文件格式(例如 zip 文件),然后允许用户下载该文件。
  • 感谢您的回复。您能否对我需要编写的代码(即示例)有所了解。到目前为止,我看到的所有示例都涉及使用 Response.End() 的 Web 表单。当我尝试在 c# 类中编写代码时,我无法使用响应,或者我是否需要在“使用”部分中引用我的代码?非常感谢您的帮助。
  • 他说的是不要写回复。将文件写入磁盘,然后向用户显示一个列出所有文件的页面,以便他可以通过单击每个链接进行下载。
  • 然后研究如何!当你想到一个问题时,你的第一反应不应该是问 Stack Overflow 是怎么做的。做一个网络搜索,看看其他人是怎么做的。尝试实施它。如果遇到困难,请提供MCVE

标签: c# asp.net pdf webforms


【解决方案1】:

我很奇怪你多次保存同一页面 (Page.RenderControl(hw);) 的输出!

不管怎样,从Server发送多个outputStream是不可能的,你可以试试

Response.Write(somefile);
Response.End();
textBox1.Text = "1111"; // it wont work because you can't have multiple outputstream

最好的解决方法是制作一个 zip 文件,然后执行 Response.Write(zipFile)

但是,如果您仍然坚持分开(多次下载)更好,则最好先将每个文件保存在服务器上:

using (HtmlTextWriter hw = new HtmlTextWriter(sw))
{
  Page.RenderControl(hw);
  StringReader sr = new StringReader(sw.ToString());
  Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
  PdfWriter.GetInstance(pdfDoc, new FileStream(Server.MapPath("~") + pdfName + ".pdf");
} 

那就用https://stackoverflow.com/a/30682695/336511这个技巧来支持多下载吧。请注意,这适用于现代浏览器。

var links = [
  'https://s3.amazonaws.com/Minecraft.Download/launcher/Minecraft.exe',
  'https://s3.amazonaws.com/Minecraft.Download/launcher/Minecraft.dmg',
  'https://s3.amazonaws.com/Minecraft.Download/launcher/Minecraft.jar'
];

function downloadAll(urls) {
  var link = document.createElement('a');

  link.setAttribute('download', null);
  link.style.display = 'none';

  document.body.appendChild(link);

  for (var i = 0; i < urls.length; i++) {
    link.setAttribute('href', urls[i]);
    link.click();
  }

  document.body.removeChild(link);
}
<button onclick="downloadAll(window.links)">Test me!</button>

【讨论】:

  • 谢谢丹尼尔。我真的很感谢你的回复。我会试一试。
  • 其实还是失败了。正如您在上面指出的那样,我猜该表单不允许循环迭代。在我的情况下,该 zip 文件也不起作用。除了不在现场的客户外,没有其他用户可以查看这些文档。该文件将在生成后立即通过电子邮件发送。我已经使用存储过程挖掘了另一种方法。不漂亮,但它现在有效。感谢丹尼尔的贡献。
  • @click2000 欢迎光临。如果您能接受我的回答或至少支持我的回答,我们将不胜感激。直到你:)
  • 只是为了更新您,我设法使用 iTextSharp 成功迭代,并在访问此链接 c-sharpcorner.com/blogs/… 后添加到 Daniel 的反馈中。感谢大家的帮助。
  • 我将数据绑定到控件(gridview、标签等),然后我调用 ExportToPDF2();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 2013-11-05
  • 2017-12-28
  • 1970-01-01
相关资源
最近更新 更多