【问题标题】:While creating pdf in asp.net facing problem在asp.net中创建pdf时面临问题
【发布时间】:2020-07-13 16:33:59
【问题描述】:

我正在使用带有 C# 的 Visual Studio 2019。当我尝试创建一个 pdf 文档时,它已成功创建,但是当它通过 Response 方法打开时,它显示错误消息“Acrobat reader 无法打开文件,因为它不受支持的文件类型”。

enter code here

我正在使用以下代码。

 protected void Exportpdf()
        {
 string path = System.IO.Path.GetTempPath();
            PdfWriter writer = new PdfWriter(path+ "\\Appointments" + DateTime.Now.ToString("ddMMyyyy") + ".pdf");
            PdfDocument pdf = new PdfDocument(writer);
            Document document = new Document(pdf, PageSize.A4);
  Paragraph header = new Paragraph("MyTurns.in")
               .SetTextAlignment(TextAlignment.CENTER)
               .SetFontSize(20);

            // New line
            Paragraph newline = new Paragraph(new Text("\n"));

            document.Add(newline);
            document.Add(header);

            // Add sub-header
            Paragraph subheader = new Paragraph("Appointment List Date : " + DateTime.Now.ToString("dd/mm/yyyy"))
               .SetTextAlignment(TextAlignment.CENTER)
               .SetFontSize(15);
            document.Add(subheader);
 document.Close();
            Response.Buffer = false;
            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "attachment;filename=Appointments" + DateTime.Now.ToString("dd/MM/yyyy") + ".pdf");
            Response.Write(document);
           
            Response.End();
}

【问题讨论】:

  • 好吧,我会把缓冲区写到一个文件中,看看你能不能打开它。但是,您需要使用 Respose.BinaryWrite(document) - 这应该可以工作。

标签: c# asp.net pdf itext7


【解决方案1】:

您尝试通过编写 document 对象返回生成的 PDF:

Response.Write(document);

这是错误的,因为 iText 7 Document 只是将内容添加到 PdfDocument(您的对象 pdf)的外观,而后者又不包含 PDF,而是通过其 PdfWriter 写出, 在你的代码中的文件中

path+ "\\Appointments" + DateTime.Now.ToString("ddMMyyyy") + ".pdf"

因此,您应该写入响应的是该文件的内容。

由于DateTime.Now 同时发生了变化,您应该首先在变量中生成该路径,并在两个地方都使用该变量。

此外,正如 Albert D. Kallal 已经评论的那样,它应该写成二进制,使用 BinaryWrite

或者,如果您实际上不需要文件系统中的 pdf 结果,则可以使用MemoryStream 代替实际的文件系统文件。


您在 cmets and answers 中表示您确实对文件系统中的文件完全不感兴趣。因此,您应该使用MemoryStream。您已经找到了在 iText 5 中使用 MemoryStream 的示例代码。iText 7 的相应示例如下所示:

using (MemoryStream stream = new MemoryStream())
{
    using (PdfWriter writer = new PdfWriter(stream))
    using (PdfDocument pdf = new PdfDocument(writer))
    using (Document document = new Document(pdf, PageSize.A4))
    {
        Paragraph header = new Paragraph("MyTurns.in")
           .SetTextAlignment(TextAlignment.CENTER)
           .SetFontSize(20);

        // New line
        Paragraph newline = new Paragraph(new Text("\n"));

        document.Add(newline);
        document.Add(header);

        // Add sub-header
        Paragraph subheader = new Paragraph("Appointment List Date : " + DateTime.Now.ToString("dd/mm/yyyy"))
           .SetTextAlignment(TextAlignment.CENTER)
           .SetFontSize(15);
        document.Add(subheader);
    }

    Response.Buffer = false;
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;filename=Appointments" + DateTime.Now.ToString("dd/MM/yyyy") + ".pdf");
    Response.BinaryWrite(stream.ToArray());
}

顺便说一句,关于你的线路

Response.End();

您可能应该阅读ASP.NET documentation of it

提供此方法只是为了与 ASP 兼容,即与 ASP.NET 之前的基于 COM 的 Web 编程技术兼容。如果您想跳转到EndRequest 事件并向客户端发送响应,通常最好调用CompleteRequest

并重新考虑其用途。

【讨论】:

  • 明天我有时间。
  • 哇,先生你太棒了,它的工作,请提及你的全名,我想在我的网站上感谢你。这个问题浪费了我一个星期。我来自印度,你是哪个国家的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多