Generate more than one PDF in memory and export it in a compressed file

2

Currently the code below exports and compacts the PDF one at a time and I need to export multiple PDF into a compressed file

public ActionResult PDFTodosMesAtual(ProcessamentoRegistros _processamento)
        {
            try
            {
                string _nomeArquivo = string.Empty;

                //AQUI RETORNO UM LISTA DE DOCUMENTOS HTML QUE SERÁ CONVERTIDO EM PDF
                IEnumerable<ProcessamentoRegistros> _todosHtmlMesAtual = _IRepositorio.ObterTodosHTMLMesAtual(); 

                if (_todosHtmlMesAtual != null)
                {
                    //TENTEI FAZE ALGO ASSIM, MAS SEM SUCESSO:                    
                    //foreach (var item in _todosHtmlMesAtual)

                        #region :: converte arquivo html para pdf ::
                        _nomeArquivo = "Documento_Fiscal_" + DateTime.Now.ToString().Replace(" ", "_").Replace("/", "_").Replace(":", "_") + ".zip";
                        MemoryStream file = null;
                        var pechkin = Factory.Create(new GlobalConfig());
                        var _pdf = pechkin.Convert(new ObjectConfig()
                                                    .SetLoadImages(true).SetZoomFactor(1)
                                                    .SetPrintBackground(true)
                                                    .SetScreenMediaType(true)
                                                    .SetCreateExternalLinks(true)
                                                    .SetIntelligentShrinking(true).SetCreateInternalLinks(true)
                                                    .SetAllowLocalContent(true), item.DocumentoHtml.ToString());
                        file = new MemoryStream();
                        file.Write(_pdf, 0, _pdf.Length);                       

                        byte[] arquivo = _pdf;
                        #endregion

                        #region :: compacta e faz o download do arquivo pdf ::
                        using (var compressedFileStream = new MemoryStream())
                        {
                            using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Update, false))
                            {
                                var zipEntry = zipArchive.CreateEntry("documento.pdf");
                                using (var originalFileStream = new MemoryStream(file.ToArray()))
                                {
                                    using (var zipEntryStream = zipEntry.Open())
                                    {
                                        originalFileStream.CopyTo(zipEntryStream);
                                    }
                                }
                            }
                            return new FileContentResult(compressedFileStream.ToArray(), "application/zip") { FileDownloadName = _nomeArquivo };//return RedirectToAction("Index", "Documento");
                        }
                        #endregion

                }
                else
                {
                    return RedirectToAction("Index", "Documento");
                }
            }
            catch (Exception ex)
            {
                ViewBag.MsgErro = string.Format("Download não efetuado! " + ex.Message.ToString());
                return RedirectToAction("Index", "Documento");
            }
        }

I started this post here insert the link description here with credits from Geroge Wurthmann

    
asked by anonymous 31.05.2017 / 12:35

1 answer

2

The code is very similar to the response .

Important to say that you are using System.IO.Compression for native compression with C #.

This should work in your code:

public ActionResult PDFTodosMesAtual(ProcessamentoRegistros _processamento)
{
    try
    {
        string _nomeArquivo = string.Empty;

        //AQUI RETORNO UM LISTA DE DOCUMENTOS HTML QUE SERÁ CONVERTIDO EM PDF
        IEnumerable<ProcessamentoRegistros> _todosHtmlMesAtual = _IRepositorio.ObterTodosHTMLMesAtual();

        if (_todosHtmlMesAtual != null)
        {
            #region :: converte arquivo html para pdf ::
            List<byte[]> meusPDFs = new List<byte[]>();
            foreach (var item in _todosHtmlMesAtual)
            {
                _nomeArquivo = "Documento_Fiscal_" + DateTime.Now.ToString().Replace(" ", "_").Replace("/", "_").Replace(":", "_") + ".zip";
                MemoryStream file = null;
                var pechkin = Factory.Create(new GlobalConfig());
                var _pdf = pechkin.Convert(new ObjectConfig()
                                            .SetLoadImages(true).SetZoomFactor(1)
                                            .SetPrintBackground(true)
                                            .SetScreenMediaType(true)
                                            .SetCreateExternalLinks(true)
                                            .SetIntelligentShrinking(true).SetCreateInternalLinks(true)
                                            .SetAllowLocalContent(true), item.DocumentoHtml.ToString());
                file = new MemoryStream();
                file.Write(_pdf, 0, _pdf.Length);
                meusPDFs.Add(_pdf);
            }

            #endregion

            #region :: compacta e faz o download do arquivo pdf ::
            using (var compressedFileStream = new MemoryStream())
            {
                //Informações sobre o GetEncoding: https://msdn.microsoft.com/en-us/library/system.text.encodinginfo.getencoding(v=vs.110).aspx
                Encoding nomeArquivoEncoding = Encoding.GetEncoding(850);
                //Cria um arquivo ZIP e armazena na memória (memory stream) com enconding 850
                using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Update, false, nomeArquivoEncoding))
                {
                    int i = 1; //Só uso essa variável para dar nome diferente pra todos PDFs
                    foreach (var pdf in meusPDFs)
                    {
                        //Criar uma entrada para cada anexo a ser "Zipado"
                        var zipEntry = zipArchive.CreateEntry("MeuPDF"+i);

                        //Pegar o stream do anexo
                        using (var originalFileStream = new MemoryStream(pdf))
                        {
                            using (var zipEntryStream = zipEntry.Open())
                            {
                                //Copia o anexo na memória para a entrada ZIP criada
                                originalFileStream.CopyTo(zipEntryStream);
                            }
                        }
                        i++;
                    }
                }
                return new FileContentResult(compressedFileStream.ToArray(), "application/zip") { FileDownloadName = "MeusPDFs_" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".zip" };
            }
            #endregion

        }
        else
        {
            return RedirectToAction("Index", "Documento");
        }
    }
    catch (Exception ex)
    {
        ViewBag.MsgErro = string.Format("Download não efetuado! " + ex.Message.ToString());
        return RedirectToAction("Index", "Documento");
    }
}

I have not tested the above code, but the important part for you is to compress multiple PDFs into a single ZIP . This part below that does this:

using (var compressedFileStream = new MemoryStream())
{
    //Informações sobre o GetEncoding: https://msdn.microsoft.com/en-us/library/system.text.encodinginfo.getencoding(v=vs.110).aspx
    Encoding nomeArquivoEncoding = Encoding.GetEncoding(850);
    //Cria um arquivo ZIP e armazena na memória (memory stream) com enconding 850
    using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Update, false, nomeArquivoEncoding))
    {
        int i = 1; //Só uso essa variável para dar nome diferente pra todos PDFs
        foreach (var pdf in meusPDFs)
        {
            //Criar uma entrada para cada anexo a ser "Zipado"
            var zipEntry = zipArchive.CreateEntry("MeuPDF"+i);

            //Pegar o stream do anexo
            using (var originalFileStream = new MemoryStream(pdf))
            {
                using (var zipEntryStream = zipEntry.Open())
                {
                    //Copia o anexo na memória para a entrada ZIP criada
                    originalFileStream.CopyTo(zipEntryStream);
                }
            }
            i++;
        }
    }
    return new FileContentResult(compressedFileStream.ToArray(), "application/zip") { FileDownloadName = "MeusPDFs_" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".zip" };
}
    
31.05.2017 / 13:25