Integração .NET x PDF: efetuando o merge de arquivos através da biblioteca iTextSharp

NetCoders
netcoders
Published in
6 min readMay 25, 2014
logo-pdf

A construção de relatórios representa um tipo de demanda extremamente comum dentro do desenvolvimento de soluções voltadas ao ambiente corporativo. Tais funcionalidades costumam ser implementadas fazendo uso de ferramentas como Crystal Reports e Reporting Services (esta última parte integrante do SQL Server), não sendo raros os casos em que se fará necessária a exportação do conteúdo destes relatórios em formatos como o PDF. É comum ainda que usuários destas aplicações corporativas se vejam às voltas com documentos como notas fiscais, recibos e boletos também representados sob a forma de arquivos PDF.

Em qualquer um destes casos poderá surgir em algum momento a necessidade de agrupar alguns destes arquivos em um único documento, combinando os formulários e relatórios pré-existentes em um novo arquivo (processo este conhecido como “merge”). No caso específico da plataforma .NET, este procedimento pode ser implementado a partir do uso de recursos disponibilizados pela biblioteca iTextSharp.

Surgida a partir da conversão para .NET do projeto iText (o qual foi concebido inicialmente para suportar o padrão PDF no mundo Java), o iTextSharp conta com mecanismos que possibilitam a geração, manipulação de conteúdo, merge ou até mesmo a separação de partes de um arquivo PDF em um novo documento. Maiores informações a respeito desta biblioteca podem ser obtidas a partir da página do projeto iTextSharp no portal SourceForge:

O objetivo deste post é demonstrar como o iTextSharp pode ser utilizado em aplicações .NET que precisem efetuar o merge de documentos PDF. Empregando a versão 5.5.1 do iTextSharp, será implementado um exemplo prático de uso desta biblioteca conforme detalhado na próxima seção.

Criando a aplicação de exemplo

O exemplo apresentado neste artigo foi criada no .NET framework 4.5.1, através da utilização do Microsoft Visual Studio Professional 2013. A biblioteca iTextSharp pode ser adicionada a um projeto .NET através do utilitário NuGet, conforme indicado na Imagem 1.

Imagem01

Imagem 1: Adicionando a biblioteca iTextSharp a um projeto no Visual Studio 2013

A funcionalidade de merge será implementada através da classe estática PDFHelper, cuja estrutura é apresentada na Listagem 1.

O método Merge receberá como parâmetros um array com o caminho dos arquivos a serem combinados (já respeitando inclusive a ordem de agrupamento), bem como o nome completo (arquivo + diretório) do novo documento a ser gerado. Esta operação foi codificada da seguinte forma:

  • Uma nova instância da classe FileStream (namespace System.IO) é criada, de forma a se proceder com a geração do arquivo PDF em que serão agrupados os outros documentos deste tipo;
  • Será também criado um novo objeto do tipo Document (namespace iTextSharp.text), o qual servirá de base para a montagem do documento PDF a ser produzido como resultado da execução do método Merge;
  • As instâncias das classes FileStream e Document serão então utilizadas para a geração de um novo objeto do tipo PdfCopy (namespace iTextSharp.text.pdf);
  • Dentro de um loop foreach será acessado o método AddDocument da instância do tipo PdfCopy, fornecendo-se como parâmetro a esta operação uma instância da classe PdfReader (namespace iTextSharp.text.pdf). Este procedimento permitirá adicionar o conteúdo dos diferentes arquivos de origem ao novo documento PDF a ser produzido como resultado da execução do método Merge;
  • Por fim, é acionado o método Close a partir da instância do tipo Document. Esta ação tem como objetivo liberar recursos empregados no processo de merge de diferentes arquivos PDF.

[code language=”csharp”]
using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace TesteMergePDFs
{
public static class PDFHelper
{
public static void Merge(
string[] caminhosArquivosOrigem,
string caminhoNovoArquivoPDF)
{
using (FileStream stream =
new FileStream(caminhoNovoArquivoPDF, FileMode.Create))
{
Document documento = new Document();
PdfCopy pdfCopy = new PdfCopy(documento, stream);
documento.Open();

foreach (string arquivoOrigem in caminhosArquivosOrigem)
{
pdfCopy.AddDocument(new PdfReader(arquivoOrigem));
}

if (documento != null)
documento.Close();
}
}
}
}
[/code]

Listagem 1: Classe PDFHelper

A classe PDFHelper poderá ser utilizada em qualquer aplicação em que se fizer necessária a implementação de rotinas envolvendo o merge de documentos PDF. Logo, o acesso ao método Merge será possível em projetos dos mais diversos tipos, como aqueles baseados em tecnologias como ASP.NET MVC, Web Forms ou Windows Forms, por exemplo.

Na Imagem 2 está um exemplo de formulário criado em Windows Forms, por meio do qual será demonstrado o uso do tipo PDFHelper.

Imagem02

Imagem 2: Formulário utilizado para demonstrar o processo de merge de arquivos PDF

A ideia não será se aprofundar no modo como o formulário FormMerge foi construído, já que o mesmo conta com uma estrutura bastante simples. Na Listagem 2 está o código que implementa as funcionalidades presentes nesta tela.

Conforme é possível observar, o método Merge da classe PDFHelper está sendo invocado no código que define o evento btnEfetuarMerge_Click. Esta operação está recebendo como parâmetros um array com os arquivos listados no controle ListBox da tela de testes, além do nome do novo arquivo PDF a ser gerado como resultado do agrupamento dos documentos originais.

[code language=”csharp” highlight=”36,37,38"]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TesteMergePDFs
{
public partial class FormMerge : Form
{
public FormMerge()
{
InitializeComponent();
}

private void btnSelecionarArquivos_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
lstArquivosOrigem.Items.AddRange(openFileDialog.FileNames);
}

private void btnLimparSelecao_Click(object sender, EventArgs e)
{
lstArquivosOrigem.Items.Clear();
}

private void btnEfetuarMerge_Click(object sender, EventArgs e)
{
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string arquivoPDFDestino = saveFileDialog.FileName;
PDFHelper.Merge(
lstArquivosOrigem.Items.Cast<string>().ToArray(),
arquivoPDFDestino);
MessageBox.Show(String.Format(
“Arquivo {0} gerado com sucesso!”, arquivoPDFDestino));
}
}
}
}
[/code]

Listagem 2: Classe FormMerge

Supondo que haja a necessidade de mesclar dois arquivos PDFs como aqueles que constam na Imagem 3 (o primeiro com 4 páginas, ao passo que o segundo possui 5 páginas), será necessário então executar a aplicação de exemplo como indicado na Imagem 4.

Imagem03

Imagem 3: Arquivos a serem agrupados via merge

Imagem04

Imagem 4: Executando a aplicação de testes

O resultado deste teste será um documento PDF com 9 páginas, como é possível notar na Imagem 5.

Imagem05

Imagem 5: Arquivo gerado após o processo de merge

Conclusão

Procurei apresentar neste artigo como o iTextSharp pode ser útil na implementação de rotinas envolvendo o merge de documentos PDF, a partir da combinação de arquivos pré-existentes. Conforme comentado ao longo do post, a biblioteca iTextSharp não se resume apenas a isto, dispondo ainda de funcionalidades que possibilitam a construção de mecanismos sofisticados para a manipulação de documentos no formato PDF.

Espero que o conteúdo aqui apresentado possa ser útil no seu dia-a-dia. Até uma próxima oportunidade!

--

--