iText 7 - HTML 到 PDF 写入 MemoryStream 而不是文件
iText 7 - HTML to PDF write to MemoryStream instead of file
我正在使用 iText 7,特别是 HtmlConverter.ConvertToDocument
方法,将 HTML 转换为 PDF。问题是,我真的不想在我的服务器上创建 PDF 文件,我宁愿在内存中做所有事情,然后将它发送到用户浏览器以便他们可以下载它。
谁能告诉我如何使用此库的示例,而不是写入文件写入 MemoryStream,以便我可以将其直接发送到浏览器?
我一直在寻找示例,但我似乎只能找到与文件输出有关的示例。
我尝试了以下方法,但一直收到有关无法访问已关闭内存流的错误消息。
public FileStreamResult pdf() {
using (var workStream = new MemoryStream())
using (var pdfWriter = new PdfWriter(workStream)) {
pdfWriter.SetCloseStream(false);
using (var document = HtmlConverter.ConvertToDocument(html, pdfWriter)) {
//Returns the written-to MemoryStream containing the PDF.
byte[] byteInfo = workStream.ToArray();
workStream.Write(byteInfo, 0, byteInfo.Length);
workStream.Position = 0;
return new FileStreamResult(workStream, "application/pdf");
}
//return new FileStreamResult(workStream, "application/pdf");
}
}
通常这种方法有效
using (var ms = new MemoryStream())
{
//yourStream.Seek(0, SeekOrigin.Begin)
yourStream.CopyTo(ms);
}
您在 document
和 pdfWriter
完成在其中创建结果之前干预了 workStream
。此外,您的干预意图不明确,首先您从内存流中检索字节,然后将它们写回其中...?
public FileStreamResult pdf()
{
var workStream = new MemoryStream())
using (var pdfWriter = new PdfWriter(workStream))
{
pdfWriter.SetCloseStream(false);
using (var document = HtmlConverter.ConvertToDocument(html, pdfWriter))
{
}
}
workStream.Position = 0;
return new FileStreamResult(workStream, "application/pdf");
}
顺便说一下,由于您基本上没有对 HtmlConverter.ConvertToDocument
返回的 document
做任何特别的事情,您可能可以使用不同的 HtmlConverter
方法来减少代码开销。
我正在使用 iText 7,特别是 HtmlConverter.ConvertToDocument
方法,将 HTML 转换为 PDF。问题是,我真的不想在我的服务器上创建 PDF 文件,我宁愿在内存中做所有事情,然后将它发送到用户浏览器以便他们可以下载它。
谁能告诉我如何使用此库的示例,而不是写入文件写入 MemoryStream,以便我可以将其直接发送到浏览器?
我一直在寻找示例,但我似乎只能找到与文件输出有关的示例。
我尝试了以下方法,但一直收到有关无法访问已关闭内存流的错误消息。
public FileStreamResult pdf() {
using (var workStream = new MemoryStream())
using (var pdfWriter = new PdfWriter(workStream)) {
pdfWriter.SetCloseStream(false);
using (var document = HtmlConverter.ConvertToDocument(html, pdfWriter)) {
//Returns the written-to MemoryStream containing the PDF.
byte[] byteInfo = workStream.ToArray();
workStream.Write(byteInfo, 0, byteInfo.Length);
workStream.Position = 0;
return new FileStreamResult(workStream, "application/pdf");
}
//return new FileStreamResult(workStream, "application/pdf");
}
}
通常这种方法有效
using (var ms = new MemoryStream())
{
//yourStream.Seek(0, SeekOrigin.Begin)
yourStream.CopyTo(ms);
}
您在 document
和 pdfWriter
完成在其中创建结果之前干预了 workStream
。此外,您的干预意图不明确,首先您从内存流中检索字节,然后将它们写回其中...?
public FileStreamResult pdf()
{
var workStream = new MemoryStream())
using (var pdfWriter = new PdfWriter(workStream))
{
pdfWriter.SetCloseStream(false);
using (var document = HtmlConverter.ConvertToDocument(html, pdfWriter))
{
}
}
workStream.Position = 0;
return new FileStreamResult(workStream, "application/pdf");
}
顺便说一下,由于您基本上没有对 HtmlConverter.ConvertToDocument
返回的 document
做任何特别的事情,您可能可以使用不同的 HtmlConverter
方法来减少代码开销。