Ciao Matteo,
in teoria considerando che le parole chiave da ricercare starebbero sulla prima pagina (sto vedendo tutti i pdf forniti dal cliente) potrei anche non parsificare tutto il contenuto del file.
Esempio con pseudo codice molto grezzo e da ottimizzare :-)
PDFRenderer pdfRenderer = new PDFRenderer(document);
StringBuilder out = new StringBuilder();
ITesseract _tesseract = new Tesseract();
_tesseract.setDatapath("tessdata");
_tesseract.setLanguage("ita");
for (int page = 0; page < document.getNumberOfPages(); page++) {
BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
File tempFile = File.createTempFile("tempfile_" + page, ".png");
ImageIO.write(bufferedImage, "png", tempFile);
String result = _tesseract.doOCR(tempFile);
int index = result.toUpperCase().indexOf("STRINGA DA TROVARE");
if (index >= 0 ) {
System.out.println("Trovato il testo 'STRINGA DA TROVARE'");
break;
}
out.append(result);
tempFile.delete();
}
return out.toString();
Ovviamente nella realtà avrò diversi testi da cercare ed il codice sarà ben diverso ;-)
Casi pilota:
PDF (70 KB) creato con testo : 9 pagine : Trovata la stringa nella prima pagina e tempo di elaborazione 7 secondi
PDF (900 KB) creato con 11 immagini , una immagine in ogni pagina : Trovata la stringa nella prima pagina , tempo di elaborazione dai 15 secondi in su...
Rimane dunqu una elaborazione asincrona in tutti i casi e non fattibile durante l'upload del file nella pagina web.
Sto scrivendo il mio microservizio con schedulazione interna che andrà a elaborare i files pdf presenti nel path utente...
Provo a dare un'occhiata all'estensione fornitami :-)
Grazie
Giuseppe