2011-10-31 23 views
11

Kiedy próbuję wyodrębnić tekst z moich plików PDF, wydaje się wstawiać spacje między losowo wybranymi słowami.PDFBox dodaje białe spacje w słowach

Używam PDFBox-app-1.6.0.jar (najnowsza wersja) na następujący przykładowy plik w sekcji Download tej strony: http://www.sheffield.gov.uk/roads/children/parents/6-11/pedestrian-training

próbowałem z kilkoma innymi plikami PDF i wydaje robić to samo na kilku stronach.

I wykonaj następujące czynności:

java -jar PDFBox-app-1.6.0.jar ExtractText -force -console ~/Pulpit/ped szkolenie pdf.pdf

na pobrany plik i będziesz zobacz obowiązuje w następujących włożona nieprawidłowo w wyniku na konsoli: „• Jeśli ch ildren są w stanie chodzić do SCHOO l bezpiecznie może to zmniejszyć zatory ”

„• Rozwija dobrą hab ITS w późniejszym życiu.”

"www.sheff ield.gov.uk"

"Think Ahead !, wh Ich opiera się na"

itp itd

Jak widać kilka słów powyżej mają spacje między nimi bez powodu, który mogę zgłębić.

Jestem na ubuntu i korzystam z JDK 1.6 Sun'a.

Próbowałem tego na kilku różnych plikach PDF i próbowałem szukać rozwiązania na forach, były podobne bugi, ale wszystko wydawało się zostać rozwiązane.

Każda pomoc lub jeśli ktoś inny ma taki sam problem, prosimy o komentarz. Powoduje to duży problem z odpowiednim indeksowaniem treści do wyszukiwania.

Odpowiedz

11

Niestety obecnie nie ma na to łatwego rozwiązania.

Wewnętrzne dokumenty PDF zawierają po prostu instrukcje typu "umieść znaki abc" na pozycji X "i" umieść znaki "na pozycji Y", a PDFBox próbuje sprawdzić, czy wynikowy wyodrębniony tekst powinien być "abc def" lub "abcdef" w oparciu o takie rzeczy, jak odległość między X i Y. Te heurystyki są generalnie dość dokładne, ale jak widać, nie zawsze dają prawidłowy wynik.

Jednym ze sposobów poprawy jakości wyodrębnionego tekstu jest wypróbowanie wyszukiwania słownika na każdym wyodrębnionym słowie lub tokenie. Jeśli wyszukiwanie nie powiedzie się, spróbuj połączyć token z kolejnym. Jeśli wyszukiwanie słownika na połączonym tokenie powiedzie się, jest całkiem możliwe, że ekstraktor tekstu błędnie dodał dodatkową przestrzeń wewnątrz słowa. Niestety taka funkcja jeszcze nie istnieje w PDFBox. Zobacz https://issues.apache.org/jira/browse/PDFBOX-1153 dla złożonego wniosku o funkcję. Patche mile widziane!

+1

Dzięki Jukka, czasami jest to ulga po prostu zrozumieć, dlaczego coś nie działa zgodnie z oczekiwaniami, a także, że nie robię nic, co jest przyczyną problemu. –

+0

Oto przykład, jak zbudować taki słownik terminów, jeśli używasz Lucene. [Jak wyodrębnić wektor terminów dokumentu w Lucene] (http://stackoverflow.com/a/8901758/165085) –

5

Klasa org.apache.pdfbox.util.PDFTextStripper (pdfbox-1.7.1) pozwala zmodyfikować skłonność do decydowania, czy dwa łańcuchy są częścią tego samego słowa, czy nie.

Zwiększenie wartości spacingTolerance spowoduje zmniejszenie liczby wstawionych spacji.

/** 
* Set the space width-based tolerance value that is used 
* to estimate where spaces in text should be added. Note that the 
* default value for this has been determined from trial and error. 
* Setting this value larger will reduce the number of spaces added. 
* 
* @param spacingToleranceValue tolerance/scaling factor to use 
*/ 
public void setSpacingTolerance(float spacingToleranceValue) { 
    this.spacingTolerance = spacingToleranceValue; 
}