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 關注
- 805 瀏覽
添加回答
舉報