none
Localizar uma substring num arquivo PDF??? RRS feed

  • Pergunta

  •  

    Pessoal, estou com o seguinte problema. Eu tenho um grande arquivo PDF e uso o iTextSharp para "quebrar" em vários arquivos menores contento uma página do arquivo maior. só que ao gerar esses arquivos menores, eu preciso vasculhar uma informação(matricula do funcionário) dentro de cada página do arquivo maior. Preciso da matricula do funcionario para nomear cada arquivo menor gerado. O código abaixo é para abrir um PDF e "quebrar" em arquivos diversos, um para cada página.

     

    Code Snippet

    PdfReader reader = new PdfReader(PathServerArq);

                        int n = reader.NumberOfPages;

                        // we retrieve the size of the first page
                        iTextSharp.text.Rectangle psize = reader.GetPageSize(1);
                        float width = psize.Width;
                        float height = psize.Height;

                        int i = 0;
                        while (i < n)
                        {
     
                            Document document = new Document(psize, 50, 50, 50, 50);
                            i++;

     

    // É exatamente nesse ponto q preciso da matricula

     

                            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(PathTemp + @"\" + NomeArq[NomeArq.GetUpperBound(0)] + "_" + i + ".pdf", FileMode.Create));


                            document.Open();
                                                                                                                          
                            PdfContentByte cb = writer.DirectContent;
                           
                            PdfImportedPage page1 = writer.GetImportedPage(reader, i);
                            cb.AddTemplate(page1, -0f, -0f);

                            BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);

                            document.Close();
                        }

     

     

    Ou seja eu preciso identificar a posição de um carecter especial, usando algo parecido com "InStr" do vb e a partir desse posição pegar uma substring. Exemplo no pdf vai estar assim Matricula#98745 e eu preciso recuperar o  98745.

     

    Alguém já fez algo parecido, com iTextSharp ou qqer outro meio?

     

    Abraços.

     

     

    segunda-feira, 4 de agosto de 2008 18:04

Respostas

  • Pessoal, fica registrado a solução que encontrei.

    Um componente free que transforma um arquivo pdf em uma string, feito isso eu consigo usar os métodos da classe String para tratar as informações que eu necessito. Pesquisei dois dias e realmente só encontrei essa solução.

     

    Segue o link do componente: PDFBox   http://www.pdfbox.org/

     

    Referencie na pasta bin essas dlls.

     

    IKVM.GNU.Classpath.dll

    IKVM.Runtime.dll

    PDFBox-0.7.3.dll

     

    Code Snippet

    using org.pdfbox.pdmodel;
    using org.pdfbox.util;

     

    //Exemplo de utilização

     

    //Transforma o PDF numa string

    PDDocument doc = PDDocument.load(pNomeArq);
    PDFTextStripper stripper = new PDFTextStripper();
    strText = stripper.getText(doc);

     

     

     

     

    Um abraço a todos.

     

    quarta-feira, 6 de agosto de 2008 11:32

Todas as Respostas

  • Daniel,

    Boa tarde.

     

    No VB6 existe a função chamada "Instr", onde você informa como parametro o texto que deseja localizar, e onde começar e etc...

     

     

    Na classe string do .NET temos o método "Contains", onde você informa o texto que deseja localizar em seu arquivo.

     

    string texto;

    texto.Contains("Matricula#98745");

     

     

    ******

     

    Existe também o método "Substring", uqe igual a função "Mid", onde você informa onde iniciar e onde terminar a leitura de sua string.

     

    string texto;

    texto.Substring(0,10);

    *******

     

    Acredito que as informações do arquivo PDF maior, você deve salavar em uma string, e depois quebar a string utilizando o método "Split" que realiza a quebra por um texto pré-definido, para que você possa gerar um array de string a partir de cada matrícula diferente.

     

    using (StreamReader sr = new StreamReader(caminhoArquivo + nomeArquivo))

    {

    conteudo = sr.ReadToEnd();

    string[] SepararLinhas = new System.Text.RegularExpressions.Regex("Matricula").Split(conteudo);

     

    GerarPdfMenor(); //chame um método que ira gerar o arquivo Pdf.

     

    }

     

    Finalmente você poderá gerar seu arquivo PDF menor, referente a cada matrícula.

     

     

     

    Se  esse post for útil, marque.

    Paulo Galego.

     

     

     

     

     

     

     

     

     

    segunda-feira, 4 de agosto de 2008 20:21
  • Os métodos que vc citou eu conheço, mas realmente eu não estava com a idéia de passar o arquivo para uma grande string, acho que essa foi a luz no fim do tunel que eu tava procurando, vou testar e deixa a resposta depois.

     

    Abraços.

    terça-feira, 5 de agosto de 2008 11:15
  • Pessoal, fica registrado a solução que encontrei.

    Um componente free que transforma um arquivo pdf em uma string, feito isso eu consigo usar os métodos da classe String para tratar as informações que eu necessito. Pesquisei dois dias e realmente só encontrei essa solução.

     

    Segue o link do componente: PDFBox   http://www.pdfbox.org/

     

    Referencie na pasta bin essas dlls.

     

    IKVM.GNU.Classpath.dll

    IKVM.Runtime.dll

    PDFBox-0.7.3.dll

     

    Code Snippet

    using org.pdfbox.pdmodel;
    using org.pdfbox.util;

     

    //Exemplo de utilização

     

    //Transforma o PDF numa string

    PDDocument doc = PDDocument.load(pNomeArq);
    PDFTextStripper stripper = new PDFTextStripper();
    strText = stripper.getText(doc);

     

     

     

     

    Um abraço a todos.

     

    quarta-feira, 6 de agosto de 2008 11:32
  • amigo na linha strText = stripper.getText(doc);

    o que é este strText???

     

    valeu


    Lucas Demetrius
    quarta-feira, 1 de junho de 2011 16:13