C# Can';t将内存中的PDF文件与iText7合并
我正在尝试将一些HTML文件转换为PDF文件,然后将这些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
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数据合并到主文档中。