Як витягнути текст з PDF-файлу?


190

Я намагаюся витягнути текст, включений у цей PDF-файл, використовуючи Python.

Я використовую модуль PyPDF2 і маю такий сценарій:

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

Коли я запускаю код, я отримую такий вихід, який відрізняється від того, який міститься в документі PDF:

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

Як я можу витягнути текст як у документі PDF?


9
Я ніколи не використовував цей модуль, але чи має це значення, якщо ви відкриваєте файл у двійковому режимі pdf_file = open('sample.pdf', 'rb'):?
14:00 16

2
Спасибі за Вашу відповідь. Я спробував це з двійковим режимом, але нічого не змінилося
Простота

3
Скопіюйте текст, використовуючи хороший переглядач PDF - якщо це можливо, канонічний Reader Adobe Acrobat Adobe. Чи отримуєте ви такий самий результат? Різниця не в тому, що текст різний, але шрифт - коди символів відображають інші значення. Не всі PDF-файли містять правильні дані для відновлення цього.
usr2564301

2
Цей PDF містить символьну таблицю CMap, тому обмеження та робочі місця, що обговорюються в цій темі, є релевантними - stackoverflow.com/questions/4203414/… .
гномився

2
PDF дійсно містить правильний CMAP, тому тривіально конвертувати спеціальне відображення символів у звичайний текст. Однак для отримання правильного порядку тексту потрібна додаткова обробка . Quartz PDF-рендерінг Mac OS X - жахлива робота! У своєму первісному порядку візуалізації я отримую "m T'h iuss iisn ga tosam fopllloew DalFo dnogc wumithe ntht eI guide" ... Тільки після сортування за x координатами я отримую набагато більш імовірний правильний результат: "Це зразок PDF документа I Я використовую, щоб слідувати разом із підручником ".
usr2564301

Відповіді:


200

Я шукав просте рішення, яке використовувати для python 3.x та windows. Здається, не існує підтримки textract , що шкода, але якщо ви шукаєте просте рішення для Windows / python 3, оформити пакет tika , насправді прямо для читання pdfs.

Tika-Python - це прив'язка Python до послуг Apache Tika REST, що дозволяє виклику Tika вроджене в спільноті Python.

from tika import parser # pip install tika

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

Зауважте, що Tika написаний на Java, тому вам буде потрібно встановлення Java


17
Я перевірив pypdf2, tika і спробував і не зміг встановити textract і pdftotext. Pypdf2 повернув 99 слів, а Тіка повернув усі 858 слів з мого тестового рахунку. Тож я закінчився з тикою.
Стіан

8
Людина, яку я тебе люблю. Я не знаю, чому така гарна відповідь прихована в StackOverflow. Всі постійно згадують, що нам потрібно використовувати PyPDF2 або pdfminer, але вони смердять. Я зараз закоханий у
tika

15
Я постійно отримую помилку "RuntimeError: Не вдається запустити сервер Tika".
Nav

3
Відповідь я шукав все своє життя, чому ніхто більше не рекомендує Тіку? Дякую!
Яків-Ян Моссельман

4
Якщо вам потрібно запустити це на всіх PDF-файлах у каталозі (рекурсивно), скористайтеся цим сценарієм
Надія,

58

Використовуйте textract.

Він підтримує багато типів файлів, включаючи PDF

import textract
text = textract.process("path/to/file.extension")

24
Textwrap здається гарною обгорткою, але покладається на численні утиліти, що не належать Python, які можуть бути непросто доступними для даної системи.
Девід Браун

1
Працює для PDF-файлів, epubs тощо - обробляє PDF-файли, на яких навіть не працює PDFMiner.
Улад Касач

як його використовувати в aws lambda, я спробував це, але, помилка імпорту трапилася сюди textract
Арун Кумар,

5
textractє обгорткою для Poppler:pdftotext(серед інших).
onewhaleid

1
@ArunKumar: Щоб використовувати що-небудь у AWS Lambda, який не є вбудованим, ви повинні включити його та всі додаткові залежності у свій пакет.
Джефф Ліверман

51

Подивіться на цей код:

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')

Вихід:

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

Використовуючи той самий код, щоб прочитати pdf з 201308FCR.pdf . Вихід нормальний.

Його документація пояснює , чому:

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.
    """

@VineeshTP: Ви отримуєте щось для page_content? Якщо так, то подивіться, чи допомагає це, використовуючи інше кодування, ніж (utf-8)
Quinn

Найкраща бібліотека, яку я знайшов для читання PDF-файлу за допомогою python, - 'tika'
Vineesh TP

201308FCR.pdf не знайдено.
Чайтанья Бапат

30

Після спробу textract (який, здавалося, має занадто багато залежностей) і pypdf2 (який не міг витягнути текст із тестованих файлів pdfs) та tika (який був занадто повільним), я в кінцевому підсумку використовував pdftotextxpdf (як уже було запропоновано в іншій відповіді) і щойно викликує двійковий файл з python (можливо, вам знадобиться адаптувати шлях до 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')

Існує pdftotext, який в основному те саме, але це передбачає pdftotext в / usr / local / bin, тоді як я використовую це в лямбда AWS і хотів би використовувати його з поточного каталогу.

Btw: Щоб використовувати це на лямбда, вам потрібно включити двійкове та залежне значення libstdc++.soу свою функцію лямбда. Мені особисто потрібно було скласти xpdf. Оскільки інструкція до цього підірве цю відповідь, я розмістив їх у своєму особистому блозі .


4
Боже мій, це працює !! Нарешті, рішення, яке витягує текст у правильному порядку! Я хочу обійняти тебе за цю відповідь! (Або якщо вам не подобаються обійми, ось віртуальна кава / пиво / ...)
DonQuiKong

4
рада, що допомогло! Оновлення дає те саме відчуття, що і обійми, тож я добре!
hansaplast

просте ... gr8 з коробки мислення!
шантану патхак

10

Ви можете скористатися перевіреним часом xPDF та отриманими інструментами для отримання тексту замість цього, оскільки, здається, у pyPDF2 проблеми з вилученням тексту все ще виникають .

Довга відповідь полягає в тому, що існує велика кількість варіантів того, як текст кодується в PDF, і що він може вимагати розшифрування самого рядка PDF, потім може знадобитися зіставлення з CMAP, а потім може проаналізувати відстань між словами та літерами тощо

Якщо PDF-файл пошкоджений (тобто відображається правильний текст, але при його копіюванні він дає сміття) і вам дійсно потрібно витягнути текст, тоді ви можете розглянути можливість перетворення PDF у зображення (за допомогою ImageMagik ), а потім скористатися Tesseract, щоб отримати текст із зображення за допомогою OCR.


-1 тому, що ОП просить прочитати pdfs в Python, і хоча там є обгортка xpdf для python, вона погано підтримується.
cduguet

9

Я спробував багато PDF-перетворювачів Python, і мені подобається оновити цей огляд. Тіка - одна з найкращих. Але PyMuPDF - це хороша новина від користувача @ehsaneha.

Я зробив код, щоб порівняти їх у: https://github.com/erfelipe/PDFtextExtraction Я сподіваюся вам допомогти.

Tika-Python - це прив'язка Python до послуг Apache Tika REST, що дозволяє виклику Tika вроджене в спільноті 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 )

3
особлива подяка.encode('utf-8', errors='ignore')
Євгеній

AttributeError: модуль 'os' не має атрибута 'setid'
керамат

7

Нижче наведений код - це вирішення питання на Python 3 . Перш ніж запустити код, переконайтеся, що ви встановили PyPDF2бібліотеку у своєму оточенні. Якщо це не встановлено, відкрийте командний рядок і запустіть таку команду:

pip3 install PyPDF2

Код рішення:

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())

2
Як ви збережете весь вміст в одному текстовому файлі та використаєте його для подальшого аналізу
Рахул Агарвал

7
Це не вирішує проблеми, про яку йдеться у фактичному питанні.
Сумік Ракшит

6

PyPDF2 в деяких випадках ігнорує пробіли і робить результат результату безладним, але я використовую PyMuPDF і я дуже задоволений, що ви можете використовувати це посилання для отримання додаткової інформації


pymupdf - найкраще рішення, яке я спостерігав, не вимагає додаткових бібліотек C ++, таких як pdftotext або java, таких як tika
Kay

pymypdf - це справді найкраще рішення, без додаткових серверів чи бібліотек, і він працює з файлом, де PyPDF2 PypDF3 PyPDF4 отримує порожній рядок тексту. велике дякую!
Андреа Бізелло

встановити pymupdf, запустити pip install pymupdf==1.16.16. Використання цієї конкретної версії, оскільки сьогодні найновіша версія (17) не працює. Я вибрав pymupdf, оскільки він витягує поля для обгортання тексту у новому рядку char \n. Тому я витягую текст з pdf у рядок з pymupdf, а потім використовую, my_extracted_text.splitlines()щоб текст розділити на рядки, у список.
erickfis

PyMuPDF насправді дивував. Дякую.
erfelipe

6

pdftotext - найкращий і найпростіший! pdftotext також резервує структуру.

Я спробував PyPDF2, PDFMiner та кілька інших, але жоден з них не дав задовільного результату.


Під час встановлення pdf2text повідомте Collecting PDFMiner (from pdf2text)так, тож я зараз не розумію цієї відповіді.
жи

pdf2text і pdftotext різні. Ви можете використовувати посилання з відповіді.
Dharam

ГАРАЗД. Це трохи заплутано.
жи


5

Багатосторінковий PDF-файл може бути вилучений у вигляді тексту за один розтяг, замість того, щоб вказати окремий номер сторінки як аргумент, використовуючи код нижче

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')

Єдиною проблемою тут є зміст нової сторінки, яка перезаписує останню
Рахул Агарвал

3

Ось найпростіший код для вилучення тексту

код:

# 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()

Рекомендуюча 'tika'
Vineesh TP

2

Тут я знайшов рішення PDFLayoutTextStripper

Це добре, тому що може зберігати макет оригінального PDF .

Це написано на Java, але я додав шлюз для підтримки Python.

Приклад коду:

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']

Приклад виводу з PDFLayoutTextStripper : введіть тут опис зображення

Більше деталей ви можете побачити тут Stripper with Python


2

Я маю кращу роботу, ніж OCR, і підтримувати вирівнювання сторінки під час вилучення тексту з PDF. Слід допомогти:

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)

Nb. В останній версії більше не використовується codecarg . Я виправив це, видаливши його, тобтоdevice = TextConverter(rsrcmgr, retstr, laparams=laparams)
atomh33ls

1

Для вилучення тексту з PDF використовуйте код нижче

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

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

print(pdfReader.numPages)

pageObj = pdfReader.getPage(0)

a = pageObj.extractText()

print(a)

0

Я додаю код, щоб досягти цього: Для мене це добре:

# 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)

0

Ви можете завантажити tika-app-xxx.jar (останнє) звідси .

Потім помістіть цей .jar файл у ту саму папку вашого файлу сценарію python.

потім вставити наступний код у сценарій:

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))

Перевага цього способу:

менша залежність. Один .jar-файл легше керувати цим пакетом python.

багатоформатна підтримка. Позиція source_pdfможе бути каталогом будь-якого виду документа. (.doc, .html, .odt тощо)

сучасний. tika-app.jar завжди випускається раніше, ніж відповідна версія пакета tika python.

стійкий. Він набагато стабільніший і доглянутий (Powered від Apache), ніж PyPDF.

недолік:

Необхідний безголовий джер.


абсолютно не пітонічний розчин. Якщо ви рекомендуєте це, вам слід скласти пакунок python і дозволити людям це імпортувати. Не рекомендуйте використовувати виконання командного рядка коду java в python.
Майкл Таміллоу

@MichaelTamillow, якщо писати код, який буде завантажений у pypi, я визнаю, що це не дуже гарна ідея. Однак якщо це просто сценарій пітона з шебангом для тимчасового використання, це непогано, чи не так?
pah8J

Ну, питання не має під назвою "python" - тому я думаю, що твердження "ось як це зробити на Java" є більш прийнятним, ніж це. Технічно в Python ви можете робити все, що завгодно. Ось чому це і дивовижно, і страшно. Тимчасове використання - шкідлива звичка.
Michael Tamillow

0

Якщо ви спробуєте це в Anaconda в Windows, PyPDF2 може не обробляти деякі PDF-файли з нестандартною структурою або символами unicode. Я рекомендую використовувати наступний код, якщо вам потрібно відкрити та прочитати багато файлів pdf - текст усіх pdf-файлів у папці з відносним шляхом .//pdfs//зберігатиметься у списку 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)

-1

PyPDF2 працює, але результати можуть відрізнятися. Я бачу досить суперечливі висновки, отримані в результаті її отримання.

reader=PyPDF2.pdf.PdfFileReader(self._path)
eachPageText=[]
for i in range(0,reader.getNumPages()):
    pageText=reader.getPage(i).extractText()
    print(pageText)
    eachPageText.append(pageText)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.