Re:ler arquivos pdf e doc

O que você quer realmente fazer? Você quer ler estes arquivos e transformá-los num formato texto?

Se sim, dê uma olhada no trecho abaixo (antes, você tem que baixar a API do PDFBox: www.pdfbox.org):

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.util.Date;

import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDDocumentInformation;
import org.pdfbox.util.PDFTextStripper;

public class PdfParser
{

/***

  • Extract the content from the given PDF file. As a side effect most other fields are set too.

  • @see org.zilverline.extractors.AbstractExtractor#getContent(java.io.File)
    */
    private String enderecoRecurso;

    public void setEnderecoRecurso(String enderecoRecurso)
    {
    this.enderecoRecurso = enderecoRecurso; //caminho do arquivo
    }

    public String getConteudo()
    {

     File f = new File(this.enderecoRecurso);         
     FileInputStream is = null;
     try
     {
        is = new FileInputStream(f);             
     }
     catch(IOException e)
     {
        System.out.println("ERRO: " + e.getMessage());
        return null;
     }         
    
     PDDocument pdfDocument = null;
     try 
     {             
        //System.out.println("#1");
        PDFParser parser = new PDFParser(is);
        //System.out.println("#2");
        parser.parse();
        //System.out.println("#3");
        pdfDocument = parser.getPDDocument();
        //System.out.println("#4");
        PDFTextStripper stripper = new PDFTextStripper();
        //System.out.println("#5");
        return stripper.getText(pdfDocument);        
        //System.out.println("#6");
     }
     catch (IOException e) 
     {             
        return "ERRO: Can't open stream" + e;
     }
     catch (Throwable e) 
     {
        // catch this, since we need to close the resources
        return "ERRO: An error occurred while getting contents from PDF" + e;
     }
     finally 
     {
        if (pdfDocument != null) 
        {
           try 
           {
              pdfDocument.close();
           }
           catch (IOException e) 
           {                
              return "ERRO: Can't close pdf." + e;
           }
        }
     }        
    

    }
    }

Dá uma olhada no código abaixo:


//baixe este pacote em http://jakarta.apache.org/poi/hwpf/index.html

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;

File f = new File(caminhoArquivo);
FileInputStream is = new FileInputStream(f);

HWPFDocument wdoc = new HWPFDocument(is);
WordExtractor extractor = new WordExtractor(wdoc);
String conteudo = extractor.getText();
conteudo = conteudo.replace("\n", " ");
System.out.println("Conteudo do arquivo: " + conteudo)

Acredito que possa também querer extrair dados de um arquivo .RTF:

import javax.swing.text.BadLocationException;
import javax.swing.text.rtf.RTFEditorKit;
import javax.swing.text.DefaultStyledDocument;

import java.io.InputStream;
import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;

public class RtfParser
{
public String enderecoRecurso;

public void setEnderecoRecurso(String enderecoRecurso)
{
    this.enderecoRecurso = enderecoRecurso; //caminho do arquivo
}
    
public String getConteudo()
{
    File f = new File(this.enderecoRecurso);         
    FileInputStream is = null;
    
    try
    {
       is = new FileInputStream(f);             
    }
    catch(IOException e)
    {
       System.out.println("ERRO: " + e.getMessage());
       return null;
    }         
    
    String bodyText = null;

     DefaultStyledDocument styledDoc = new DefaultStyledDocument();
     try {
       new RTFEditorKit().read(is, styledDoc, 0);
       bodyText = styledDoc.getText(0, styledDoc.getLength());
     }
     catch (IOException e) 
     {
        return "ERRO: Cannot extract text from a RTF document. Exception: " + e;
     }
     catch (BadLocationException e) 
     {
         return "ERRO: Cannot extract text from a RTF document. Exception: " + e;
     }
     return bodyText;
}

}

Caso queira extrair mais dados de formatos diferentes, veja:
http://wiki.apache.org/jakarta-lucene/LuceneFAQ.

Espero que possa ajudá-lo.

Quanto ao que você perguntou se esta é a melhor alternativa para indexar termos no Lucene, é exatamente isto que estou fazendo: transformando arquivos com formatos diferentes de TXT para TXT. Além de arquivos, eu também estou indexando URLs. O processo é o mesmo: leio a URL, efetuo um parse e passo ela numa string para o Lucene efetuar a indexação.

Abraço.

[quote=Fábio Procópio]O que você quer realmente fazer? Você quer ler estes arquivos e transformá-los num formato texto?

Se sim, dê uma olhada no trecho abaixo (antes, você tem que baixar a API do PDFBox: www.pdfbox.org):

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.util.Date;

import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDDocumentInformation;
import org.pdfbox.util.PDFTextStripper;

public class PdfParser
{

/***

  • Extract the content from the given PDF file. As a side effect most other fields are set too.

  • @see org.zilverline.extractors.AbstractExtractor#getContent(java.io.File)
    */
    private String enderecoRecurso;

    public void setEnderecoRecurso(String enderecoRecurso)
    {
    this.enderecoRecurso = enderecoRecurso; //caminho do arquivo
    }

    public String getConteudo()
    {

     File f = new File(this.enderecoRecurso);         
     FileInputStream is = null; // por que null?
     try
     {
        is = new FileInputStream(f);  //OPS não entendi?:S          
     }
     catch(IOException e)
     {
        System.out.println("ERRO: " + e.getMessage());
        return null;
     }         
    
     PDDocument pdfDocument = null;
     try 
     {             
        //System.out.println("#1");
        PDFParser parser = new PDFParser(is);//Como funciona esses Parser?
        //System.out.println("#2");//Para que serviria esses S.out?
        parser.parse();
        //System.out.println("#3");
        pdfDocument = parser.getPDDocument();//O que seria isso?
        //System.out.println("#4");
        PDFTextStripper stripper = new PDFTextStripper();//e isso?
        //System.out.println("#5");
        return stripper.getText(pdfDocument); //isso?       
        //System.out.println("#6");
     }
     catch (IOException e) 
     {             
        return "ERRO: Can't open stream" + e;
     }
     catch (Throwable e) 
     {
        // catch this, since we need to close the resources
        return "ERRO: An error occurred while getting contents from PDF" + e;
     }
     finally 
     {
        if (pdfDocument != null) 
        {
           try 
           {
              pdfDocument.close();
           }
           catch (IOException e) 
           {                
              return "ERRO: Can't close pdf." + e;
           }
        }
     }        
    

    }
    }[/quote]

Oi pessoal…eu coloquei alguns comentários no code…espero que possam me ajudar explicando eles!:smiley:
esse código que foi colocado por último…para que ele serve? para fazer ordenação?

A classe RtfParser faz o parser de um arquivo RTF para o formato texto. No entanto, o trecho de código:

HWPFDocument wdoc = new HWPFDocument(is);
WordExtractor extractor = new WordExtractor(wdoc);
String conteudo = extractor.getText();
conteudo = conteudo.replace("\n", " ");
System.out.println("Conteudo do arquivo: " + conteudo)

faz o parser de um arquivo DOC para o formato texto.

Se não tiver compreendido, “grite” daí!

Abraço.

Rapaz,

Eu acho que alguns arquivos têm alguma permissão para extração dos dados. Tente pegar um outro arquivo PDF. Aconteceu isso também comigo. Peguei um arquivo que fiz em PDF e pedi para qque a classe extraísse o texto para mim. Funcionou.

[quote=Fábio Procópio]A classe RtfParser faz o parser de um arquivo RTF para o formato texto. No entanto, o trecho de código:

HWPFDocument wdoc = new HWPFDocument(is);
WordExtractor extractor = new WordExtractor(wdoc);
String conteudo = extractor.getText();
conteudo = conteudo.replace("\n", " ");
System.out.println("Conteudo do arquivo: " + conteudo)

faz o parser de um arquivo DOC para o formato texto.

Se não tiver compreendido, “grite” daí!

Abraço.[/quote]

Oi…acho que consegui entender sim!
mas eu não to conseguindo baixar a API do word…naquele site que você mandou…tem diversos links estranhos mas nenhuma página com a API…
aguardo…

Akumaldo,

Baixe o arquivo poi-bin-3.0-alpha2-20060616.tar.gz a partir do endereço: http://ftp.pucpr.br/apache/jakarta/poi/dev/bin/

[quote=Fábio Procópio]Akumaldo,

Baixe o arquivo poi-bin-3.0-alpha2-20060616.tar.gz a partir do endereço: http://ftp.pucpr.br/apache/jakarta/poiObriga/dev/bin/[/quote]

Aeeeeee agora sim!:smiley: tudo certinho!
obrigadão!muito legais essas APIs…úteis!:smiley: mesmo para NooBs como eu!:wink:

alguem teria um programa simples de exemplo usando o PDFbox pra ler um pdf??
vlw

Olá pessoal, estou usando essa classe RtfParser para parsear documentos na busca indexada q estou desenvolvendo, mas notei q o parser não retorna palavras que estão dentro de tabelas… :?
Será q alguém pode dar um help?
Muito obrigada! :slight_smile:

Bom, descobri a causa do problema…mas nao a solução.
Quando as tavelas sao convertidas pra txt, não há quebra de linha…assim a ultima palavra de uma linha emenda com a primeira da próxima linha…
vou continuar pesquisando…espero q isso ajude alguem
ate mais pessoal! :smiley:

Pessoal, fiz o seguinte código:

[code]import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.util.Date;

import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDDocumentInformation;
import org.pdfbox.util.PDFTextStripper;

public class PdfParser
{
/***

  • Extract the content from the given PDF file. As a side effect most other fields are set too.
  • @see org.zilverline.extractors.AbstractExtractor#getContent(java.io.File)
    */
    private String enderecoRecurso;

/*public void setEnderecoRecurso(String enderecoRecurso)
{

this.enderecoRecurso = enderecoRecurso; //caminho do arquivo
}*/

public String getConteudo(String enderecoRecurso)
{
this.enderecoRecurso = enderecoRecurso;
File f = new File(this.enderecoRecurso);
FileInputStream is = null;
try
{
is = new FileInputStream(f);
}
catch(IOException e)
{
System.out.println("ERRO: " + e.getMessage());
return null;
}

PDDocument pdfDocument = null;
try
{
//System.out.println("#1");
PDFParser parser = new PDFParser(is);
//System.out.println("#2");
parser.parse();
//System.out.println("#3");
pdfDocument = parser.getPDDocument();
//System.out.println("#4");
PDFTextStripper stripper = new PDFTextStripper();
//System.out.println("#5");
return stripper.getText(pdfDocument);
//System.out.println("#6");
}
catch (IOException e)
{
return “ERRO: Can’t open stream” + e;
}
catch (Throwable e)
{
// catch this, since we need to close the resources
return “ERRO: An error occurred while getting contents from PDF” + e;
}
finally
{
if (pdfDocument != null)
{
try
{
pdfDocument.close();
}
catch (IOException e)
{
return “ERRO: Can’t close pdf.” + e;
}
}
}
}

}[/code]

compilou sem problemas e tranformei-o em um web Service, mas quando o chamo via url assim:
http://localhost:8080/axis/PdfParser.jws?method=getConteudo&enderecoRecurso=c:\b.pdf
ele dá o seguinte erro:
ERRO: An error occurred while getting contents from PDFjava.lang.NoClassDefFoundError: org/fontbox/afm/AFMParser

Alguém pode dar um luz?
Abraço!

Consegui resolver! Era o arquivo fontbox…jar que não estava incluso na lib do tomcat

para ler o arquivo .doc usa o import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor; e para ler os outros formatos do office como .xls, .ppt e os outros oq se usa,?
Grato.

Galera, estou reativando este tópico pois não consigo fazer essa %@#&%# do POI funcionar da forma que preciso…

Tenho um arquivo do Word e preciso substituir o conteudo dele, por exemplo, dar um replace em @contrato para ficar o numero do contrato, por exemplo 01/2010…
Aí preciso salvar esse arquivo modificado com outro nome…

Alguém fez isso, ou sabe como fazer ?

Valeu !

Escrevi recentemente um post de Manipulação de Arquivos PDF.
Vocês podem conferir em: http://www.flaviojmendes.com/blog/2012/02/27/lendo-e-escrevendo-arquivos-pdf-com-java/

Abraços! :slight_smile:

Boa noite,

Testei com um pdf criado pelo word, funcionou! :smiley:

porém estou precisando ler um informe de rendimento, é composto por imagens, tabelas e texto…

como poderei fazer isso? sabendo-se que dá erro quando tento retornar a uma String.

Boa noite,

Consegui resolver com a API iText… :smiley:

Caso alguém esteja passando pelo mesmo problema, seja o código abaixo:

[code]import java.io.IOException;

import com.itextpdf.text.pdf.PdfReader;

import com.itextpdf.text.pdf.parser.PdfTextExtractor;
import javax.swing.JOptionPane;

public class PDFReader {

public static void main(String[] args) {

    try {

        //Carregando o PDF
        String caminho = JOptionPane.showInputDialog("caminho");
        caminho = caminho.replaceAll("\\\\", "/");
        PdfReader pdfReader = new PdfReader(caminho);



        String s = "";

        //Extraindo de página em página e jogando numa String

        for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) {

            s = s.concat(PdfTextExtractor.getTextFromPage(pdfReader, i) + "\n\n");

        }

        if(s.contains(JOptionPane.showInputDialog("PESQUISA"))){
            System.out.println("achou");
        }else{
            System.out.println("não achou");
        }
        

    } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }



}

}
[/code]

fonte: http://wehavescience.wordpress.com/2012/11/04/manipulando-pdfs-com-java-e-itext/

Alguém alguma ferramenta e exemplos que leia arquivos pdf e .doc?

T+

Valeu Fábio! É isso mesmo oh! Funcionou blz para o PDF.
Vou ver agora como fazer a integração dele com o lucene para fazer buscas de palavras no arquivo (não sei se essa é a melhor opção, se tiver alguma idéia, por favor diga!)

Agora só falta ler arquivos .doc. Se alguém souber…

T+