iText 7-HTML到PDF写入MemoryStream而不是文件

时间:2019-02-06 14:50:11

标签: c# itext itext7

我正在使用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");
    }
}

2 个答案:

答案 0 :(得分:1)

通常这种方法有效

using (var ms = new MemoryStream())
{
    //yourStream.Seek(0, SeekOrigin.Begin)
    yourStream.CopyTo(ms);
}

答案 1 :(得分:1)

workStreamdocument完成在其中创建结果之前,您与pdfWriter进行了干预。此外,干预的意图还不清楚,首先从内存流中检索字节,然后再将其写回内存中……?

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");
}

顺便说一句,由于您实际上对document返回的HtmlConverter.ConvertToDocument并没有什么特别的事情,因此您可以使用其他HtmlConverter方法,而代码开销更少。