2 回答
TA贡献1793条经验 获得超6个赞
您正在使用RandomAccessSourceFactory并传递一个封闭的流,您在其中写入了 PDF 文档。RandomAccessSourceFactory需要一个已准备好读取的输入流。
首先,您应该使用MemoryStream.NET 世界原生的。ByteArrayOutputStream是出于内部目的从 Java 移植的类(尽管它MemoryStream也扩展了)。其次,你不必使用RandomAccessSourceFactory——有一个更简单的方法。
您可以使用以下行MemoryStream从用于创建临时 PDF 的字节创建一个新实例:MemoryStream
baos = new MemoryStream(baos.ToArray());
作为补充说明,最好PdfMerger直接关闭实例而不是关闭文档 - 关闭PdfMerger也会关闭基础文档。
总而言之,我们得到了以下有效的代码:
foreach (var html in htmlList)
{
MemoryStream baos = new MemoryStream();
PdfDocument temp = new PdfDocument(new PdfWriter(baos));
HtmlConverter.ConvertToPdf(html, temp, properties);
ReaderProperties rp = new ReaderProperties();
baos = new MemoryStream(baos.ToArray());
temp = new PdfDocument(new PdfReader(baos, rp));
pdfMerger.Merge(temp, 1, temp.GetNumberOfPages());
temp.Close();
}
pdfMerger.Close();
TA贡献1798条经验 获得超3个赞
也许不是那么简洁。我用“使用”。
private byte[] CreatePDF(string html)
{
byte[] binData;
using (var workStream = new MemoryStream())
{
using (var pdfWriter = new PdfWriter(workStream))
{
//Create one pdf document
using (var pdfDoc = new PdfDocument(pdfWriter))
{
pdfDoc.SetDefaultPageSize(iText.Kernel.Geom.PageSize.A4.Rotate());
//Create one pdf merger
var pdfMerger = new PdfMerger(pdfDoc);
//Create two identical pdfs
for (int i = 0; i < 2; i++)
{
using (var newStream = new MemoryStream(CreateDocument(html)))
{
ReaderProperties rp = new ReaderProperties();
using (var newPdf = new PdfDocument(new PdfReader(newStream, rp)))
{
pdfMerger.Merge(newPdf, 1, newPdf.GetNumberOfPages());
}
}
}
}
binData = workStream.ToArray();
}
}
return binData;
}
创建 PDF
private byte[] CreateDocument(string html)
{
byte[] binData;
using (var workStream = new MemoryStream())
{
using (var pdfWriter = new PdfWriter(workStream))
{
using (var pdfDoc = new PdfDocument(pdfWriter))
{
pdfDoc.SetDefaultPageSize(iText.Kernel.Geom.PageSize.A4.Rotate());
ConverterProperties props = new ConverterProperties();
using (var document = HtmlConverter.ConvertToDocument(html, pdfDoc, props))
{
}
}
binData = workStream.ToArray();
}
}
return binData;
}
- 2 回答
- 0 关注
- 492 浏览
添加回答
举报