无法将内存中的 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。
我正在尝试将一些 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。