Saya mencari dokumentasi atau contoh bagaimana mengekstrak teks dari file PDF menggunakan PDFMiner dengan Python.
Sepertinya PDFMiner memperbarui API mereka dan semua contoh relevan yang saya temukan berisi kode usang (kelas dan metode telah berubah). Pustaka yang saya temukan yang membuat tugas mengekstrak teks dari file PDF lebih mudah menggunakan sintaks PDFMiner lama jadi saya tidak yakin bagaimana melakukan ini.
Karena itu, saya hanya melihat kode sumber untuk melihat apakah saya bisa mengetahuinya.
python
python-3.x
python-2.7
text-extraction
pdfminer
DuckPuncher
sumber
sumber
PDFminer
tidak bekerja dengan Python 3.xx Itu mungkin alasan Anda mendapatkanimport
kesalahan. Anda harus menggunakanpdfminer3k
jika demikian, karena ini adalah impor Python 3 berdiri dari perpustakaan tersebut.PDFminer
dari GitHub dan mengimpor dengan baik. Bisakah Anda memposting kode dan memposting pelacakan error lengkap juga?Jawaban:
Berikut adalah contoh kerja mengekstrak teks dari file PDF menggunakan versi PDFMiner saat ini (September 2016)
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage from io import StringIO def convert_pdf_to_txt(path): rsrcmgr = PDFResourceManager() retstr = StringIO() codec = 'utf-8' laparams = LAParams() device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) fp = open(path, 'rb') interpreter = PDFPageInterpreter(rsrcmgr, device) password = "" maxpages = 0 caching = True pagenos=set() for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True): interpreter.process_page(page) text = retstr.getvalue() fp.close() device.close() retstr.close() return text
Struktur PDFMiner berubah baru-baru ini, jadi ini seharusnya berfungsi untuk mengekstrak teks dari file PDF.
Sunting : Masih berfungsi pada 7 Juni 2018. Diverifikasi dengan Python Versi 3.x
Sunting: Solusinya bekerja dengan Python 3.7 pada 3 Oktober 2019. Saya menggunakan perpustakaan Python
pdfminer.six
, dirilis pada November 2018.sumber
import sys reload(sys) sys.setdefaultencoding('utf-8')
file(path, 'rb')
menjadi `open (path, 'rb') agar milik saya berfungsi.jawaban hebat dari DuckPuncher, untuk Python3 pastikan Anda menginstal pdfminer2 dan lakukan:
import io from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage def convert_pdf_to_txt(path): rsrcmgr = PDFResourceManager() retstr = io.StringIO() codec = 'utf-8' laparams = LAParams() device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) fp = open(path, 'rb') interpreter = PDFPageInterpreter(rsrcmgr, device) password = "" maxpages = 0 caching = True pagenos = set() for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True): interpreter.process_page(page) fp.close() device.close() text = retstr.getvalue() retstr.close() return text
sumber
ImportError:
pesan yang samaIni berfungsi pada Mei 2020 menggunakan PDFminer enam dengan Python3.
Menginstal paket
Mengimpor paket
from pdfminer.high_level import extract_text
Menggunakan PDF yang disimpan di disk
text = extract_text('report.pdf')
Atau sebagai alternatif:
with open('report.pdf','rb') as f: text = extract_text(f)
Menggunakan PDF yang sudah ada di memori
Jika PDF sudah ada di memori, misalnya jika diambil dari web dengan pustaka permintaan, itu bisa diubah menjadi aliran menggunakan
io
pustaka:import io response = requests.get(url) text = extract_text(io.BytesIO(response.content))
Kinerja dan Keandalan dibandingkan dengan PyPDF2
PDFminer.six bekerja lebih andal daripada PyPDF2 (yang gagal dengan jenis PDF tertentu), khususnya PDF versi 1.7
Namun, ekstraksi teks dengan PDFminer.six secara signifikan lebih lambat daripada PyPDF2 dengan faktor 6.
Saya menghitung waktu ekstraksi teks dengan
timeit
15 "MBP (2018), hanya mengatur waktu fungsi ekstraksi (tidak ada pembukaan file, dll.) Dengan PDF 10 halaman dan mendapatkan hasil sebagai berikut:PDFminer.six: 2.88 sec PyPDF2: 0.45 sec
pdfminer.six juga memiliki footprint yang sangat besar, membutuhkan pycryptodome yang membutuhkan GCC dan hal-hal lain yang diinstal mendorong gambar instal docker minimal di Alpine Linux dari 80 MB menjadi 350 MB. PyPDF2 tidak memiliki dampak penyimpanan yang nyata.
sumber
ImportError: cannot import name 'open_filename' from 'pdfminer.utils'
ketika saya menjalankanfrom pdfminer.high_level import extract_text
Pengungkapan penuh, saya salah satu pengelola pdfminer.six.
Saat ini, ada beberapa api untuk mengekstrak teks dari PDF, tergantung kebutuhan Anda. Di balik layar, semua api ini menggunakan logika yang sama untuk mengurai dan menganalisis tata letak.
(Semua contoh menganggap file PDF Anda disebut example.pdf )
Garis komando
Jika Anda ingin mengekstrak teks sekali saja, Anda dapat menggunakan alat baris perintah pdf2txt.py:
Api tingkat tinggi
Jika Anda ingin mengekstrak teks dengan Python, Anda dapat menggunakan api tingkat tinggi. Pendekatan ini adalah solusi masuk jika Anda ingin mengekstrak teks secara terprogram dari banyak PDF.
from pdfminer.high_level import extract_text text = extract_text('example.pdf')
Api yang dapat disusun
Ada juga api yang dapat disusun yang memberikan banyak fleksibilitas dalam menangani objek yang dihasilkan. Misalnya, Anda dapat menerapkan algoritme tata letak Anda sendiri menggunakan itu. Metode ini disarankan dalam jawaban lain, tetapi saya hanya akan merekomendasikan ini ketika Anda perlu menyesuaikan cara pdfminer.six berperilaku.
from io import StringIO from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfdocument import PDFDocument from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.pdfpage import PDFPage from pdfminer.pdfparser import PDFParser output_string = StringIO() with open('example.pdf', 'rb') as in_file: parser = PDFParser(in_file) doc = PDFDocument(parser) rsrcmgr = PDFResourceManager() device = TextConverter(rsrcmgr, output_string, laparams=LAParams()) interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.create_pages(doc): interpreter.process_page(page) print(output_string.getvalue())
sumber
kode ini diuji dengan pdfminer untuk python 3 (pdfminer-20191125)
from pdfminer.layout import LAParams from pdfminer.converter import PDFPageAggregator from pdfminer.pdfinterp import PDFResourceManager from pdfminer.pdfinterp import PDFPageInterpreter from pdfminer.pdfpage import PDFPage from pdfminer.layout import LTTextBoxHorizontal def parsedocument(document): # convert all horizontal text into a lines list (one entry per line) # document is a file stream lines = [] rsrcmgr = PDFResourceManager() laparams = LAParams() device = PDFPageAggregator(rsrcmgr, laparams=laparams) interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.get_pages(document): interpreter.process_page(page) layout = device.get_result() for element in layout: if isinstance(element, LTTextBoxHorizontal): lines.extend(element.get_text().splitlines()) return lines
sumber