Próbuję wyodrębnić tekst zawarty w tym pliku PDF za pomocą Python
.
Korzystam z modułu PyPDF2 i mam następujący skrypt:
import PyPDF2
pdf_file = open('sample.pdf')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print page_content
Po uruchomieniu kodu otrzymuję następujące dane wyjściowe, które różnią się od danych zawartych w dokumencie PDF:
!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%
Jak mogę wyodrębnić tekst z dokumentu PDF?
pdf_file = open('sample.pdf', 'rb')
?Odpowiedzi:
Szukałem prostego rozwiązania dla Pythona 3.x i Windows. Wydaje się, że nie ma wsparcia z textract , co jest niefortunne, ale jeśli szukasz prostego rozwiązania dla systemu Windows / Python 3, sprawdź pakiet tika , naprawdę proste do czytania plików pdf.
Zauważ, że Tika jest napisana w Javie, więc będziesz musiał zainstalować Java Runtime
źródło
Użyj textract.
Obsługuje wiele rodzajów plików, w tym pliki PDF
źródło
textract
to opakowanie dlaPoppler:pdftotext
(między innymi).Spójrz na ten kod:
Dane wyjściowe to:
Użycie tego samego kodu do odczytu pliku pdf z 201308FCR.pdf . Wyjście jest normalne.
Jego dokumentacja wyjaśnia dlaczego:
źródło
Po wypróbowaniu textract (który wydawał się mieć zbyt wiele zależności) i pypdf2 (który nie mógł wyodrębnić tekstu z pdfów, z którymi testowałem) i tika (który był zbyt wolny) skończyłem na użyciu
pdftotext
z xpdf (jak już zasugerowałem w innej odpowiedzi) i właśnie wywołałem plik binarny bezpośrednio z Pythona (może być konieczne dostosowanie ścieżki do pdftotext):Istnieje pdftotext, który robi to samo, ale zakłada, że pdftotext znajduje się w / usr / local / bin, podczas gdy ja używam tego w AWS lambda i chciałem go użyć z bieżącego katalogu.
Btw: Aby użyć tego na lambda, musisz wprowadzić funkcję binarną i zależność do
libstdc++.so
swojej funkcji lambda. Osobiście potrzebowałem skompilować xpdf. Ponieważ instrukcje tego wysadziłyby tę odpowiedź, umieściłem je na moim osobistym blogu .źródło
Zamiast tego możesz użyć xPDF o sprawdzonym czasie i pochodnych narzędzi do wyodrębnienia tekstu, ponieważ pyPDF2 nadal wydaje się mieć różne problemy z wyodrębnianiem tekstu.
Długa odpowiedź brzmi: istnieje wiele odmian sposobu kodowania tekstu w pliku PDF i może wymagać dekodowania samego łańcucha PDF, następnie może być konieczne mapowanie za pomocą CMAP, a następnie może być konieczne przeanalizowanie odległości między słowami i literami itp.
Jeśli plik PDF jest uszkodzony (tzn. Wyświetla prawidłowy tekst, ale podczas kopiowania powoduje śmieci) i naprawdę musisz wyodrębnić tekst, możesz rozważyć konwersję PDF na obraz (za pomocą ImageMagik ), a następnie użyj Tesseract, aby uzyskać tekst z obrazu za pomocą OCR.
źródło
Wypróbowałem wiele konwerterów plików PDF w Pythonie i lubię aktualizować tę recenzję. Tika jest jedną z najlepszych. Ale PyMuPDF to dobra wiadomość od użytkownika @ehsaneha.
Zrobiłem kod, aby je porównać: https://github.com/erfelipe/PDFtextExtraction Mam nadzieję, że ci pomogę.
źródło
.encode('utf-8', errors='ignore')
Poniższy kod jest rozwiązaniem pytania w Pythonie 3 . Przed uruchomieniem kodu upewnij się, że masz zainstalowaną
PyPDF2
bibliotekę w swoim środowisku. Jeśli nie jest zainstalowany, otwórz wiersz polecenia i uruchom następujące polecenie:Kod rozwiązania:
źródło
PyPDF2 w niektórych przypadkach ignoruje białe znaki i sprawia, że tekst wynikowy jest bałaganem, ale używam PyMuPDF i jestem bardzo zadowolony, że możesz użyć tego linku, aby uzyskać więcej informacji
źródło
pip install pymupdf==1.16.16
. Używanie tej konkretnej wersji, ponieważ dzisiaj najnowsza wersja (17) nie działa. Zdecydowałem się na pymupdf, ponieważ wyodrębnia pola zawijania tekstu w nowym wierszu char\n
. Więc wyodrębniam tekst z pdf do ciągu za pomocą pymupdf, a następnie używammy_extracted_text.splitlines()
do podzielenia tekstu na linie na listę.pdftotext jest najlepszy i najprostszy! pdftotext również rezerwuje strukturę.
Próbowałem PyPDF2, PDFMiner i kilku innych, ale żaden z nich nie dał zadowalającego rezultatu.
źródło
Collecting PDFMiner (from pdf2text)
więc nie rozumiem teraz tej odpowiedzi.Możesz użyć PDFtoText https://github.com/jalan/pdftotext
PDF do tekstu zachowuje wcięcia formatu tekstu, nie ma znaczenia, jeśli masz tabele.
źródło
Wielostronicowy pdf można wyodrębnić jako tekst w jednym odcinku zamiast podawać indywidualny numer strony jako argument przy użyciu poniższego kodu
źródło
Oto najprostszy kod do wyodrębniania tekstu
kod:
źródło
Tutaj znalazłem rozwiązanie PDFLayoutTextStripper
To dobrze, ponieważ może zachować układ oryginalnego pliku PDF .
Jest napisany w Javie, ale dodałem Gateway do obsługi Pythona.
Przykładowy kod:
Przykładowe dane wyjściowe z pliku PDFLayoutTextStripper :
Możesz zobaczyć więcej szczegółów tutaj Stripper with Python
źródło
Mam lepszą pracę niż OCR i utrzymanie wyrównania strony podczas wyodrębniania tekstu z pliku PDF. Powinien być pomocny:
źródło
codec
arg . Naprawiłem to, usuwając go tj.device = TextConverter(rsrcmgr, retstr, laparams=laparams)
Do wyodrębnienia tekstu z pliku PDF użyj poniższego kodu
źródło
Dodaję kod, aby to osiągnąć: Działa dla mnie dobrze:
źródło
Można pobrać tika-app-xxx.jar (ostatni) z tutaj .
Następnie umieść ten plik .jar w tym samym folderze pliku skryptu python.
następnie wstaw następujący kod do skryptu:
Zaletą tej metody:
mniejsza zależność. Pojedynczym plikiem .jar łatwiej jest zarządzać tym pakietem python.
obsługa wielu formatów. Pozycja
source_pdf
może być katalogiem dowolnego rodzaju dokumentu. (.doc, .html, .odt itp.)aktualny. Plik tika-app.jar zawsze wypuszcza się wcześniej niż odpowiednia wersja pakietu tika python.
stabilny. Jest o wiele bardziej stabilny i dobrze utrzymany (Powered by Apache) niż PyPDF.
niekorzyść:
Niezbędny jest bezgłowy.
źródło
Jeśli wypróbujesz to w Anaconda w systemie Windows, PyPDF2 może nie obsługiwać niektórych plików PDF ze niestandardową strukturą lub znakami Unicode. Polecam użycie następującego kodu, jeśli chcesz otworzyć i odczytać wiele plików pdf - tekst wszystkich plików pdf w folderze ze ścieżką względną
.//pdfs//
zostanie zapisany na liściepdf_text_list
.źródło
PyPDF2 działa, ale wyniki mogą się różnić. Widzę dość niespójne ustalenia z ekstrakcji wyników.
źródło