Jak wyodrębnić tekst z pliku PDF? [Zamknięte]

152

Czy ktoś może polecić bibliotekę / API do wyodrębniania tekstu i obrazów z pliku PDF? Musimy być w stanie uzyskać dostęp do tekstu zawartego w znanych wcześniej obszarach dokumentu, więc API będzie musiało podać nam informacje o położeniu każdego elementu na stronie.

Chcielibyśmy, aby te dane zostały wyprowadzone w formacie xmllub json. Obecnie patrzymy na PdfTextStream, który wydaje się całkiem niezły, ale chcielibyśmy usłyszeć doświadczenia i sugestie innych ludzi.

Czy istnieją alternatywy (komercyjne lub bezpłatne) do programowego wyodrębniania tekstu z pliku PDF?

Budda007
źródło
1
Dla tych, którzy potrzebują czegoś naprawdę proste (brak informacji pozycja), to Perl regex może wystarczyć: /^\s*\[?\((.*?)\)\]?\s*T[Jj]/mg. Po prostu szuka operatora Tj / TJ, który oznacza cały normalny tekst w pliku PDF.
Alex R
1
użyj biblioteki TomRoush PdfBox, która działa dobrze na
Androidzie

Odpowiedzi:

113

Dostałem 400-stronicowy plik pdf z tabelą danych, które musiałem zaimportować - na szczęście brak obrazów. Ghostscript zadziałał dla mnie:

gswin64c -sDEVICE=txtwrite -o output.txt input.pdf

Plik wyjściowy został podzielony na strony z nagłówkami itp., Ale łatwo było wtedy napisać aplikację do usuwania pustych wierszy itp. I zassać wszystkie 30 000 rekordów. -dSIMPLEi -dCOMPLEXnie zrobiło różnicy w tym przypadku.

user2176753
źródło
37
W Linuksie i Cygwin polecenie jest gszamiast gswin64c. Działa świetnie. Żadnych opatentowanych płatnych bzdur. Po prostu działa.
Jannes
4
Tak, działa świetnie! Teraz mogę bezkarnie używać "grep" na moich plikach pdf. Ponieważ potrafię grepować lepiej niż czytać, to wygrana! (:-) Głosuj za.
David Elson
1
Jedynym problemem, jaki miałem z tym, było używanie go na plikach PDF z osadzonymi „starymi” czcionkami. Działa doskonale w przypadku plików PDF generowanych lokalnie, ale jest trudniejsza w przypadku niejasnych źródeł. W przeciwnym razie doskonały skrypt.
Jon M
Co ma -sDEVICE=txtwritezrobić? Nie rozumiem zbyt wiele po przeczytaniu Jak używać Ghostscript | Wybór urządzenia wyjściowego
Ooker
Aby uzyskać wyjście standardowe zamiast zapisywać jako plik tekstowy, użyj gswin64c -sDEVICE=txtwrite -o- input.pdf. Źródło (nieznacznie zmienione przeze mnie): gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526ac
LuH
33

Od dziś to wiem: najlepszą rzeczą do ekstrakcji tekstu z plików PDF jest TET, zestaw narzędzi do ekstrakcji tekstu . TET jest częścią rodziny produktów PDFlib.com.

PDFlib.com to firma Thomasa Merza. Jeśli nie rozpoznajesz jego nazwiska: Thomas Merz jest autorem „PostScript and PDF Bible”.

Pierwszym wcieleniem TET jest biblioteka . Że można prawdopodobnie zrobić wszystko, co chciał Budda006, w tym informacje o położeniu każdego elementu na stronie. Aha, i może również wyodrębniać obrazy. Ponownie łączy obrazy, które są podzielone na kawałki.

pdflib.com oferuje również inne wcielenie tej technologii, wtyczkę TET do programu Acrobat . Trzecim wcieleniem jest PDFlib TET iFilter . To jest samodzielne narzędzie dla komputerów stacjonarnych użytkowników. Oba są darmowe (jak w piwie) do użytku prywatnego, niekomercyjnego.

Jest naprawdę potężny. O wiele lepsze niż własna ekstrakcja tekstu Adobe. Wyodrębnił dla mnie tekst, w którym inne narzędzia (w tym Adobe) wypluwają tylko śmieci.

Właśnie przetestowałem samodzielne narzędzie dla komputerów stacjonarnych i to, co mówią na ich stronie internetowej, jest prawdą. Ma bardzo dobrą linię poleceń. Niektóre z moich "problematycznych" plików testowych PDF narzędzie obsłużyło z pełną satysfakcją.

Od teraz ta rzecz będzie moją rekomendacją dla wszystkich wyrafinowanych i trudnych wymagań dotyczących ekstrakcji tekstu PDF.

TET jest po prostu niesamowity. Wykrywa tabele. W tabelach identyfikuje komórki obejmujące wiele kolumn. Identyfikuje osobno wiersze tabeli i zawartość każdej komórki tabeli. Bardzo dobrze radzi sobie z łączeniem wyrazów: usuwa łączniki i przywraca całe wyrazy. Obsługuje języki inne niż ASCII (w tym CJK, arabski i hebrajski). Napotykając ligatury, przywraca oryginalne znaki ...

Spróbuj.

Kurt Pfeifle
źródło
32
Nie ma wersji próbnej, a 440 $ to trochę za dużo, aby „spróbować”.
Rok Strniša
Czy ta usługa jest dostępna za pośrednictwem interfejsu API?
bart
1
przetestowałem to, nie rozpoznaje kolumn. Przejrzałem pierwszą stronę w angielskim brukowcu. Tekst został podzielony na 3 kolumny na papierze, ale ta wtyczka całkowicie pomieszała zdania, co sprawiło, że wyglądał jak żart. Ghostscript, który jest darmowy, miał dokładnie to samo wyjście.
NoWhereToBeSeen
1
@RedHotScalability: Również BTW, TET robi rozpoznać colums jeżeli są stosowane z odpowiednimi parametrami. Ale zostawiam go jako exercize do ambitnego JS Scripter do zapoznania się z dokumentacją i dowiedzieć się, jak ...
Kurt Pfeifle
29

Wydajne narzędzie wiersza poleceń, open source, wolne od jakichkolwiek opłat, dostępne zarówno w systemie Linux, jak i Windows: po prostu nazwane pdftotext. To narzędzie jest częścią biblioteki xpdf.

http://en.wikipedia.org/wiki/Pdftotext

131
źródło
4
Na marginesie: użyj -layoutprzełącznika, aby zachować tabele, działa całkiem dobrze.
sebastian
12

Oto moja sugestia. Jeśli chcesz wyodrębnić tekst z PDF, możesz zaimportować plik pdf do Dokumentów Google, a następnie wyeksportować go do bardziej przyjaznego formatu, takiego jak .html, .odf, .rtf, .txt itp. Wszystko to za pomocą interfejsu Drive API. . Jest darmowy * i solidny. Spojrzeć na:

https://developers.google.com/drive/v2/reference/files/insert https://developers.google.com/drive/v2/reference/files/get

Ponieważ jest to API REST, jest kompatybilne ze WSZYSTKIMI językami programowania. Linki, które zamieściłem powyżej, mają praktyczne przykłady dla wielu języków, w tym: Java, .NET, Python, PHP, Ruby i inne.

Mam nadzieję, że to pomoże.

oabarca
źródło
2
Skorzystałem z tej opcji i nie polecałbym jej. Ekstrakcja tekstu PDF przez Google nie jest tak dobra, jak wiele alternatyw (szczególnie w przypadku języków innych niż angielski), a także jest bardzo powolna.
Björn Lindqvist
10

PdfTextStream (o którym mówiłeś) jest teraz bezpłatny dla aplikacji jednowątkowych. Moim zdaniem jego jakość jest znacznie lepsza niż w przypadku innych bibliotek (szczególnie w przypadku rzeczy takich jak funky osadzone czcionki itp.).

Alternatywnie powinieneś rzucić okiem na Apache PDFBox , open source.

Renaud
źródło
PdfTextStream nie jest obsługiwany w systemie Android. Czy są dostępne dobre biblioteki, takie jak ta na Androida?
FaisalAhmed
@FaisalAhmed a co z PDFBox?
Renaud
Tak PdfBox nie jest również obsługiwany w systemie Android .... zarówno PdfTextStream, jak i PdfBox używają części awt, która nie jest obsługiwana w
systemie
Używam tej biblioteki, która działa dobrze na Androidzie github.com/TomRoush/PdfBox-Android
FaisalAhmed
6

Jeden z komentarzy tutaj używał gs w systemie Windows. Odniosłem pewien sukces również w systemie Linux / OSX, z następującą składnią:

gs \
 -q \
 -dNODISPLAY \
 -dSAFER \
 -dDELAYBIND \
 -dWRITESYSTEMDICT \
 -dSIMPLE \
 -f ps2ascii.ps \
 "${input}" \
 -dQUIET \
 -c quit

Użyłem dSIMPLEzamiast tego, dCOMPLEXponieważ ten ostatni wyświetla 1 znak na linię.

kvz
źródło
5

Ponieważ pytanie dotyczy w szczególności alternatywnych narzędzi do pobierania danych z plików PDF w formacie XML , możesz być zainteresowany zapoznaniem się z komercyjnym narzędziem „ByteScout PDF Extractor SDK”, które jest w stanie zrobić dokładnie to: wyodrębnić tekst z pliku PDF jako XML wraz z dane pozycjonowania (x, y) i informacje o czcionce:

Tekst w źródłowym PDF:

Products | Units | Price 

Wyjście XML:

 <row>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="212" y="126" width="47" height="11">Products</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="428" y="126" width="27" height="11">Units</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="503" y="126" width="26" height="11">Price</text> 
  </column>
</row>

PS: dodatkowo dzieli tekst na strukturę tabelaryczną.

Ujawnienie: pracuję dla ByteScout

Eugene
źródło
3

Najlepsze, co obecnie przychodzi mi do głowy (na liście „prostych” narzędzi) to Ghostscript (aktualna wersja to v.8.71) i program narzędziowy PostScript ps2ascii.ps. Ghostscript wysyła go w swoim libpodkatalogu. Spróbuj tego (w systemie Windows):

gswin32c.exe ^
   -q ^
   -sFONTPATH=c:/windows/fonts ^
   -dNODISPLAY ^
   -dSAFER ^
   -dDELAYBIND ^
   -dWRITESYSTEMDICT ^
   -dCOMPLEX ^
   -f ps2ascii.ps ^
   -dFirstPage=3 ^
   -dLastPage=7 ^
   input.pdf ^
   -dQUIET ^
   -c quit

To polecenie przetwarza strony 3-7 z input.pdf. Przeczytaj komentarze w samym ps2ascii.pspliku, aby zobaczyć, co oznaczają "dziwne" liczby i dodatkowe informacje ( wskazują ciągi znaków, pozycje, szerokości, kolory, obrazy, prostokąty, czcionki i podziały stron ... ). Aby uzyskać „proste” wyjście tekstowe, zamień -dCOMPLEXczęść na -dSIMPLE.

Kurt Pfeifle
źródło
2
Jak można się domyślić, wyświetla tylko test ASCII. Chociaż bezpłatne, nie jest to świetna opcja dla oprogramowania, które planujesz używać w językach innych niż angielski.
userx
3
@userx: Jak można się domyślić, jest to wolne oprogramowanie: dlatego dostępny jest kod źródłowy. Możliwość rozszerzenia o obsługę innych niż ASCII ...
Kurt Pfeifle
@userx: dzisiaj odkryłem „TET”, zestaw narzędzi do ekstrakcji tekstu z pdflib.com. Zobacz moją drugą odpowiedź.
Kurt Pfeifle
ps2ascii z Ghostscript 9.07 działało pięknie na moim systemie OpenBSD. Właśnie przekonwertowałem 526-stronicowy plik PDF na zwykły tekst. Teraz mogę łatwo grepować i wyodrębniać tekst do notatek. Użyłem prostego polecenia ps2ascii book.pdf notes.txt. Jeśli twój dokument zawiera głównie ASCII, masz szczęście.
Clint Pachl
3

Wiem, że ten temat jest dość stary, ale ta potrzeba wciąż żyje. Czytałem wiele dokumentów, forum i skrypt i budowałem nowy, zaawansowany, który obsługuje skompresowane i nieskompresowane pliki PDF:

https://gist.github.com/smalot/6183152

W niektórych przypadkach wiersz poleceń jest zabroniony ze względów bezpieczeństwa. Tak więc natywna klasa PHP może spełniać wiele potrzeb.

Mam nadzieję, że to pomoże każdemu

Sebastien Malot
źródło
1

QuickPDF wydaje się być rozsądną biblioteką, która powinna robić to, co chcesz, za rozsądną cenę.

http://www.quickpdflibrary.com/ - Mają 30-dniowy okres próbny.

Andrew Cash
źródło
0

W moich systemach Macintosh stwierdzam, że „Adobe Reader” wykonuje całkiem dobrą robotę. Utworzyłem alias na moim pulpicie, który wskazuje na „Adobe Reader.app” i wszystko, co robię, to upuszczanie pliku PDF na alias, co czyni go aktywnym dokumentem w programie Adobe Reader, a następnie z menu Plik, Wybieram „Zapisz jako tekst…”, nadaję mu nazwę i gdzie go zapisać, klikam „Zapisz” i gotowe.

Dick Guertin
źródło
5
OP szukał rozwiązania umożliwiającego programowe wyodrębnianie tekstu z pliku PDF . Twoja odpowiedź proponuje zamiast tego ręczną procedurę.
mkl