public List <ItemParaSeparacao> Executar(IList <ItemParaSeparacao> itensParaSeparacao)
        {
            var paralelismo = Paralelizar.Em(2);

#if DEBUG
            paralelismo = Paralelizar.Em(1);
#endif
            Parallel.For(0, itensParaSeparacao.Count, paralelismo, i =>
            {
                var pagina = itensParaSeparacao[i].Pagina;

                try
                {
                    itensParaSeparacao[i].CarregarBitmap();
                }
                catch (ImagemInvalidaException exception)
                {
                    this.gravaLogDaPaginaServico.ExecutarNovaThread(
                        LogPagina.AcaoPaginaErroSeparador,
                        pagina.Id,
                        pagina.Documento.Id,
                        "Imagem corrompida ou outro problema");

                    throw new ImagemInvalidaException("Imagem corrompida ou outro problema");
                }

                Log.Application.DebugFormat("Processando arquivo #{0}", pagina.Id);

                if (pagina.Id == 137830)
                {
                    var asdf = 1;
                }

                try
                {
                    if (Contexto.SeparadorPorCarimbo)
                    {
                        ////var carimbo = new CarimboSeparador();
                        ////var tempoParaAnalisarCarimbo = MedirTempo.De(() => carimbo = this.localizadorCarimboService.ExecutarPorBitmaps(itensParaSeparacao[i]));
                        ////Log.Application.DebugFormat("Medição TEMPO analise de carimbo  ---- : {0}", tempoParaAnalisarCarimbo.TotalMilliseconds);

                        var carimbo = this.localizadorCarimboService.ExecutarPorBitmaps(itensParaSeparacao[i]);

                        if (carimbo.Localizado)
                        {
                            pagina.Separadora         = true;
                            pagina.AnaliseConteudoOcr = PaginaTipoOcr.TipoSeparadorCarimbo;
                            Log.Application.DebugFormat("Carimbo localizado na pagina #{0}", pagina.Id);
                        }
                    }

                    var imagemEmBranco = false;

                    var tempoParaVerificarBranco = MedirTempo.De(() => imagemEmBranco = this.manipulaImagemServico
                                                                                        .ImagemEmBranco(itensParaSeparacao[i], Contexto.MinWidthPixel, Contexto.MinHeightPixel, Contexto.MinMargemPixel));

                    Log.Application.DebugFormat("Tempo avaliação imagem branca/carimbo separador: {0}ms", tempoParaVerificarBranco.TotalMilliseconds);
                    if (imagemEmBranco)
                    {
                        pagina.EmBranco           = true;
                        pagina.AnaliseConteudoOcr = PaginaTipoOcr.TipoBranco;
                    }
                    else
                    {
                        this.identificarPaginaSeparadora.Executar(itensParaSeparacao, itensParaSeparacao[i]);
                    }
                }
                catch (Exception exception)
                {
                    Log.Application.Error(exception);
                    throw;
                }

                ////dispose final do bitmap
                itensParaSeparacao[i].DescarregarBitmap();
            });

            return(itensParaSeparacao as List <ItemParaSeparacao>);
        }
예제 #2
0
        public List <ItemParaSeparacao> Executar(int processoId)
        {
            var paginas    = this.paginaRepositorio.ObterPorProcesso(processoId);
            var documentos = this.documentoRepositorio.ObterTodosPorProcesso(new Processo {
                Id = processoId
            });

            if (documentos.Any() == false)
            {
                throw new RegraDeNegocioException("Separacao do processo #" + processoId + ". ");
            }

            var cpf      = documentos.First().Cpf;
            var lote     = documentos.First().Lote;
            var processo = documentos.First().Processo;

            var documento = documentos.FirstOrDefault(x =>
                                                      x.TipoDocumento.Id == TipoDocumento.CodigoDocumentoGeral &&
                                                      x.Status != DocumentoStatus.Excluido);

            var versaoAtual = documento == null ? "0" : documento.Versao;

            var ordem = 2;

            var paginasJpeg = paginas
                              .Where(x => x.TipoArquivo != "PDF")
                              .OrderBy(x => x.Ordem)
                              .ToList();

            List <ItemParaSeparacao> arquivosParaProcessar = null;

            var tempoParaBaixarELimparImagens = MedirTempo.De(() =>
                                                              arquivosParaProcessar = this.ObterArquivosParaProcessar(paginasJpeg));

            Log.Application.DebugFormat("Tempo para baixar {0}s", tempoParaBaixarELimparImagens.TotalSeconds);

            var itensComBrancosIdentificados = this.identificarPaginasEmBrancoESeparadoras.Executar(arquivosParaProcessar);

            var paginasDivididasPorSeparadora = this.dividirPaginasPorPaginaSeparadora.Executar(itensComBrancosIdentificados);

            if (Contexto.CorrigirOrientacao)
            {
                Log.Application.DebugFormat("Inicio da avaliação de Orientação para processo #{0}.", processoId);
                this.corrigeOrientacaoServico.Executar(paginasDivididasPorSeparadora, this.ObterPastaLocalCache(arquivosParaProcessar));
            }

            if (Contexto.UsarThumbnail)
            {
                Log.Application.DebugFormat("Inicio da geração de 100% thumbnails para processo #{0}.", processoId);
                try
                {
                    var cacheLocalImagens = this.ObterPastaLocalCache(arquivosParaProcessar);
                    this.gerarThumbnailServico.Executar(paginasDivididasPorSeparadora, cacheLocalImagens);
                }
                catch (Exception exception)
                {
                    Log.Application.Error("Erro ao gerar os thumbnails no lote:" + lote.Id, exception);
                }
            }

            if (Contexto.IdentificarTipoPorOcr)
            {
                Log.Application.DebugFormat("Inicio da identificacao de tipos pelo OCR no processo #{0}.", processoId);
                this.identificaTipoDocumentoServico.Executar(paginasDivididasPorSeparadora, this.ObterPastaLocalCache(arquivosParaProcessar));
            }

            Log.Application.DebugFormat("Finalizando criação das entidades no banco de dados no processo #{0}.", processoId);
            foreach (var grupo in paginasDivididasPorSeparadora)
            {
                this.CriarNovoDocumentoInserindoPaginas(grupo, cpf, lote, processo, versaoAtual, ordem);
                ordem++;
            }

            this.MarcarComoExcluidosDocumentosGeradosNaDigitalizacao(documentos);

            return(itensComBrancosIdentificados);
        }