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?
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.
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):
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;
// 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 (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
}