public string MontarPdfPesquisavel(List <Pagina> listaDePaginas, string nomeArquivoPdf, IList <PalavraReconhecida> palavrasReconhecidas) { Log.Application.DebugFormat("Iniciando montagem de PDF PESQUISÁVEL tipo PDF/A - 2com {0} paginas.", listaDePaginas.Count); //// resources para PDF/A string caminhoFonte = @"C:\Windows\Fonts\cour.ttf"; var iccfile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", "sRGB_CS_profile.icm"); if (!File.Exists(iccfile)) { throw new Exception(string.Format("Um dos Resources não foi localizado. Impossível gerar PDF/A. Arquivo não encontrado ICC file :{0}", iccfile)); } var fontPadrao = FontFactory.GetFont(caminhoFonte, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 8); var primeiraImagem = listaDePaginas[0].CaminhoCompletoDoArquivo; var document = new Document(this.DefinirOrientacao(primeiraImagem), 0, 0, 0, 0); ////var writer = PdfWriter.GetInstance(document, new FileStream(nomeArquivoPdf, FileMode.Create)); var writer = PdfAWriter.GetInstance(document, new FileStream(nomeArquivoPdf, FileMode.Create), PdfAConformanceLevel.PDF_A_2A); writer.CreateXmpMetadata(); writer.SetTagged(); document.Open(); document.AddLanguage("pt-br"); ICC_Profile icc = ICC_Profile.GetInstance(iccfile); writer.SetOutputIntents("Custom", string.Empty, "http://www.color.org", "sRGB IEC61966-2.1", icc); var contentByte = writer.DirectContent; var contador = 0; var contadorPaginasInseridas = 1; foreach (var pagina in listaDePaginas) { try { contador++; //// insere os textos var palavrasAtuais = palavrasReconhecidas.Where(x => x.Pagina.Id == pagina.Id); if (palavrasAtuais.Any()) { //// se poucas palavras, checar se é uma pagina em branco bool excluirPaginasBrancas = true; decimal minimoPalavrasPaginaBranca = 2; if (palavrasAtuais.Count() <= minimoPalavrasPaginaBranca && excluirPaginasBrancas) { Log.Application.DebugFormat("Possivel Página em branco encontrada (poucas palavras) {0}: ", pagina.CaminhoCompletoDoArquivo); if (this.ChecarPontosBrancos(pagina.CaminhoCompletoDoArquivo, 30, 150)) { Log.Application.DebugFormat("Analise de pixels detectou página em branco. Pagina {0} será desconsiderada no PDF: {1} ", contador, pagina.CaminhoCompletoDoArquivo); continue; } } //// transparencia PdfGState graphicState = new PdfGState(); graphicState.FillOpacity = 0.01f; contentByte.SetGState(graphicState); contentByte.BeginText(); ColumnText ct = new ColumnText(contentByte); foreach (var palavraReconhecida in palavrasAtuais) { var texto = new Phrase(new Chunk(palavraReconhecida.Texto, fontPadrao)); var pontoEsquerdo = this.ConversorGenerico(palavraReconhecida.Esquerda, pagina.WidthPixels, document.PageSize.Width); var pontoDireito = this.ConversorGenerico(palavraReconhecida.Direita, pagina.WidthPixels, document.PageSize.Width); var pontoBottom = document.PageSize.Height - this.ConversorGenerico(palavraReconhecida.Topo + palavraReconhecida.Altura, pagina.HeightPixels, document.PageSize.Height); var pontoTop = document.PageSize.Height - this.ConversorGenerico(palavraReconhecida.Topo, pagina.HeightPixels, document.PageSize.Height); ////var pontoEsquerdo = this.ConversorWidth(palavraReconhecida.Esquerda, pagina.WidthPixels); ////var pontoDireito = this.ConversorWidth(palavraReconhecida.Direita, pagina.WidthPixels); ////var pontoBottom = MasterHeight - this.ConversorHeight(palavraReconhecida.Topo + palavraReconhecida.Altura, pagina.HeightPixels); ////var pontoTop = MasterHeight - this.ConversorHeight(palavraReconhecida.Topo, pagina.HeightPixels); ct.SetSimpleColumn(texto, pontoEsquerdo, pontoBottom, pontoDireito + 100, pontoTop + 10, 10, Element.ALIGN_LEFT); ct.Go(); } contentByte.EndText(); } else { var excluirPaginasBrancas = true; if (excluirPaginasBrancas) { Log.Application.DebugFormat("Possivel Página em branco encontrada (nenhuma palavra reconhecida) {0}: ", pagina.CaminhoCompletoDoArquivo); if (this.ChecarPontosBrancos(pagina.CaminhoCompletoDoArquivo, 35, 150)) { Log.Application.DebugFormat("Analise de pixels detectou página em branco. Pagina {0} será desconsiderada no PDF: {1} ", contador, pagina.CaminhoCompletoDoArquivo); continue; } } } } catch (Exception exception) { Log.Application.Error(string.Format("Erro ao executar inserir texto no PDF, na imagem {0}: ", pagina.CaminhoCompletoDoArquivo), exception); nomeArquivoPdf = string.Empty; } //// insere a imagem try { iTextSharp.text.Image pic = iTextSharp.text.Image.GetInstance(pagina.CaminhoCompletoDoArquivo); if (pic.Height > pic.Width) { float percentage = 0.0f; percentage = document.PageSize.Height / pic.Height; pic.ScalePercent(percentage * 100); } else { float percentage = 0.0f; percentage = document.PageSize.Width / pic.Width; pic.ScalePercent(percentage * 100); } pic.SetAccessibleAttribute(PdfName.ALT, new PdfString(string.Format("Pagina-{0}", contadorPaginasInseridas))); document.Add(pic); contadorPaginasInseridas++; } catch (DocumentException exception) { Log.Application.Error(string.Format("Erro ao executar ItextSharp (Document Exception), na imagem {0}: ", pagina.CaminhoCompletoDoArquivo), exception); nomeArquivoPdf = string.Empty; } catch (IOException ioe) { Log.Application.Error(string.Format("Erro ao executar ItextSharp (IO), na imagem {0}: ", pagina.CaminhoCompletoDoArquivo), ioe); nomeArquivoPdf = string.Empty; } ////verifica se precisa rotacionar para paisagem na proxima pagina if (contador < listaDePaginas.Count) { var proximaImagem = listaDePaginas[contador]; document.SetPageSize(this.DefinirOrientacao(proximaImagem.CaminhoCompletoDoArquivo)); } document.NewPage(); } document.Close(); return(nomeArquivoPdf); }