public string GereRelatorio(OrdenacaoRelatorioGeralPatente ordenacaoRelatorio)
 {
     var nomeDoArquivoDeSaida = GereInformacoesUteisParaOArquivoDeSaidaDoRelatorio();
     _documento.Open();
     MonteDocumentoDoRelatorio(ordenacaoRelatorio);
     _documento.Close();
     return nomeDoArquivoDeSaida;
 }
        private void MonteDocumentoDoRelatorio(OrdenacaoRelatorioGeralPatente ordenacaoRelatorio)
        {
            var corBackgroudHeader = Color.GRAY;
            var tabela = new PdfPTable(1);

            tabela.WidthPercentage = 100;
            tabela.DefaultCell.Border = Rectangle.NO_BORDER;

            _processosDePatentes = ordenacaoRelatorio.Equals(OrdenacaoRelatorioGeralPatente.Cliente) ?
                                   _processosDePatentes.OrderBy(processo => processo.Patente.Clientes[0].Pessoa.Nome).ToList() :
                                   _processosDePatentes.OrderBy(processo => processo.Processo).ToList();

            if (ordenacaoRelatorio.Equals(OrdenacaoRelatorioGeralPatente.Cliente))
            {
                var dicionarioDeClientesEPatentes = new Dictionary<long, List<IProcessoDePatente>>();

                foreach (IProcessoDePatente processo in _processosDePatentes)
                {
                    var cliente = processo.Patente.Clientes[0];

                    if(cliente.Pessoa != null && cliente.Pessoa.ID.HasValue && !dicionarioDeClientesEPatentes.ContainsKey(cliente.Pessoa.ID.Value))
                        dicionarioDeClientesEPatentes.Add(cliente.Pessoa.ID.Value, new List<IProcessoDePatente>());

                    if(cliente.Pessoa != null && cliente.Pessoa.ID.HasValue)
                        dicionarioDeClientesEPatentes[cliente.Pessoa.ID.Value].Add(processo);

                }

                tabela.AddCell(ObtenhaTabelaTituloColuna());

                foreach (long chave in dicionarioDeClientesEPatentes.Keys)
                {
                    string nomeDoCliente = dicionarioDeClientesEPatentes[chave][0].Patente.Clientes[0].Pessoa.Nome;

                    foreach (IProcessoDePatente processoDePatente in dicionarioDeClientesEPatentes[chave])
                        tabela.AddCell(ObtenhaTabelaDadosDoCliente(processoDePatente, nomeDoCliente));
                }
            }
            else
            {
                tabela.AddCell(ObtenhaTabelaTituloPatente());
                foreach (IProcessoDePatente processo in _processosDePatentes)
                    tabela.AddCell(ObtenhaTabelaDadosDaPatente(processo));
            }

            _documento.Add(tabela);
        }