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

无法使用iText 7的HtmlConverter.ConvertToDocument方法生成可读的PDF

濮阳钟展
2023-03-14

我尝试使用itext7和itext7.pdfhtml从服务器上的某个HTML生成PDF,然后将写到MemoryStream的文件作为FileContentResult返回给客户端。但是,当客户端接收到PDF时,他们得到的只是一个不可打开的PDF文件,如果将文件扩展名更改为。txt,则可以看到该文件包含的内容仅为“%PDF-1.7%â'”。

在对htmlconverter.converttopdf进行了实验之后,我能够使下面示例中的简单内容正常工作(至少是它的主体);但是,我认为我现在需要htmlconverter.convertToDocument,因为我需要添加页脚并在生成的PDF上设置页面大小和页边距,而这些设置不包含在传入的HTML中(换句话说,我需要iTextDocument对象来操作)。

这是我正在使用的代码...

public static byte[] GeneratePdfFromHtml(Action<Document> pdfModifier)
{
    //Gives the converter some very simple HTML for it to create something with!
    var html = "<html><head><title>Extremely Basic Title</title></head><body>Extremely Basic Content</body></html>";

    using (var workStream = new MemoryStream())
    using (var pdfWriter = new PdfWriter(workStream))
    using (var document = HtmlConverter.ConvertToDocument(html, pdfWriter))
    {
        //Passes the document to a delegated function to perform some content, margin or page size manipulation
        pdfModifier(document);

        //Returns the written-to MemoryStream containing the PDF.   
        return workStream.ToArray();
    }
}

这是我工作的版本,但它缺少我需要传递给我的委托的对象。

public static byte[] GeneratePdfFromHtml(Action<Document> pdfModifier)
{
    //Gives the converter some very simple HTML for it to create something with!
    var html = "<html><head><title>Extremely Basic Title</title></head><body>Extremely Basic Content</body></html>";

    using (var workStream = new MemoryStream())
    using (var pdfWriter = new PdfWriter(workStream))
    {
        HtmlConverter.ConvertToPdf(html, pdfWriter);

        //No longer able to call this delegate as there is no Document object to use.
        //pdfModifier(document);

        //Returns the written-to MemoryStream containing the PDF.   
        return workStream.ToArray();
    }
}

共有1个答案

辛承志
2023-03-14

在您使用的版本中,您使用了htmlconverter.converttopdf。此调用还在内部创建document对象,但在返回之前关闭它。

关闭document对象会导致生成的PDF中仍在内存中的所有数据刷新到结果流中,然后用PDF拖尾结束结果流。

因此,您的工作版本返回一个完成的、完整的PDF文件。

using (var workStream = new MemoryStream())
using (var pdfWriter = new PdfWriter(workStream))
using (var document = HtmlConverter.ConvertToDocument(html, pdfWriter))
{
    //Passes the document to a delegated function to perform some content, margin or page size manipulation
    pdfModifier(document);

    document.Close();

    //Returns the written-to MemoryStream containing the PDF.   
    return workStream.ToArray();
}

或者像这样含蓄地说:

using (var workStream = new MemoryStream())
using (var pdfWriter = new PdfWriter(workStream))
{
    using (var document = HtmlConverter.ConvertToDocument(html, pdfWriter))
    {
        //Passes the document to a delegated function to perform some content, margin or page size manipulation
        pdfModifier(document);
    }

    //Returns the written-to MemoryStream containing the PDF.   
    return workStream.ToArray();
}
 类似资料:
  • 我正在尝试使用iText7将内容添加到现有的PDF中。我已经能够创建新的PDF,并使用段落和表格为其添加内容。然而,一旦我重新打开我创建的PDF并尝试向其写入更多内容,新内容就会开始覆盖旧内容。我希望新内容在旧内容之后附加到文档中。我怎样才能做到这一点? 编辑 这个类设置了一些常见的方法,这些方法将在对PDF文档进行每次更改时执行。 这就是我将内容添加到pdf的方式 当我执行第二个类时,它似乎将原

  • 本文向大家介绍使用maven生成可执行的jar包的方法,包括了使用maven生成可执行的jar包的方法的使用技巧和注意事项,需要的朋友参考一下 本文介绍了使用maven生成可执行的jar包的方法,分享给大家,具体如下: 从pom的xsi中可以打开描述pom的schema: 可以看到pom中,project的结构: 默认的mvn install生成的jar是不带主类入口的,需要在maven-comp

  • IText7中pdf阅读器中的getJavascript有没有等价的方法?我们正在寻找使用IText7清除pdf文档中的恶意内容。

  • 本文向大家介绍使用PHP生成PDF方法详解,包括了使用PHP生成PDF方法详解的使用技巧和注意事项,需要的朋友参考一下 利用PHP编码生成PDF文件是一个非常耗时的工作。在早期,开发者使用PHP并借助FPDF来生成PDF文件。但是如今,已经有很多函数库可以使用了,并且能够从你提供的HTML文件生成PDF文档。这让原先耗时的工作变得非常简单了。 FPDF FPDF是一个允许使用纯PHP生成PDF文档

  • 本文向大家介绍python读取文件名称生成list的方法,包括了python读取文件名称生成list的方法的使用技巧和注意事项,需要的朋友参考一下 经常需要读取某个文件夹下所有的图像文件。 我使用python写了个简单的代码,读取某个文件夹下某个后缀的文件,将文件名生成为文本(csv格式) 上面代码保存为:GetLst.py 使用时: 在cmd窗口输入: 发现上面代码不能深入到下一层目录,又做了点

  • 服务器:版本:1.12.6 API版本:1.24 Go版本:Go1.6.3 Git提交:78D1802 build:Tue Jan 31 23:47:34 2017 OS/arch:linux/amd64 Docker--Version docker Version1.12.6,构建78D1802 docker-compose-版本docker-compose版本1.5.2,构建未知