PDF 生成后无法打开 (vb.net) (asp.net)

Posted

技术标签:

【中文标题】PDF 生成后无法打开 (vb.net) (asp.net)【英文标题】:Unable to open PDF after it's generated (vb.net) (asp.net) 【发布时间】:2018-05-01 16:01:39 【问题描述】:

很抱歉这个问题,但我是 .net 和 vb.net 的新手。我真的需要你的帮助!我在 asp.net (vb.net) 中生成一个 PDF 文件。它应该在浏览器中自动打开,但它给出了错误 - 无法加载 PDF 文档。我看到它是在驱动器上创建并正确打开的。可能是什么问题?

Protected Sub ExportToPDF(sender As Object, e As EventArgs)

    Response.ContentType = "application/pdf"
    Dim pdfDoc As New Document(PageSize.A4, 50.0F, 10.0F, 10.0F, 10.0F)
    PdfWriter.GetInstance(pdfDoc, New 
       FileStream(Context.Server.MapPath("~/ejik.pdf"), FileMode.CreateNew))
    pdfDoc.Open()
    pdfDoc.Add(New Paragraph("What is going on?")) 
    pdfDoc.Close()
    Response.Write(pdfDoc)
    Response.End()

End Sub

提前感谢您!

P.S.:抱歉,我忘了说我使用 iTextSharp 创建 PDF

【问题讨论】:

您可能想要写入 pdfDoc 的字节。 抱歉,不明白你的意思 【参考方案1】:

你的代码全错了。您正在创建一个 Web 应用程序,并创建了一个 Document 类型的 对象,以便您可以将 PDF 文件 写入磁盘。 (您甚至需要磁盘上的那个文件吗?您正在编写一个 Web 应用程序!)然后,您不将文件发送给最终用户,而是将 Document object 写入 Response 而不是(文件的字节)。那永远都行不通,不是吗?

如果你先在内存中创建PDF文件会更好:

MemoryStream ms = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(document, ms);
document.Open();
document.Add(Assinatura());
document.Close();

然后你在内存中获取那个文件的字节,并将它们发送到Response

byte[] bytes = ms.ToArray();
ms.Close();
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment;filename=ejik.pdf");
Response.Buffer = true;
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.BinaryWrite(bytes);
Response.End();

这就是评论的意思。您需要发送 PDF 文件的 byte 数组,而不是 pdfDoc。另见iTextSharp is producing a corrupt PDF with Response

【讨论】:

非常感谢!我明白了!

以上是关于PDF 生成后无法打开 (vb.net) (asp.net)的主要内容,如果未能解决你的问题,请参考以下文章

用C#编写的asp.net 和 vb.net编写的asp.net 有性能上的差异吗?

如何把asp文件格式转换成pdf文件格式?

ASP.NET - VB.NET - 更新 MS_Access 表

Asp.Net 将网页响应保存为 PDF

C#/VB.NET 将RTF转为PDF

ASP.NET用户自定义控件