Ich muss ein PDF-Dokument analysieren. Ich habe bereits den Parser implementiert und die Bibliothek iText verwendet und bis jetzt funktionierte es ohne Probleme.Seltsame Leerzeichen beim Analysieren eines PDFs
Aber nein, ich muss ein anderes Dokument analysieren, das sehr seltsame Leerzeichen in der Mitte der Wörter bekommt. Als Beispiel erhalte ich:
Vo rber eitung auf sterben Motorr adsaison. Viele Motorr adf ahr er
Alle fett Worte verbunden sein sollte, aber irgendwie die PDF-Parser ist das Hinzufügen von Leerzeichen in den Worten. Aber wenn ich den Inhalt aus der PDF in eine Textdatei kopiere und einfüge, bekomme ich diese Leerzeichen nicht.
Zuerst dachte ich, es ist wegen der PDF-Parsing-Bibliothek, die ich benutze, aber auch mit einer anderen Bibliothek bekomme ich genau das gleiche Problem.
Ich habe die singleSpaceWidth
aus den geparsten Wörtern untersucht und festgestellt, dass es immer dann variiert, wenn ein Whitespace hinzugefügt wird. Ich habe versucht, sie manuell zusammenzustellen. Aber da es nicht wirklich ein Muster gibt, um die Wörter neu zu kombinieren, ist es fast unmöglich.
Hat jemand anderes ein ähnliches Problem oder sogar eine Lösung für dieses Problem?
Wie gewünscht, hier einige weitere Informationen:
- iText Version 5.2.1
- http://prine.ch/whitespacesProblem.pdf (Link zum pdf)
Parsing mit 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);
}
Hier die SemTextExtractionStrategy-Methode, die den t ext. Es füge ich manuell nach jedem geparsten Wort ein Leerzeichen, aber irgendwie hat es die Wörter in der Erkennung aufgeteilt:
@Override
public void parseText(TextRenderInfo renderInfo, int pageNumber) {
this.pageNumber = pageNumber;
String text = renderInfo.getText();
currTextBlock.getText().append(text + " ");
....
}
sich hier die ganze SemTextExtraction Klasse ist aber dort nur die Methode ruft von oben (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);
}
}
}
Bitte sagen Sie der Version von iText, die Sie verwenden, und irgendwie müssen Sie auch die PDF-Datei und den Code, mit dem Sie analysieren, bereitstellen. – Eugene
Alle Informationen im obigen Beitrag hinzugefügt. – Prine
Was ist mit der von Ihnen verwendeten TextExtractionStrategy-Klasse? – Eugene