为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
犯罪嫌疑人X 2023-08-20 10:08:11
我正在使用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();
查看完整描述

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();


查看完整回答
反对 回复 2023-08-20
?
呼如林

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;

    }


查看完整回答
反对 回复 2023-08-20
  • 2 回答
  • 0 关注
  • 492 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信