无法将内存中的 PDF 文件与 iText7 合并

Can't merge in-memory PDF files with iText7

我正在尝试将一些 HTML 文件转换为 PDF 文件,然后将这些 PDF 合并在一起。 我正在使用 iText7 并且尝试了一些方法:

第一种方法:

using iText.Html2pdf;
using iText.Kernel.Pdf;
using iText.Kernel.Utils;

[...]

public static byte[] GeneratePdfFromHtmlFiles(params string[] htmlSources)
{
    using (var docStream = new MemoryStream())
    using (var docWriter = new PdfWriter(docStream))
    using (var doc = new PdfDocument(docWriter))
    {
        var merger = new PdfMerger(doc);
        foreach (var html in htmlSources)
        {
            using (var pageStream = new MemoryStream())
            using (var pageWriter = new PdfWriter(pageStream))
            using (var page = new PdfDocument(pageWriter))
            {
                HtmlConverter.ConvertToPdf(html, page, new ConverterProperties());
                doc.AddNewPage(); // I don't even know if this is needed
                var numberOfPages = page.GetNumberOfPages();
                merger.Merge(page, 1, numberOfPages);
            }
        }
        return docStream.ToArray();
    }
}

在第一种方法中,行 merger.Merge(page, 1, numberOfPages); 抛出 NullReferenceException。我怀疑这是因为 HtmlConverter.ConvertToPdf(html, page, new ConverterProperties()); 关闭了与 page 关联的 PdfDocument。我试图在转换之前添加 page.SetCloseWriter(false);,但没有成功。

第二种方法:

using iText.Html2pdf;
using iText.Kernel.Pdf;
using iText.Kernel.Utils;

[...]

public static byte[] GeneratePdfFromHtmlFiles(params string[] htmlSources)
{
    using (var docStream = new MemoryStream())
    using (var docWriter = new PdfWriter(docStream))
    using (var doc = new PdfDocument(docWriter))
    {
        var merger = new PdfMerger(doc);
        foreach (var html in htmlSources)
        {
            using (var pageStream = new MemoryStream())
            using (var pageWriter = new PdfWriter(pageStream))
            using (var page = new PdfDocument(pageWriter))
            {
                page.SetCloseWriter(false);
                HtmlConverter.ConvertToPdf(html, page, new ConverterProperties());
                using (var newPage = new PdfDocument(pageWriter))
                {
                    var numberOfPages = newPage.GetNumberOfPages();
                    merger.Merge(newPage, 1, numberOfPages);
                }
            }
        }
        return docStream.ToArray();
    }
}

第二种方法与第一种方法非常相似,但我尝试从 pageWriter 创建一个新的 PdfDocument,我用 page.SetCloseWriter(false); 打开了它。但是,var numberOfPages = newPage.GetNumberOfPages(); returns 0行,执行时在merger.Merge(newPage, 1, numberOfPages);处出现错误

同样,我想要实现的是将一些 HTML 页合并为一个 PDF 文件。我真的很想使用内存解决方案,我认为我的问题归结为 HtmlConverter.ConvertToPdf 关闭了 PdfDocument。也许我采取了一种幼稚的方法,我被这些问题困住了而无法找到解决方案。

更新

我使用了@ShaneDems 方法,它似乎工作正常。我担心它会奇怪地加入我的所有页面,但通过对我的 CSS 进行一些调整,我最终的 PDF 文件每页有一个 HTML,这正是我想要的:

var html = string.Join(string.Empty, htmlSources);
using (var docStream = new MemoryStream())
using (var docWriter = new PdfWriter(docStream))
using (var doc = new PdfDocument(docWriter))
{
    HtmlConverter.ConvertToPdf(html, doc, new ConverterProperties());
    return docStream.ToArray();
}

对于我的 CSS 调整,我使用了:

<style type="text/css">
    @page {
        margin: 0
    }

    .footer {
         (...)
         page-break-after:always;
    }
</style>

不过,我想知道您 没有 访问要转换的 HTML 或无法注入 [=61] 的情况=],找到一个使用多个 PDF 页面并合并它们的解决方案会很有趣。

不过,我还是达到了目的,谢谢!

我会先将 html 个文件合并在一起,然后再转换成一个 pdf。

只需将 htmlSources 数组中的所有字符串附加到某个新字符串,然后使用该新字符串创建 pdf。