Ler vários arquivos

Estou usando o PdfReader para ler um arquivo em pdf, aonde pego informações desse pdf usando Regex, até aqui tudo bem

Só que agora eu preciso ler vários arquivos de pdf junto.

Exemplo na pasta eu tenho os arquivos 1.pdf, 2.pdf e 3.pdf…Como faço para ler eles?

Eu acredito que você tenha um método, no qual é responsável por ler o pdf e retornar o texto(String). Algo do tipo:

String texto1 = lerPDF(caminho do pdf1);
String texto2 = lerPDF(caminho do pdf2);

Se você não tem um método parecido com isso você já pode pensar em criar.

String texto = lerPDF(caminho do pdf1);
texto += lerPDF(caminho do pdf1);
texto += lerPDF(caminho do pdf3);

Não se é isso que você quer!

Faz um método para ler a pasta e buscar os arquivos e num laço realize a leitura dos arquivos um a um até o último para obter os dados que necessita.

1 curtida

Eu consegui ler os arquivos da pasta que estão em pdf, com a regex eu estou pegando alguns valores que estão nos arquivos, só que não estou conseguindo somar os valores que pego de cada aqrquivo, estou jogando eles em uma lista, só que ela não esta somando os valores, alguém pode me ajudar?

            public String pdfLeitor() {
	File arquivos = null;
	String convnovodenovo = null;
	File file = new File("C:\\Users\\Ruben\\Desktop\\teste\\");
	File afile[] = file.listFiles();
	int i = 0;
	String novo = null;
	for (int j = afile.length; i < j; i++) {
		arquivos = afile[i];
		novo = String.valueOf(arquivos);
		list2.add(novo);
	}
	for (String obj : list2) {
		try {
			PdfReader reader = new PdfReader(obj);
			String texto = PdfTextExtractor.getTextFromPage(reader, 1);
			
		} catch (IOException e) {
			e.getStackTrace();
		}
	}
	return texto;
}



            public Double Compra() {
	double valor = 0;
	String nome = null;
	String nomenovo = null;
	double valornovo = 0;
	double soma=0;
	String regex = "(\\d{1,}-CURSO).*( \\w+|\\w+\\.\\w+\\s+ )";
	Pattern padrao = Pattern.compile(regex);
	Matcher matcher = padrao.matcher(pdfLeitor());
	StringBuilder num;

	while (matcher.find()) {
		Locale.setDefault(Locale.US);
		num = new StringBuilder(matcher.group(1).replaceAll("[\\.,]", ""));
		num.insert(num.length() - 2, ".");
		valor = Double.parseDouble(num.toString());
		double valormap = valor;
		
		if (mapC.containsKey(nomenovo)) {
			double valornome = mapC.get(nomenovo);
			valornovo = valormap + valornome;
			BigDecimal bd = new BigDecimal(valornovo).setScale(2, RoundingMode.HALF_EVEN);
			valornovo = bd.doubleValue();
			mapC.put(nomenovo, valornovo);
			list.add(new Prod(valornovo));
		} else {
			mapC.put(nomenovo, valormap);
			list.add(new Prod(valormap));
		}
	}
	
         for(Prod obj: list) {
		soma += obj.getValorCompra();
		
	}
	for (String key : mapC.keySet()) {
		valortotalC = mapC.get(key);
		
	}

	return soma;
}

Só simulando para ver.
Na classe Prod somente tem o getValorCompra?
Qual o layout do seu arquivo pdf?

Me tira também uma dúvida sobre esse trecho abaixo! Qual é o objetivo dele?

for (String obj : list2) { 
      try { 
           PdfReader reader = new PdfReader(obj); 
           String texto = PdfTextExtractor.getTextFromPage(reader, 1);
      } catch (IOException e) { 
          e.getStackTrace(); 
      } 
}
return texto;

Pelo o que eu tô entendendo esse trecho percorre uma lista (list2) de String, criar um objeto PdfReader e usa ele como parâmetro para o método PDFTextoExtractor.getTextFromPage que retorna uma String, até aí tudo bem. Só que em cada interação do loop é criado uma String texto que é usada para armazenar esse valor, dessa forma os conteúdos dessa variável se perdem em cada passo do loop! Me corrija se eu estiver errado!

@Jelson1 O objetivo desse trecho de código, ele lê o conteúdo do arquivo em pdf.

Sim o valor esta se perdendo, ele esta retornando só um valor… não consigo testar agora, mais estava pensando a minha variável novo tem como conteúdo todos os arquivos em pdf lido, acredito que tenho q colocar ela no lugar da variável texto…oque vc acha?

Pelo seu código a variável novo, é apenas uma variável auxiliar para amarzenar o caminho dos arquivo, não o seu conteúdo em si!

No momento só penso em duas solução, a primeira você vai juntar os conteúdo do pdf em uma única variável:

String texto ="";

for (String obj : list2) { 
      try { 
           PdfReader reader = new PdfReader(obj); 
           texto += PdfTextExtractor.getTextFromPage(reader, 1) + "\n";
      } catch (IOException e) { 
          e.getStackTrace(); 
      } 
}
return texto;

O resultado seria algo como isso:

PDF 1 : Meu texto 1
PDF 2: Meu texto 2

O valor da variável texto com a concatenação dos dois pdf:

Meu texto 1
Meu texto 2

A segunda solução é amarzenar cada texto em uma lista e a sua função nesse caso não retornaria uma String, mas sim uma lista de String. Só que desse modo você vai ter que fazer uma modificação na sua outra função para receber essa lista.

Não sei se deu para entender!

na minha variável texto o resultado dela ja é (Meu Texto 1 e Meu Texto 2)…o problema é que o valor que estou pegando com minha regex do texto 1 e do texto 2, não estou conseguindo somar esses valores, entendeu?

Na sua função compra() eu vi que você declarou duas variáveis: nome e nomenovo, ambas inicializadas como null. Sendo que a variável nome parece que não está sendo utilizada e a variável nomenovo é sempre null, é isso mesmo que você quer??

É esse trecho responsável por realizar a soma?

for(Prod obj: list) {
	soma += obj.getValorCompra();	
}

Então você já verificou se essa lista contempla todos os valores que estão no pdf. Se o tamanho da lista corresponde ao total de valores presente nos dois PDFs (se isso for possível). Você pode debugar essa parte!

Também esqueci de perguntar qual tá sendo o resultado dessa soma, ela tá errada, tá incompleta ou gera um erro?

Não tenho um conhecimento aprofundado em hashmap, não posso ajudar muito com isso!

Boa sorte!

@Jelson1

Vi aqui que a minha variável texto só esta me retornando o conteúdo de um arquivo, por isso não estou conseguindo somar, ja tentei colocar em uma lista e mesmo assim só me retorna um conteúdo, pode me ajudar a fazer com que retorne todos arquivos que estão em minha pasta?

    String novo = null;
        public String pdfLeitor() {
File arquivos = null;
File file = new File("C:\\Users\\Ruben\\Desktop\\teste\\");
File afile[] = file.listFiles();
int i = 0;
	for (int j = afile.length; i < j; i++) {
	arquivos = afile[i];
	novo = String.valueOf(arquivos);
}
try {
	PdfReader reader = new PdfReader(novo);
	String texto = PdfTextExtractor.getTextFromPage(reader, 1);
	
} catch (IOException e) {
	e.getStackTrace();
}
return texto;

}

Testa esse primeiro exemplo!

No lugar desse trecho:

for (String obj : list2) {
		try {
			PdfReader reader = new PdfReader(obj);
			String texto = PdfTextExtractor.getTextFromPage(reader, 1);
			
		} catch (IOException e) {
			e.getStackTrace();
		}
	}
	return texto;

Faça:

String texto ="";

for (String obj : list2) { 
      try { 
           PdfReader reader = new PdfReader(obj); 
           texto += PdfTextExtractor.getTextFromPage(reader, 1) + "\n";
      } catch (IOException e) { 
          e.getStackTrace(); 
      } 
}
return texto;

@Jelson1 Não deu também…só retorna um conteúdo várias vezes…

Mostra o código que ler os pdfs

@Jelson1

    String novo = null;
public String pdfLeitor() {
	File arquivos = null;
	File file = new File("C:\\Users\\Ruben\\Desktop\\teste\\");
	File afile[] = file.listFiles();
	int i = 0;
		for (int j = afile.length; i < j; i++) {
		arquivos = afile[i];
		novo = String.valueOf(arquivos);
	}
	try {
		PdfReader reader = new PdfReader(novo);
		String texto = PdfTextExtractor.getTextFromPage(reader, 1);
	} catch (IOException e) {
		e.getStackTrace();
	}
	return texto;
} 



        public double valorCompra() {
	double valor = 0;
	String nome = null;
	String nomenovo = null;
	double valornovo = 0;
	double valormap = 0;
	double valortotal = 0;
	String regex = "(\\d{1,}-Curso C\\s+\\w+\\s+ ).*( \\d{1,}[\\.\\d{3}]*\\.\\d{2})";
	Pattern padrao = Pattern.compile(regex);
	Matcher matcher = padrao.matcher(pdfLeitor());
	StringBuilder num;
	while (matcher.find()) {
		Locale.setDefault(Locale.US);
		num = new StringBuilder(matcher.group(2).replaceAll("[\\.,]", ""));
		nome = matcher.group(1);
		nomenovo = nome.replaceAll(" ", "");
		num.insert(num.length() - 2, ".");
		valor = Double.parseDouble(num.toString());
		valormap = valor;
		if (map.containsKey(nomenovo)) {
			double valornome = map.get(nomenovo);
			valornovo = valormap + valornome;
			BigDecimal bd = new BigDecimal(valornovo).setScale(2, RoundingMode.HALF_EVEN);
			valornovo = bd.doubleValue();
			map.put(nomenovo, valornovo);
		} else {
			map.put(nomenovo, valor);
		}
	}
	for (String key : map.keySet()) {
		valortotal = map.get(key);
	}
	return valortotal;
}

}

Olha! Parece que você alterou seu código use, esse que você escreveu e faça a mundaça no trecho que sugeri!

@Jelson1
eu tinha me enganado nesse código, ele estava pegando o mesmo conteúdo 2 vezes…precisava pegar todos os conteúdos da pasta…

public String pdfLeitor() {
    String texto;
	File diretorio = new File("C:\\Users\\Ruben\\Desktop\\teste\\");
	File[] arquivos = file.listFiles();

    for(int i = 0; i < arquivos.length; i++){
          try{
                PdfReader reader = new PdfReader(arquivo[i].toString());
                texto += PdfTextExtractor.getTextFromPage(reader, 1)+"\n";

          }catch (IOException e){
              System.out.println(e.getStrackTrace());
          }
     }

     System.out.println(texto);
     return texto;
}

Tente isso, e depois me mostre uma foto do console ou se deu algum erro!

dessa forma ele mostra o mesmo conteúdo 2 vezes, o outro conteúdo esta se perdendo em alguma parte do código…

Mostra a imagem do console e logo abaixo do laço for , coloque System.out.println(arquivo[i].toString());