Ho bisogno di analizzare un documento PDF. Ho già implementato il parser e ho utilizzato la libreria iText e fino ad ora ha funzionato senza problemi.Strani spazi bianchi durante l'analisi di un PDF
Ma no, ho bisogno di analizzare un altro documento che ottiene degli strani spazi molto bizzarri nel mezzo delle parole. A titolo di esempio ottengo:
Vo rber Zeitung auf die Motorr adsaison. Viele Motorr Ahr adf er
Tutte le parole in grassetto devono essere collegati, ma in qualche modo il parser PDF è l'aggiunta di spazi bianchi nelle parole. Ma quando copio e incollo il contenuto dal PDF in un file di testo non ottengo questi spazi.
Prima ho pensato che fosse a causa della libreria di analisi PDF che sto utilizzando, ma anche con un'altra libreria ottengo lo stesso identico problema.
Ho dato un'occhiata allo singleSpaceWidth
dalle parole analizzate e ho notato che è sempre variabile quando aggiunge uno spazio bianco. Ho provato a metterli manualmente insieme. Ma dal momento che non c'è davvero un modello per ricombinare le parole è quasi impossibile.
Qualcun altro ha un problema simile o addirittura una soluzione a tale problema?
Come richiesto, ecco qualche informazione in più:
- iText Versione 5.2.1
- http://prine.ch/whitespacesProblem.pdf (Link alla pdf)
analisi con SemTextExtractionStrategy:
PdfReader reader = new PdfReader("data/SpecialTests/SuedostSchweiz/" + src);
SemTextExtractionStrategy semTextExtractionStrategy = new SemTextExtractionStrategy();
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
// Set the page number on the strategy. Is used in the Parsing strategies.
semTextExtractionStrategy.pageNumber = i;
// Parse text from page
PdfTextExtractor.getTextFromPage(reader, i, semTextExtractionStrategy);
}
Qui il metodo SemTextExtractionStrategy che effettivamente analizza il t ext. Ci aggiungo manualmente dopo ogni parola analizzata uno spazio bianco, ma in qualche modo lo fa dividere le parole del rilevamento:
@Override
public void parseText(TextRenderInfo renderInfo, int pageNumber) {
this.pageNumber = pageNumber;
String text = renderInfo.getText();
currTextBlock.getText().append(text + " ");
....
}
Ecco tutta la classe SemTextExtraction ma lì lo fa solo chiamare il metodo dall'alto (parseText):
public class SemTextExtractionStrategy implements TextExtractionStrategy {
// Text Extraction Strategies
public ColumnDetecter columnDetecter = new ColumnDetecter();
// Image Extraction Strategies
public ImageRetriever imageRetriever = new ImageRetriever();
public int pageNumber = -1;
public ArrayList<TextParsingStrategy> textParsingStrategies = new ArrayList<TextParsingStrategy>();
public ArrayList<ImageParsingStrategy> imageParsingStrategies = new ArrayList<ImageParsingStrategy>();
public SemTextExtractionStrategy() {
// Add all text parsing strategies which are later on applied on the extracted text
// textParsingStrategies.add(fontSizeMatcher);
textParsingStrategies.add(columnDetecter);
// Add all image parsing strategies which are later on applied on the extracted text
imageParsingStrategies.add(imageRetriever);
}
@Override
public void beginTextBlock() {
}
@Override
public void renderText(TextRenderInfo renderInfo) {
// TEXT PARSING
for(TextParsingStrategy strategy : textParsingStrategies) {
strategy.parseText(renderInfo, pageNumber);
}
}
@Override
public void endTextBlock() {
}
@Override
public void renderImage(ImageRenderInfo renderInfo) {
for(ImageParsingStrategy strategy : imageParsingStrategies) {
strategy.parseImage(renderInfo);
}
}
}
indica la versione di iText che stai utilizzando e, in qualche modo, devi fornire anche il PDF e il codice con cui esegui l'analisi. – Eugene
Aggiunte tutte le informazioni nel post in alto. – Prine
e la classe TextExtractionStrategy che usi? – Eugene