C# Can';t将内存中的PDF文件与iText7合并

C# Can';t将内存中的PDF文件与iText7合并,c#,html,pdf,merge,itext7,C#,Html,Pdf,Merge,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

我正在尝试将一些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();
    }
}
在第一种方法中,行
Merge.Merge(第1页,numberOfPages)抛出一个
NullReferenceException
。我怀疑这是因为
HtmlConverter.ConvertToPdf(html,page,newconverterproperties())关闭与
页面相关的
PDF文档
。我已尝试添加
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()
返回0,然后在
Merge.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>

@页面{
保证金:0
}
.页脚{
(...)
分页符后:始终;
}
然而,我想知道,如果您无法访问要转换的HTMLs,或者无法插入CSS,那么找到一个使用多个PDF页面并合并它们的解决方案会很有趣


尽管如此,我还是实现了我的目标,谢谢

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


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

我使用了您的方法,并且成功了(我更新了答案)。非常感谢。太好了,很高兴我能帮忙!这种方法有一个问题。我有一个模板,我要填写,但HTML是非常基于位置的。我附加了每个页面,但是当它呈现时,由于绝对位置,所有页面都从顶部开始。在这种情况下,您需要转换为PDF,然后将PDF数据合并到主文档中。