当前位置: 首页 > 知识库问答 >
问题:

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

汤昊
2023-03-14

我使用的是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个答案

经博延
2023-03-14

一般来说,这种方法是有效的

using (var ms = new MemoryStream())
{
    //yourStream.Seek(0, SeekOrigin.Begin)
    yourStream.CopyTo(ms);
}
施选
2023-03-14

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

顺便说一下,由于您基本上没有对HtmlConver. ConvertToDocumal返回的文档做任何特别的事情,您可能可以使用不同的HtmlConver方法,在代码中开销更少。

 类似资料:
  • 如何使用itext7在内存流中创建PDF而不是物理文件?我不知道如何在最新版本中做到这一点,有帮助吗? 我尝试了以下代码,但pdfSM没有正确填充: 完整的测试代码如下所示供您参考,它在通过filePath进入PdfWriter时有效,但不适用于内存流:

  • 虽然它按预期工作,并嵌入了使用的字体子集,但我想知道是否有一种方法可以使生成的PDF文档完全不嵌入字体。当创建实例并将属性设置为并使用它们来生成各种PDF构建块时,就可以使用这种方法。在使用时,我正在寻找同样的行为。

  • 我想用Java编写一个html文件。

  • 我使用的是log4j2。在两个应用程序中使用xml,并且两者都可以登录相同的信息。日志应用程序A和B中提到的日志文件大小为100KB。当信息。日志信息超过100KB。日志创建1个备份文件。当应用程序B尝试登录时,日志会被写入信息中。日志1而不是信息。日志当我重新启动应用程序B时,日志将获得登录信息。日志为什么会观察到这种奇怪的日志记录方式?解决方法是什么。下面是log4j2。应用程序B的xml

  • 我正在为工作中的一个项目尝试闪烁。我已经到了通过应用计数窗口等来处理流的地步。然而,我注意到一个特殊的行为,我无法解释。 看起来一个流是由两个线程处理的,输出也是分成两部分的。 首先,我注意到使用将流打印到标准控制台时的行为。 然后,我打印到一个文件,它实际上正在输出文件夹中的两个名为1和2的文件中打印。 有人能解释一下为什么Flink会有这种行为吗?如何配置它?为什么有必要对结果流进行拆分? 并

  • 我有这种超文本标记语言: HTML只包含生成的PDF文件中的文本,而忽略了图像。 这是我用来转换该段落的代码: 我使用的是iText7 7.1.11和iText7.pdfhtml3.0.0。 我还应该告诉你,使用iText7 7.1.2和iText7,同样的代码在同样的图像下工作得非常完美。PDFHTML2.0.2。 这些版本之间有什么变化吗? 当然,图像可以使用https://server/Us