2 回答

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
您正在使用RandomAccessSourceFactory并傳遞一個(gè)封閉的流,您在其中寫入了 PDF 文檔。RandomAccessSourceFactory需要一個(gè)已準(zhǔn)備好讀取的輸入流。
首先,您應(yīng)該使用MemoryStream.NET 世界原生的。ByteArrayOutputStream是出于內(nèi)部目的從 Java 移植的類(盡管它MemoryStream也擴(kuò)展了)。其次,你不必使用RandomAccessSourceFactory——有一個(gè)更簡單的方法。
您可以使用以下行MemoryStream從用于創(chuàng)建臨時(shí) PDF 的字節(jié)創(chuàng)建一個(gè)新實(shí)例:MemoryStream
baos = new MemoryStream(baos.ToArray());
作為補(bǔ)充說明,最好PdfMerger直接關(guān)閉實(shí)例而不是關(guān)閉文檔 - 關(guān)閉PdfMerger也會(huì)關(guān)閉基礎(chǔ)文檔。
總而言之,我們得到了以下有效的代碼:
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貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
也許不是那么簡潔。我用“使用”。
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;
? ? }
創(chuàng)建 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 關(guān)注
- 786 瀏覽
添加回答
舉報(bào)