PDA

View Full Version : Problemi con IText e con TextExtractionStrategy


ZanTeo
19-10-2011, 09:19
Salve sto usando IText per estrarre il testo da un pdf. Riesco ad estrarre il testo ma senza una strategia di estrazione tale testo è incomprensibile. Il codice per l'estrazione che ho attualmente sviluppato è il seguente:

public static void main(String[] args) throws IOException {
FileInputStream f=new FileInputStream("TestPiùPagine.pdf");
PdfReader lettore = new PdfReader(f);
System.out.println(testoPagina(lettore,1));
}

public static String testoPagina(PdfReader lettore,int paginaAttuale) throws IOException{
if(paginaAttuale==lettore.getNumberOfPages()){
return PdfTextExtractor.getTextFromPage(lettore, paginaAttuale);
}
String s = PdfTextExtractor.getTextFromPage(lettore, paginaAttuale);
return s+testoPagina(lettore,paginaAttuale+1);
}// metodo che gestisce ricorsivamente la copiatura del testo

Il metodo legge e stampa tutto il contenuto della pagine solo che non rispetta nessun ordine. Per mantenere l'ordine dovrei usare il metodo:
PdfTextExtractor.getTextFromPage(lettore,paginaAttuale,strategia);
dove strategia è un implementazione dell interfaccia TextExtractionStrateg.

public class Strategia implements TextExtractionStrategy {
public void beginTextBlock() {
// TODO Auto-generated method stub}
public void endTextBlock() {
// TODO Auto-generated method stub}
public void renderImage(ImageRenderInfo arg0) {
// TODO Auto-generated method stub}
public void renderText(TextRenderInfo arg0) {
// TODO Auto-generated method stub}
public String getResultantText() {
// TODO Auto-generated method stub
return null;}

Il mio problema sta proprio in questa implementazione dell'interfaccia, non riesco a trovare una documentazione utile che mi faccia capire come implementare i metodi (non so cosa devono fare). non trovo nemmeno una classe TextExtractionStrateg già implementata oppure un alternativa (con IText o altro) che mi faccia estrarre il testo rispettando spaziature invii ed ordine parole.
Spero di essere stato molto chiaro nel descrivere il mio problema.

ZanTeo
19-10-2011, 09:54
qualche info in più

http://api.itextpdf.com/itext/

VICIUS
19-10-2011, 16:35
Hai provato ad usare quelle già presenti in iText come LocationTextExtractionStrategy?

ZanTeo
20-10-2011, 09:28
Ho risolto creando questa classe, i metodi restituiscono una stringa con dentro il testo richiesto, ben formattato, limitando gli sprechi di spazio ed eliminando le immagini. se avete consigli su come migliorarlo ancora sono ben accetti.
public class EstrattoreTesto{
private static PdfReader lettore;
private FileInputStream pdf;
private PdfReaderContentParser parserLettore;
TextExtractionStrategy strategia;

public EstrattoreTesto(FileInputStream filePdf) throws IOException{
pdf=filePdf;
lettore=new PdfReader(pdf);
parserLettore = new PdfReaderContentParser(lettore);
}

public String getTestoIterativo() throws IOException{
strategia = parserLettore.processContent(1, new SimpleTextExtractionStrategy());
String s = PdfTextExtractor.getTextFromPage(lettore,1);
for(int i=2;i<=lettore.getNumberOfPages();i++){
strategia = parserLettore.processContent(i, new SimpleTextExtractionStrategy());
s+=PdfTextExtractor.getTextFromPage(lettore,i);
}
return s;
}

public String getTestoRicorsivo(int paginaAttuale) throws IOException{
if(paginaAttuale==lettore.getNumberOfPages()){
strategia = parserLettore.processContent(paginaAttuale,new SimpleTextExtractionStrategy());
return PdfTextExtractor.getTextFromPage(lettore,paginaAttuale);
}
strategia = parserLettore.processContent(paginaAttuale, new SimpleTextExtractionStrategy());
String s = PdfTextExtractor.getTextFromPage(lettore, paginaAttuale);
return s+getTestoRicorsivo(paginaAttuale+1);
}

public String getTestoPagina(int pagina) throws IOException{
strategia = parserLettore.processContent(pagina,new SimpleTextExtractionStrategy());
return PdfTextExtractor.getTextFromPage(lettore, pagina);
}
}