使用 IText 7 从 html 转换生成一个包含多个页面的 pdf 文档

我正在使用IText 7,我已经能够获取一个 html 页面并为该页面生成 pdf,但我需要从多个 html 页面生成一个 pdf 文档并按页面分隔。例如:我有Page1.html、Page2.html和Page3.html。我需要一个 3 页的 pdf 文档,第一页的内容为Page1.html,第二页的内容为Page2.html等等...


这是我的代码,它适用于一个 html 页面:


ConverterProperties properties = new ConverterProperties();              

PdfWriter writer = new PdfWriter(pdfRoot, new WriterProperties().SetFullCompressionMode(true));

PdfDocument pdfDocument = new PdfDocument(writer);

pdfDocument.AddEventHandler(PdfDocumentEvent.END_PAGE, new HeaderPdfEventHandler());

HtmlConverter.ConvertToPdf(htmlContent, pdfDocument, properties);

是否可以循环多个 html 页面,为每个 html 页面添加一个新页面到 PdfDocument,然后仅生成一个 pdf,每个 html 页面一页?


更新


我一直在关注这个示例并尝试将其从 Java 转换为 C#,我尝试使用PdfMerger并循环 html 页面...但我Cannot access a closed stream在这一行收到 Exception :


temp = new PdfDocument(

                    new PdfReader(new RandomAccessSourceFactory().CreateSource(baos), rp));

看起来和ByteArrayOutputStream baos实例有关。有什么建议么?这是我当前的代码:


foreach (var html in htmlList)

{

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    PdfDocument temp = new PdfDocument(new PdfWriter(baos));

    HtmlConverter.ConvertToPdf(html, temp, properties);              

    ReaderProperties rp = new ReaderProperties();

    temp = new PdfDocument(

        new PdfReader(new RandomAccessSourceFactory().CreateSource(baos), rp));

    merger.Merge(temp, 1, temp.GetNumberOfPages());

    temp.Close();

}

pdfDocument.Close();


犯罪嫌疑人X
浏览 493回答 2
2回答

摇曳的蔷薇

您正在使用RandomAccessSourceFactory并传递一个封闭的流,您在其中写入了 PDF 文档。RandomAccessSourceFactory需要一个已准备好读取的输入流。首先,您应该使用MemoryStream.NET 世界原生的。ByteArrayOutputStream是出于内部目的从 Java 移植的类(尽管它MemoryStream也扩展了)。其次,你不必使用RandomAccessSourceFactory——有一个更简单的方法。您可以使用以下行MemoryStream从用于创建临时 PDF 的字节创建一个新实例:MemoryStreambaos = 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();

呼如林

也许不是那么简洁。我用“使用”。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;    }创建 PDFprivate 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;    }
打开App,查看更多内容
随时随地看视频慕课网APP