Bagaimana cara mengekstrak teks dari file PDF?

190

Saya mencoba mengekstrak teks yang disertakan dalam file PDF ini menggunakan Python.

Saya menggunakan modul PyPDF2 , dan memiliki skrip berikut:

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

Ketika saya menjalankan kode, saya mendapatkan output berikut yang berbeda dari yang disertakan dalam dokumen PDF:

!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%

Bagaimana saya bisa mengekstrak teks seperti pada dokumen PDF?

Kesederhanaan
sumber
9
Saya tidak pernah pakai modul itu, tapi apakah itu membuat perbedaan jika Anda membuka file dalam modus biner: pdf_file = open('sample.pdf', 'rb')?
PM 2Ring
2
Terima kasih untuk balasan Anda. Saya mencobanya dengan mode biner, tetapi tidak ada yang berubah
Kesederhanaan
3
Salin teks menggunakan penampil PDF yang bagus - Adobe Acrobat Reader, jika memungkinkan. Apakah Anda mendapatkan hasil yang sama? Perbedaannya bukan karena teksnya berbeda, tetapi fontnya adalah - kode karakter dipetakan ke nilai lain. Tidak semua PDF berisi data yang benar untuk memulihkan ini.
usr2564301
2
PDF itu berisi tabel karakter CMap, sehingga batasan dan cara kerja yang dibahas dalam utas ini relevan - stackoverflow.com/questions/4203414/… .
Kerdil
2
PDF memang mengandung CMAP yang benar sehingga mudah untuk mengubah pemetaan karakter ad hoc menjadi teks biasa. Namun, dibutuhkan pemrosesan tambahan untuk mengambil urutan teks yang benar. Perender PDF Kuarsa Mac OS X adalah pekerjaan yang tidak menyenangkan! Dalam urutan render aslinya, saya mendapatkan "m T'h iuss iisn ga tosam fopllloew DalFo dnogc wumithe ntht eI tutorial" ... Hanya setelah mengurutkan berdasarkan x koordinat saya mendapatkan hasil yang jauh lebih tepat: "Ini adalah contoh dokumen PDF saya sedang saya gunakan untuk mengikuti tutorial ".
usr2564301

Jawaban:

199

Saya sedang mencari solusi sederhana untuk digunakan untuk python 3.x dan windows. Tampaknya tidak ada dukungan dari textract , yang sangat disayangkan, tetapi jika Anda mencari solusi sederhana untuk windows / python 3 paket tika , sangat mudah untuk membaca pdf.

Tika-Python adalah Python yang mengikat layanan Apache Tika ™ REST yang memungkinkan Tika dipanggil secara asli di komunitas Python.

from tika import parser # pip install tika

raw = parser.from_file('sample.pdf')
print(raw['content'])

Perhatikan bahwa Tika ditulis dalam Java sehingga Anda perlu menginstal Java runtime

DJK
sumber
17
Saya menguji pypdf2, tika dan mencoba dan gagal menginstal textract dan pdftotext. Pypdf2 mengembalikan 99 kata sementara tika mengembalikan semua 858 kata dari faktur pengujian saya. Jadi saya akhirnya pergi dengan tika.
Stian
8
Man aku mencintaimu. Saya tidak tahu mengapa jawaban yang bagus itu tersembunyi di StackOverflow. Semua orang terus mengatakan bahwa kita perlu menggunakan PyPDF2 atau pdfminer tetapi mereka bau. Saya jatuh cinta dengan tika sekarang
jxpython
15
Saya terus mendapatkan kesalahan "RuntimeError: Tidak dapat memulai server Tika".
Nav
3
Jawaban Saya telah mencari seluruh hidup saya, mengapa tidak ada orang lain yang merekomendasikan Tika? Terima kasih!
Jacob-Jan Mosselman
4
Jika Anda perlu menjalankan ini pada semua file PDF dalam direktori (secara rekursif), ambil skrip ini
Hope
58

Gunakan textract.

Ini mendukung banyak jenis file termasuk PDF

import textract
text = textract.process("path/to/file.extension")
Jakobovski
sumber
24
Textwrap tampaknya menjadi pembungkus yang bagus, tetapi mengandalkan banyak utilitas non-Python yang mungkin tidak mudah tersedia pada sistem yang diberikan.
David Brown
1
Berfungsi untuk PDF, epubs, dll - memproses PDF yang gagal dijalankan oleh PDFMiner
Ulad Kasach
bagaimana cara menggunakannya di aws lambda, saya mencoba ini tetapi, kesalahan impor terjadi dari sana
Arun Kumar
5
textractadalah pembungkus untuk Poppler:pdftotext(antara lain).
onewhaleid
1
@ArunKumar: Untuk menggunakan apa pun di AWS Lambda yang tidak built-in, Anda harus memasukkannya dan semua dependensi tambahan, dalam bundel Anda.
Jeff Learman
51

Lihatlah kode ini:

import PyPDF2
pdf_file = open('sample.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print page_content.encode('utf-8')

Outputnya adalah:

!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%

Menggunakan kode yang sama untuk membaca pdf dari 201308FCR.pdf . Outputnya normal.

Its dokumentasi menjelaskan mengapa:

def extractText(self):
    """
    Locate all text drawing commands, in the order they are provided in the
    content stream, and extract the text.  This works well for some PDF
    files, but poorly for others, depending on the generator used.  This will
    be refined in the future.  Do not rely on the order of text coming out of
    this function, as it will change if this function is made more
    sophisticated.
    :return: a unicode string object.
    """
Quinn
sumber
@VineeshTP: Apakah Anda mendapatkan sesuatu untuk page_content? Jika ya, maka lihat apakah itu membantu dengan menggunakan pengkodean lain selain (utf-8)
Quinn
Perpustakaan terbaik yang saya temukan untuk membaca pdf menggunakan python adalah 'tika'
Vineesh TP
201308FCR.pdf tidak ditemukan.
Chaitanya Bapat
30

Setelah mencoba textract (yang tampaknya memiliki terlalu banyak dependensi) dan pypdf2 (yang tidak dapat mengekstraksi teks dari pdf yang saya uji dengan) dan tika (yang terlalu lambat) saya akhirnya menggunakan pdftotextdari xpdf (seperti yang sudah disarankan dalam jawaban lain) dan baru saja memanggil biner dari python secara langsung (Anda mungkin perlu menyesuaikan path ke pdftotext):

import os, subprocess
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
args = ["/usr/local/bin/pdftotext",
        '-enc',
        'UTF-8',
        "{}/my-pdf.pdf".format(SCRIPT_DIR),
        '-']
res = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = res.stdout.decode('utf-8')

Ada pdftotext yang pada dasarnya melakukan hal yang sama tetapi ini mengasumsikan pdftotext di / usr / local / bin sedangkan saya menggunakan ini di AWS lambda dan ingin menggunakannya dari direktori saat ini.

Btw: Untuk menggunakan ini pada lambda Anda perlu memasukkan biner dan dependensi ke libstdc++.sodalam fungsi lambda Anda. Saya pribadi perlu mengkompilasi xpdf. Sebagai instruksi untuk ini akan meledakkan jawaban ini saya taruh di blog pribadi saya .

hansaplast
sumber
4
Ya Tuhan, itu berhasil !! Akhirnya, solusi yang mengekstrak teks dalam urutan yang benar! Saya ingin memeluk Anda untuk jawaban ini! (Atau jika Anda tidak suka pelukan, inilah kopi / bir virtual / ...)
DonQuiKong
4
senang itu membantu! Upvoting memberikan sensasi yang sama dengan memeluk, jadi saya baik-baik saja!
hansaplast
sederhana ... gr8 berpikir di luar kotak!
shantanu pathak
10

Anda mungkin ingin menggunakan xPDF yang telah terbukti dan alat yang diturunkan untuk mengekstrak teks sebagai gantinya pyPDF2 memiliki berbagai masalah dengan ekstraksi teks.

Jawaban panjangnya adalah ada banyak variasi bagaimana sebuah teks dikodekan dalam PDF dan mungkin perlu mendekodekan string PDF itu sendiri, kemudian mungkin perlu memetakan dengan CMAP, kemudian mungkin perlu menganalisis jarak antara kata dan huruf dll.

Jika PDF rusak (yaitu menampilkan teks yang benar tetapi ketika menyalinnya membuat sampah) dan Anda benar-benar perlu mengekstraksi teks, maka Anda mungkin ingin mempertimbangkan untuk mengubah PDF menjadi gambar (menggunakan ImageMagik ) dan kemudian menggunakan Tesseract untuk mendapatkan teks dari gambar menggunakan OCR.

Eugene
sumber
-1 karena OP meminta untuk membaca pdf dengan Python, dan meskipun ada pembungkus xpdf untuk python, ia tidak dikelola dengan baik.
cduguet
9

Saya sudah mencoba banyak konverter Python PDF, dan saya ingin memperbarui ulasan ini. Tika adalah salah satu yang terbaik. Tapi PyMuPDF adalah kabar baik dari pengguna @ehsaneha.

Saya melakukan kode untuk membandingkannya di: https://github.com/erfelipe/PDFtextExtraction Saya berharap dapat membantu Anda.

Tika-Python adalah Python yang mengikat layanan Apache Tika ™ REST yang memungkinkan Tika dipanggil secara asli di komunitas Python.

from tika import parser

raw = parser.from_file("///Users/Documents/Textos/Texto1.pdf")
raw = str(raw)

safe_text = raw.encode('utf-8', errors='ignore')

safe_text = str(safe_text).replace("\n", "").replace("\\", "")
print('--- safe text ---' )
print( safe_text )
erfelipe
sumber
3
terima kasih khusus untuk.encode('utf-8', errors='ignore')
Evgeny
AttributeError: module 'os' tidak memiliki atribut 'setsid'
keramat
7

Kode di bawah ini adalah solusi untuk pertanyaan dengan Python 3 . Sebelum menjalankan kode, pastikan Anda telah menginstal PyPDF2perpustakaan di lingkungan Anda. Jika tidak diinstal, buka prompt perintah dan jalankan perintah berikut:

pip3 install PyPDF2

Kode Solusi:

import PyPDF2
pdfFileObject = open('sample.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObject)
count = pdfReader.numPages
for i in range(count):
    page = pdfReader.getPage(i)
    print(page.extractText())
Steffi Keran Rani J
sumber
2
Bagaimana Anda menyimpan semua konten dalam satu file teks dan menggunakannya untuk analisis lebih lanjut
Rahul Agarwal
7
Ini tidak menyelesaikan masalah yang disebutkan dalam pertanyaan aktual.
Soumik Rakshit
7

PyPDF2 dalam beberapa kasus mengabaikan spasi putih dan membuat hasil teks berantakan, tapi saya menggunakan PyMuPDF dan saya sangat puas Anda dapat menggunakan tautan ini untuk info lebih lanjut

ehsaneha
sumber
pymupdf adalah solusi terbaik yang saya amati, tidak memerlukan perpustakaan C ++ tambahan seperti pdftotext atau java seperti tika
Kay
pymypdf benar-benar solusi terbaik, tidak ada server atau pustaka tambahan, dan itu berfungsi dengan file di mana PyPDF2 PypDF3 PyPDF4 membuka kembali string teks yang kosong. terimakasih banyak!
Andrea Bisello
untuk menginstal pymupdf, jalankan pip install pymupdf==1.16.16. Menggunakan versi spesifik ini karena hari ini versi terbaru (17) tidak berfungsi. Saya memilih pymupdf karena mengekstrak bidang pembungkus teks di baris baru char \n. Jadi saya mengekstraksi teks dari pdf ke string dengan pymupdf dan kemudian saya gunakan my_extracted_text.splitlines()untuk mendapatkan teks dipisah dalam garis, ke dalam daftar.
erickfis
PyMuPDF benar-benar mengejutkan. Terima kasih.
erfelipe
6

pdftotext adalah yang terbaik dan paling sederhana! pdftotext juga menyimpan struktur.

Saya mencoba PyPDF2, PDFMiner dan beberapa lainnya tetapi tidak ada yang memberikan hasil yang memuaskan.

Dharam
sumber
Pesan sebagai berikut saat memasang pdf2text Collecting PDFMiner (from pdf2text),, jadi saya tidak mengerti jawaban ini sekarang.
zhy
pdf2text dan pdftotext berbeda. Anda dapat menggunakan tautan dari jawabannya.
Dharam
BAIK. Itu agak membingungkan.
zhy
5

Anda dapat menggunakan PDFtoText https://github.com/jalan/pdftotext

PDF ke teks membuat lekukan format teks, tidak masalah jika Anda memiliki tabel.

Máxima Alekz
sumber
5

Multi-halaman pdf dapat diekstraksi sebagai teks pada hamparan tunggal alih-alih memberikan nomor halaman individual sebagai argumen menggunakan kode di bawah ini

import PyPDF2
import collections
pdf_file = open('samples.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
c = collections.Counter(range(number_of_pages))
for i in c:
   page = read_pdf.getPage(i)
   page_content = page.extractText()
   print page_content.encode('utf-8')
Yogi
sumber
Satu-satunya masalah di sini adalah isi halaman baru yang menimpa yang terakhir
Rahul Agarwal
3

Berikut ini adalah kode paling sederhana untuk mengekstraksi teks

kode:

# importing required modules
import PyPDF2

# creating a pdf file object
pdfFileObj = open('filename.pdf', 'rb')

# creating a pdf reader object
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

# printing number of pages in pdf file
print(pdfReader.numPages)

# creating a page object
pageObj = pdfReader.getPage(5)

# extracting text from page
print(pageObj.extractText())

# closing the pdf file object
pdfFileObj.close()
Infinity
sumber
Merekomendasikan 'tika'
Vineesh TP
2

Saya menemukan solusi di sini PDFLayoutTextStripper

Itu bagus karena bisa menjaga tata letak PDF asli .

Ini ditulis dalam Java tetapi saya telah menambahkan Gateway untuk mendukung Python.

Kode sampel:

from py4j.java_gateway import JavaGateway

gw = JavaGateway()
result = gw.entry_point.strip('samples/bus.pdf')

# result is a dict of {
#   'success': 'true' or 'false',
#   'payload': pdf file content if 'success' is 'true'
#   'error': error message if 'success' is 'false'
# }

print result['payload']

Contoh hasil dari PDFLayoutTextStripper : masukkan deskripsi gambar di sini

Anda dapat melihat lebih detail di sini Stripper dengan Python

Tho
sumber
2

Saya mendapat pekerjaan yang lebih baik daripada OCR dan untuk mempertahankan perataan halaman saat mengekstraksi teks dari PDF. Harus membantu:

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

text= convert_pdf_to_txt('test.pdf')
print(text)
Anit Chakraborty
sumber
Nb. Versi terbaru tidak lagi menggunakan codecarg . Saya memperbaikinya dengan menghapusnya yaitudevice = TextConverter(rsrcmgr, retstr, laparams=laparams)
atomh33ls
1

Untuk mengekstraksi Teks dari PDF, gunakan kode di bawah ini

import PyPDF2
pdfFileObj = open('mypdf.pdf', 'rb')

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

print(pdfReader.numPages)

pageObj = pdfReader.getPage(0)

a = pageObj.extractText()

print(a)
Elavarasan r
sumber
0

Saya menambahkan kode untuk mencapai ini: Ini berfungsi dengan baik untuk saya:

# This works in python 3
# required python packages
# tabula-py==1.0.0
# PyPDF2==1.26.0
# Pillow==4.0.0
# pdfminer.six==20170720

import os
import shutil
import warnings
from io import StringIO

import requests
import tabula
from PIL import Image
from PyPDF2 import PdfFileWriter, PdfFileReader
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage

warnings.filterwarnings("ignore")


def download_file(url):
    local_filename = url.split('/')[-1]
    local_filename = local_filename.replace("%20", "_")
    r = requests.get(url, stream=True)
    print(r)
    with open(local_filename, 'wb') as f:
        shutil.copyfileobj(r.raw, f)

    return local_filename


class PDFExtractor():
    def __init__(self, url):
        self.url = url

    # Downloading File in local
    def break_pdf(self, filename, start_page=-1, end_page=-1):
        pdf_reader = PdfFileReader(open(filename, "rb"))
        # Reading each pdf one by one
        total_pages = pdf_reader.numPages
        if start_page == -1:
            start_page = 0
        elif start_page < 1 or start_page > total_pages:
            return "Start Page Selection Is Wrong"
        else:
            start_page = start_page - 1

        if end_page == -1:
            end_page = total_pages
        elif end_page < 1 or end_page > total_pages - 1:
            return "End Page Selection Is Wrong"
        else:
            end_page = end_page

        for i in range(start_page, end_page):
            output = PdfFileWriter()
            output.addPage(pdf_reader.getPage(i))
            with open(str(i + 1) + "_" + filename, "wb") as outputStream:
                output.write(outputStream)

    def extract_text_algo_1(self, file):
        pdf_reader = PdfFileReader(open(file, 'rb'))
        # creating a page object
        pageObj = pdf_reader.getPage(0)

        # extracting extract_text from page
        text = pageObj.extractText()
        text = text.replace("\n", "").replace("\t", "")
        return text

    def extract_text_algo_2(self, file):
        pdfResourceManager = PDFResourceManager()
        retstr = StringIO()
        la_params = LAParams()
        device = TextConverter(pdfResourceManager, retstr, codec='utf-8', laparams=la_params)
        fp = open(file, 'rb')
        interpreter = PDFPageInterpreter(pdfResourceManager, device)
        password = ""
        max_pages = 0
        caching = True
        page_num = set()

        for page in PDFPage.get_pages(fp, page_num, maxpages=max_pages, password=password, caching=caching,
                                      check_extractable=True):
            interpreter.process_page(page)

        text = retstr.getvalue()
        text = text.replace("\t", "").replace("\n", "")

        fp.close()
        device.close()
        retstr.close()
        return text

    def extract_text(self, file):
        text1 = self.extract_text_algo_1(file)
        text2 = self.extract_text_algo_2(file)

        if len(text2) > len(str(text1)):
            return text2
        else:
            return text1

    def extarct_table(self, file):

        # Read pdf into DataFrame
        try:
            df = tabula.read_pdf(file, output_format="csv")
        except:
            print("Error Reading Table")
            return

        print("\nPrinting Table Content: \n", df)
        print("\nDone Printing Table Content\n")

    def tiff_header_for_CCITT(self, width, height, img_size, CCITT_group=4):
        tiff_header_struct = '<' + '2s' + 'h' + 'l' + 'h' + 'hhll' * 8 + 'h'
        return struct.pack(tiff_header_struct,
                           b'II',  # Byte order indication: Little indian
                           42,  # Version number (always 42)
                           8,  # Offset to first IFD
                           8,  # Number of tags in IFD
                           256, 4, 1, width,  # ImageWidth, LONG, 1, width
                           257, 4, 1, height,  # ImageLength, LONG, 1, lenght
                           258, 3, 1, 1,  # BitsPerSample, SHORT, 1, 1
                           259, 3, 1, CCITT_group,  # Compression, SHORT, 1, 4 = CCITT Group 4 fax encoding
                           262, 3, 1, 0,  # Threshholding, SHORT, 1, 0 = WhiteIsZero
                           273, 4, 1, struct.calcsize(tiff_header_struct),  # StripOffsets, LONG, 1, len of header
                           278, 4, 1, height,  # RowsPerStrip, LONG, 1, lenght
                           279, 4, 1, img_size,  # StripByteCounts, LONG, 1, size of extract_image
                           0  # last IFD
                           )

    def extract_image(self, filename):
        number = 1
        pdf_reader = PdfFileReader(open(filename, 'rb'))

        for i in range(0, pdf_reader.numPages):

            page = pdf_reader.getPage(i)

            try:
                xObject = page['/Resources']['/XObject'].getObject()
            except:
                print("No XObject Found")
                return

            for obj in xObject:

                try:

                    if xObject[obj]['/Subtype'] == '/Image':
                        size = (xObject[obj]['/Width'], xObject[obj]['/Height'])
                        data = xObject[obj]._data
                        if xObject[obj]['/ColorSpace'] == '/DeviceRGB':
                            mode = "RGB"
                        else:
                            mode = "P"

                        image_name = filename.split(".")[0] + str(number)

                        print(xObject[obj]['/Filter'])

                        if xObject[obj]['/Filter'] == '/FlateDecode':
                            data = xObject[obj].getData()
                            img = Image.frombytes(mode, size, data)
                            img.save(image_name + "_Flate.png")
                            # save_to_s3(imagename + "_Flate.png")
                            print("Image_Saved")

                            number += 1
                        elif xObject[obj]['/Filter'] == '/DCTDecode':
                            img = open(image_name + "_DCT.jpg", "wb")
                            img.write(data)
                            # save_to_s3(imagename + "_DCT.jpg")
                            img.close()
                            number += 1
                        elif xObject[obj]['/Filter'] == '/JPXDecode':
                            img = open(image_name + "_JPX.jp2", "wb")
                            img.write(data)
                            # save_to_s3(imagename + "_JPX.jp2")
                            img.close()
                            number += 1
                        elif xObject[obj]['/Filter'] == '/CCITTFaxDecode':
                            if xObject[obj]['/DecodeParms']['/K'] == -1:
                                CCITT_group = 4
                            else:
                                CCITT_group = 3
                            width = xObject[obj]['/Width']
                            height = xObject[obj]['/Height']
                            data = xObject[obj]._data  # sorry, getData() does not work for CCITTFaxDecode
                            img_size = len(data)
                            tiff_header = self.tiff_header_for_CCITT(width, height, img_size, CCITT_group)
                            img_name = image_name + '_CCITT.tiff'
                            with open(img_name, 'wb') as img_file:
                                img_file.write(tiff_header + data)

                            # save_to_s3(img_name)
                            number += 1
                except:
                    continue

        return number

    def read_pages(self, start_page=-1, end_page=-1):

        # Downloading file locally
        downloaded_file = download_file(self.url)
        print(downloaded_file)

        # breaking PDF into number of pages in diff pdf files
        self.break_pdf(downloaded_file, start_page, end_page)

        # creating a pdf reader object
        pdf_reader = PdfFileReader(open(downloaded_file, 'rb'))

        # Reading each pdf one by one
        total_pages = pdf_reader.numPages

        if start_page == -1:
            start_page = 0
        elif start_page < 1 or start_page > total_pages:
            return "Start Page Selection Is Wrong"
        else:
            start_page = start_page - 1

        if end_page == -1:
            end_page = total_pages
        elif end_page < 1 or end_page > total_pages - 1:
            return "End Page Selection Is Wrong"
        else:
            end_page = end_page

        for i in range(start_page, end_page):
            # creating a page based filename
            file = str(i + 1) + "_" + downloaded_file

            print("\nStarting to Read Page: ", i + 1, "\n -----------===-------------")

            file_text = self.extract_text(file)
            print(file_text)
            self.extract_image(file)

            self.extarct_table(file)
            os.remove(file)
            print("Stopped Reading Page: ", i + 1, "\n -----------===-------------")

        os.remove(downloaded_file)


# I have tested on these 3 pdf files
# url = "http://s3.amazonaws.com/NLP_Project/Original_Documents/Healthcare-January-2017.pdf"
url = "http://s3.amazonaws.com/NLP_Project/Original_Documents/Sample_Test.pdf"
# url = "http://s3.amazonaws.com/NLP_Project/Original_Documents/Sazerac_FS_2017_06_30%20Annual.pdf"
# creating the instance of class
pdf_extractor = PDFExtractor(url)

# Getting desired data out
pdf_extractor.read_pages(15, 23)
Ritesh Shanker
sumber
0

Anda dapat mengunduh tika-app-xxx.jar (terbaru) dari sini .

Kemudian letakkan file .jar ini di folder yang sama dengan file skrip python Anda.

lalu masukkan kode berikut dalam skrip:

import os
import os.path

tika_dir=os.path.join(os.path.dirname(__file__),'<tika-app-xxx>.jar')

def extract_pdf(source_pdf:str,target_txt:str):
    os.system('java -jar '+tika_dir+' -t {} > {}'.format(source_pdf,target_txt))

Keuntungan dari metode ini:

lebih sedikit ketergantungan. File .jar tunggal lebih mudah untuk mengelola paket python itu.

dukungan multi-format. Posisi source_pdfdapat menjadi direktori dari segala jenis dokumen. (.doc, .html, .odt, dll.)

mutakhir. tika-app.jar selalu merilis lebih awal dari versi yang relevan dari paket python tika.

stabil. Ini jauh lebih stabil dan terawat dengan baik (Didukung oleh Apache) daripada PyPDF.

kerugian:

Diperlukan jre-headless.

pah8J
sumber
sama sekali bukan solusi pythonic. Jika Anda merekomendasikan ini, Anda harus membangun paket python dan minta orang mengimpornya. Jangan rekomendasikan menggunakan eksekusi baris perintah kode java di python.
Michael Tamillow
@MichaelTamillow, jika menulis kode yang akan diunggah ke pypi, saya akui itu bukan ide yang baik. Namun, jika itu hanya skrip python dengan shebang untuk penggunaan sementara, itu tidak buruk, bukan?
pah8J
Nah, pertanyaannya tidak berjudul "python" - jadi saya pikir menyatakan "inilah cara melakukannya di Jawa" lebih dapat diterima daripada ini. Secara teknis, Anda bisa melakukan apa pun yang Anda inginkan dengan Python. Itu sebabnya ini mengagumkan dan mengerikan. Penggunaan sementara adalah kebiasaan buruk.
Michael Tamillow
0

Jika Anda mencobanya di Anaconda pada Windows, PyPDF2 mungkin tidak menangani beberapa PDF dengan struktur non-standar atau karakter unicode. Saya sarankan menggunakan kode berikut jika Anda perlu membuka dan membaca banyak file pdf - teks semua file pdf dalam folder dengan jalur relatif .//pdfs//akan disimpan dalam daftar pdf_text_list.

from tika import parser
import glob

def read_pdf(filename):
    text = parser.from_file(filename)
    return(text)


all_files = glob.glob(".\\pdfs\\*.pdf")
pdf_text_list=[]
for i,file in enumerate(all_files):
    text=read_pdf(file)
    pdf_text_list.append(text['content'])

print(pdf_text_list)
DovaX
sumber
-1

PyPDF2 berfungsi, tetapi hasilnya dapat bervariasi. Saya melihat temuan yang tidak konsisten dari ekstraksi hasilnya.

reader=PyPDF2.pdf.PdfFileReader(self._path)
eachPageText=[]
for i in range(0,reader.getNumPages()):
    pageText=reader.getPage(i).extractText()
    print(pageText)
    eachPageText.append(pageText)
bmc
sumber