Pegar informações Arquivo em PDF

Pessoal estou lendo um arquivo em PDF, como eu faço para pegar informações que eu desejo, exemplo no campo valor liquido preciso pegar o valor que esta no arquivo.
Em txt parece ser mais facil manipular do que com Pdf.
Alguém pode me ajudar?

try {
PdfReader reader = new PdfReader(“C:\Users\Ruben\Desktop\teste\texto.pdf”);
String textFromPage = PdfTextExtractor.getTextFromPage(reader, 1);

		System.out.println(textFromPage);

		

		reader.close();
		
	} catch (IOException e) {
		e.getStackTrace();
	}

}

}

Com o iText, vc consegue fazer isso.

Bom dia!

A alguns anos implementei uma solução para extração de texto de arquivos PDF utilizando o iText

import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;

import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.TextExtractionStrategy;

/**
 * Leitor de arquivos PDF.
 * */
public class PDFReader {

	/**
	 * Faz a leitura do arquivo PDF e salva a saída no mesmo caminho que o arquivo original.
	 * 
	 * @param filePath
	 *            caminho do arquivo pdf
	 * @param textStractionStrategy
	 *            estratégia de extração do texto
	 * @param fileExtensionType
	 *            extensão do arquivo de saída
	 * @param textToReplace
	 *            uma lista contendo texto ou caracteres para substituição(vetor de duas posições).
	 * */
	public void pdfToText(String filePath, TextExtractionStrategy textStractionStrategy, EnFileExtensionType fileExtensionType, ArrayList<String[]> textToReplace) {
		try {
			PdfReader pdfReader = new PdfReader(filePath);
			PdfReaderContentParser PdfParser = new PdfReaderContentParser(pdfReader);
			PrintWriter out = new PrintWriter(new FileOutputStream(filePath + fileExtensionType));
			TextExtractionStrategy textStrategy;
			for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) {
				textStrategy = PdfParser.processContent(i, textStractionStrategy);

				String result = textStrategy.getResultantText();

				for (int j = 0; j < textToReplace.size(); j++) {
					result.replace(textToReplace.get(j)[0], textToReplace.get(j)[1]);
				}

				out.println(result);
			}

			out.flush();
			out.close();

			pdfReader.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Sendo possível implementar sua própria estratégia para extração do texto

TextExtractionStrategy textStrategy = new SimplePDFTextExtractionStrategy();
TextExtractionStrategy textStrategy = new LocationPDFTextExtractionStrategy();
TextExtractionStrategy textStrategy = new AdvancedPDFTextExtractionStrategy();

mais como vc faz para pegar determinada informações, exemplo eu li as informações do meu arquivo pdf e preciso pegar o valor que esta no campo impostos.

impostos 145,47

como faço para pegar esse valor?

Aqui você tem o seu texto extraído do PDF:

String result = textStrategy.getResultantText();

A sua implementação do TextExtractionStrategy que irá determinar como será o resultado final.
No meu caso os PDF’s são tabelas então separei cada conjunto(ou célula) por ponto e vírgula.

Um exemplo(não consegui formatar o código, este forúm ta um lixo):

import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.LineSegment;
import com.itextpdf.text.pdf.parser.TextExtractionStrategy;
import com.itextpdf.text.pdf.parser.TextRenderInfo;
import com.itextpdf.text.pdf.parser.Vector;

/**

  • Implementação de um renderizador simples para extração de texto.


  • Este renderizador mantém o controle da posição atual Y de cada String. Se ele detectar

  • que a posição y mudou, ele insere uma quebra de linha na saída. O PDF a ser renderizado

  • deve ter formatação simples(linha-a-linha, sem tabulações ou linhas mescladas),

  • isto irá resultar em uma verdadeira representação de como ele aparece no PDF.


  • Este renderizador usa uma estratégia simples com base nas métricas de fonte para determinar

  • quebras de linha, espaçamentos e inserção de ponto e vírgula.

  • */
    public class SimplePDFTextExtractionStrategy implements TextExtractionStrategy {
    private Vector lastStart;
    private Vector lastEnd;

    /** Utilizado para armazenar o texto. */
    private final StringBuffer result = new StringBuffer();;

    /**

    • Cria um novo renderizador para extração de texto.
      */
      public SimplePDFTextExtractionStrategy() {
      }

    public void beginTextBlock() {
    }

    public void endTextBlock() {
    }

    /**

    • @return Retorna o texto da página.
      */
      public String getResultantText() {
      return result.toString();
      }

    TextRenderInfo lastRenderInfo = null;
    float lastDist = 0f;

    /**

    • Captura o texto usando um algoritmo simplificado para inserir quebra de linha e ponto e vírgula.
      */
      public void renderText(TextRenderInfo renderInfo) {
      boolean firstRender = result.length() == 0;// indica que é o primeiro TextRender
      boolean hardReturn = false;

      LineSegment segment = renderInfo.getBaseline();
      Vector start = segment.getStartPoint();
      Vector end = segment.getEndPoint();

      float dist = 0f;

      if (!firstRender) {
      Vector x0 = start;
      Vector x1 = lastStart;
      Vector x2 = lastEnd;

       // ver http://mathworld.wolfram.com/Point-LineDistance2-Dimensional.html
       float dist2 = (x2.subtract(x1)).cross((x1.subtract(x0))).lengthSquared() / x2.subtract(x1).lengthSquared();
      
       // tecnicamente, devemos verificar tanto as posições iniciais e finais, no caso de o ângulo do texto mudar sem qualquer deslocamento,
       // provavelmente deve basear-se nas métricas de fonte atuais, mas 1pt parece ser suficiente
       float sameLineThreshold = 1f;
       if (dist2 > sameLineThreshold)
       	hardReturn = true;
      
       // compara a distância entre a letra anterior e a atual, se a distância for maior do que a última distância medida é uma indicação de que
       // temos o ínicio de uma nova palavra, ou frase. Para a correta formação de uma frase faz-se necessário verificar os espaços em branco
       // porque não podemos inserir ponto e vírgula entre palavras da mesma frase.
       dist = distanceFromEndOf(renderInfo, lastRenderInfo);
      

// if (dist < -renderInfo.getSingleSpaceWidth())
// result.append(’;’);
//
// else if (dist > lastDist && (renderInfo.getText() != " " && lastRenderInfo.getText() != " ")) {
// result.append(’;’);
// }
}

	if (hardReturn) {
		result.append('\n');
	}

	result.append(renderInfo.getText());

	lastStart = start;
	lastEnd = end;
	lastRenderInfo = renderInfo;

	// somente captura a última distância entre duas letras caso elas estiverem na mesma linha
	if (renderInfo.getBaseline().getStartPoint().get(1) - lastRenderInfo.getBaseline().getStartPoint().get(1) > 0)
		lastDist = dist;
	else
		lastDist = 0f;
}

/**
 * Distância entre dois TextRender.
 * */
private float distanceFromEndOf(TextRenderInfo renderInfo, TextRenderInfo lastRenderInfo) {
	float distance = renderInfo.getDescentLine().getStartPoint().get(0) - lastRenderInfo.getDescentLine().getEndPoint().get(0);
	return distance;
}

public void renderImage(ImageRenderInfo renderInfo) {
	// não faz nada - não é necessário renderizar imagens
}

}