예제 #1
0
        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);
        }