Erro ao ler arquivo .pdf

6 respostas
D

galera, vocês saberiam me dizer qual o problema do meu código? ele está retornando esse erro:

05/05/2011 14:51:53 org.apache.pdfbox.util.PDFStreamEngine processEncodedText
AVISO: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float
at org.apache.pdfbox.pdmodel.font.PDFont.getFontWidth(PDFont.java:786)
at org.apache.pdfbox.pdmodel.font.PDSimpleFont.getFontWidth(PDSimpleFont.java:191)
at org.apache.pdfbox.util.PDFStreamEngine.processEncodedText(PDFStreamEngine.java:357)
at org.apache.pdfbox.util.operator.ShowText.process(ShowText.java:45)
at org.apache.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngine.java:551)
at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:274)
at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:251)
at org.apache.pdfbox.util.PDFStreamEngine.processStream(PDFStreamEngine.java:225)
at org.apache.pdfbox.util.PDFTextStripper.processPage(PDFTextStripper.java:442)
at org.apache.pdfbox.util.PDFTextStripper.processPages(PDFTextStripper.java:366)
at org.apache.pdfbox.util.PDFTextStripper.writeText(PDFTextStripper.java:322)
at org.apache.pdfbox.util.PDFTextStripper.getText(PDFTextStripper.java:242)
at verificacaosimp.lerPDF.getConteudo(lerPDF.java:34)
at verificacaosimp.Main.main(Main.java:20)

Código:

import java.io.IOException;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

public class lerPDF {

    private String endereco;

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

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

        PDDocument pdfDocument = null;
        try {
            PDFParser parser = new PDFParser(arquivo);
            parser.parse();
            pdfDocument = parser.getPDDocument();
            PDFTextStripper stripper = new PDFTextStripper();
            return stripper.getText(pdfDocument);
        } catch (IOException e) {
            return "ERRO: Não pode abrir o fluxo" + e;
        } catch (Throwable e) {
            return "ERRO: Ocorreu um erro ao obter o conteúdo do PDF" + e;
        } finally {
            if (pdfDocument != null) {
                try {
                    pdfDocument.close();
                } catch (IOException e) {
                    return "ERRO: Não pode fechar pdf" + e;
                }
            }
        }
    }
}
main
package verificacaosimp;

import java.io.IOException;
import jxl.read.biff.BiffException;

public class Main {

    public static void main(String[] args) throws IOException, BiffException, ClassNotFoundException {

        lerPDF lerpdf = new lerPDF();

        String nomeArquivo = "Agro";
        String nomeCaminho;
        String conteudo;
        int i = 1;
        
        while (i <= 35) {
            nomeCaminho = "C:/Users/cafe/Desktop/simposio/simposio 1/pdf/" + nomeArquivo + i + ".pdf";
            lerpdf.setEndereco(nomeCaminho);
            conteudo = lerpdf.getConteudo();

            System.out.println(conteudo);
	i++
        }
    }
}

6 Respostas

renanpto

Boa Tarde, voce ja testou com outros arquivos pdfs ? Pelas chamadas parece que a exceção é lancada pela biblioteca que vc está utilizando…

AVISO: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float
Para extração de conteudo de arquivos, eu já utilizei o projeto Apache Tika http://tika.apache.org . Bem útil e fácil de usar. Fica a dica.
Exemplo da extracao usando um InputStream:

Tika tika = new Tika();
tika.parseToString(InputStream);
D

isso mesmo cara, o problema ta nos pdf. Utilizei outros e deu certo. Porém, eu queria que ele pegasse apenas o conteúdo das 20 primeira linhas da primeira página. Você saberia como fazer isso?

renanpto

Nesse caso não sei te dizer, mas tente verificar se no final de cada linha tem uma quebra tipo um “\n” ou qq outro caracter indique isso.

D

alguém ai sabe como pegar linha por linha usando o código acima (postado por mim).
tenho que pegar somente as 20 primeiras linhas

D

alguém ai pode ajudar, ou mostrar uma outra forma de fazer o que estou querendo?

F

e ae david, já conseguiu resolver?

fiz um teste e consegui pegar apenas as 20 primerias linhas da primeira página
dá uma olhada aí e vê se te ajuda!

public BufferedReader getConteudo(int startPage, int endPage) {
		StringWriter writer = null;
		BufferedReader buffer = null;
		File arquivoPDF = new File(this.endereco);
		FileInputStream arquivo = null;

		try {
			arquivo = new FileInputStream(arquivoPDF);
		} catch (IOException e) {
			System.out.println("ERRO:" + e.getMessage());
		}

		PDDocument pdfDocument = null;
		try {
			PDFParser parser = new PDFParser(arquivo);
			parser.parse();
			pdfDocument = parser.getPDDocument();

			writer = new StringWriter();
			PDFTextStripper stripper = new PDFTextStripper();

			stripper.setStartPage(startPage);
			stripper.setEndPage(endPage);
			stripper.writeText(pdfDocument, writer);

			buffer = new BufferedReader(new StringReader(writer.toString()));

			return buffer;

		} catch (IOException e) {
			e.printStackTrace();
			return null;
		} catch (Throwable e) {
			e.printStackTrace();
			return null;
		} finally {
			if (pdfDocument != null) {
				try {
					pdfDocument.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

e no teu método main

BufferedReader br = new BufferedReader(lerpdf.getConteudo(1,1));
		
		String line = null;
		int i = 0;
		while ((line = br.readLine()) != null)	{
			i++;
			if (i == 21) break;
			System.out.println(line);
		}

acho que isso já te ajuda :slight_smile:

Criado 5 de maio de 2011
Ultima resposta 6 de mai. de 2011
Respostas 6
Participantes 3