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