c# - 如何使用 iText 返回 PDF
问题描述
我正在尝试返回带有简单文本的 PDF,但在下载文档时出现以下错误:加载 PDF 文档失败。任何有关如何解决此问题的想法表示赞赏。
MemoryStream ms = new MemoryStream();
PdfWriter writer = new PdfWriter(ms);
PdfDocument pdfDocument = new PdfDocument(writer);
Document document = new Document(pdfDocument);
document.Add(new Paragraph("Hello World"));
//document.Close();
//writer.Close();
ms.Position = 0;
string pdfName = $"IP-Report-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.pdf";
return File(ms, "application/pdf", pdfName);
解决方案
您必须在不关闭底层流的情况下关闭编写器,这将刷新其内部缓冲区。照原样,文档并没有被完整地写入内存流。除了 ms 之外的所有内容也应该在 ausing
中。
您可以通过检查代码中的长度ms
与下面的代码来验证是否发生了这种情况。
当using (PdfWriter writer =...)
关闭时,它将关闭编写器,这会导致它将挂起的写入刷新到底层流ms
。
MemoryStream ms = new MemoryStream();
using (PdfWriter writer = new PdfWriter(ms))
using (PdfDocument pdfDocument = new PdfDocument(writer))
using (Document document = new Document(pdfDocument))
{
/*
* Depending on iTextSharp version, you might instead use:
* writer.SetCloseStream(false);
*/
writer.CloseStream = false;
document.Add(new Paragraph("Hello World"));
}
ms.Position = 0;
string pdfName = $"IP-Report-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.pdf";
return File(ms, "application/pdf", pdfName);
推荐阅读
- node.js - 为什么我的节点模块没有在 react-native 中使用?
- c++ - 如何子类化组合框编译错误
- mainframe - JCL 在一行中合并记录
- java - 如何在java中将字符串时间戳转换为日期?
- terraform - 在 Terraform Enterprise 中可以创建的工作空间的数量是否有限制?
- python - ValueError:'X'不在列表中,为什么我不能使用字符串查找和替换
- jira-xray - 在文档生成器中添加前提条件描述
- javascript - Selectpicker 选择了第一个选项,但 selectpicker 标题是“未选择”
- android - 如何在 Flutter 中设计定时器
- python - 如何在python中的命令上使程序重新启动