Как извлечь текст из файла 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')?
PM 2Ring

2
Спасибо за ваш ответ. Я попробовал это с бинарным режимом, но ничего не изменилось
Simplicity

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

2
Этот PDF содержит символьную таблицу CMap, поэтому ограничения и обходные пути, обсуждаемые в этой теме, актуальны - stackoverflow.com/questions/4203414/… .
дварф

2
PDF действительно содержит правильный CMAP, поэтому преобразование специального преобразования символов в простой текст является тривиальным. Однако для получения правильного порядка текста требуется дополнительная обработка . Mac OS X Quartz PDF рендерер - неприятная работа! В исходном порядке рендеринга я получаю "m T'h iuss iisn ga tosam fopllloew DalFo dnogc wthit eI eTutorial" ... Только после сортировки по координатам x я получаю гораздо более вероятный правильный результат: "Это образец PDF-документа, который я использую, чтобы следовать вместе с учебником ".
usr2564301

Ответы:


200

Я искал простое решение для использования для Python 3.x и Windows. Там , кажется, не будет поддержки со стороны Textract , что прискорбно, но если вы ищете простое решение для окон / питон 3 оформление покупок ТИКА пакета, действительно прямо вперед для чтения PDF - файлов.

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 слов из моего тестового счета. Так что в итоге я пошел с тика.
Stian

8
Человек я тебя люблю. Я не знаю, почему такой хороший ответ скрыт в StackOverflow. Все продолжают упоминать, что нам нужно использовать PyPDF2 или pdfminer, но они воняют. Я влюблен в
Тику

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 лямбда, я пробовал это, но произошла ошибка импорта для 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)
Куинн

Лучшая библиотека, которую я нашел для чтения pdf с использованием python, - это '
tika

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

30

После попытки textract (который, казалось, имел слишком много зависимостей) и pypdf2 (который не мог извлечь текст из pdf-файлов, с которыми я тестировал) и tika (который был слишком медленным), я в итоге использовал pdftotextиз xpdf (как уже предлагалось в другом ответе) и только что вызвал двоичный файл из 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 lambda и хотел использовать его из текущего каталога.

Кстати: для использования этого в лямбда-выражении вам нужно поместить бинарный файл и зависимость libstdc++.soв вашу лямбда-функцию. Мне лично нужно было скомпилировать xpdf. Поскольку инструкции для этого взорвут этот ответ, я разместил их в своем личном блоге .


4
Боже мой, это работает! Наконец, решение, которое извлекает текст в правильном порядке! Я хочу обнять тебя за этот ответ! (Или, если вам не нравятся объятия, вот вам виртуальный кофе / пиво / ...)
DonQuiKong

4
рад, что это помогло! Upvoting дает то же ощущение, что и обниматься, так что я в порядке!
Hansaplast

просто ... gr8 нестандартное мышление!
Шантану Патхак

10

Возможно, вы захотите использовать проверенный временем xPDF и производные инструменты для извлечения текста, так как pyPDF2, похоже, по-прежнему имеет различные проблемы с извлечением текста.

Длинный ответ заключается в том, что существует множество вариантов того, как текст кодируется внутри PDF, и что для этого может потребоваться расшифровка самой строки PDF, затем может потребоваться сопоставление с CMAP, а затем, возможно, потребуется проанализировать расстояние между словами и буквами и т. Д.

В случае, если PDF поврежден (то есть отображает правильный текст, но при копировании он дает мусор), и вам действительно нужно извлечь текст, тогда вы можете рассмотреть возможность преобразования PDF в изображение (используя ImageMagik ), а затем использовать Tesseract для получения текста из изображения используя OCR.


-1, потому что OP запрашивает чтение pdf в Python, и, хотя для python есть оболочка xpdf, она плохо поддерживается.
cduguet

9

Я пробовал много конвертеров Python PDF, и мне нравится обновлять этот обзор. Тика одна из лучших. Но 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' не имеет атрибута 'setsid'
keramat

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
Это не решает проблему, упомянутую в настоящем вопросе.
Soumik Rakshit

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 разные. Вы можете воспользоваться ссылкой из ответа.
Дхарам

ХОРОШО. Это немного сбивает с толку.
жо


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


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)

В северном направлении Последняя версия больше не использует 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.

стабильный. Он гораздо более стабилен и поддерживается (поддерживается Apache), чем PyPDF.

недостаток:

Jre-безголовый необходим.


совершенно не питонное решение. Если вы порекомендуете это, вы должны собрать пакет python и попросить людей его импортировать. Не рекомендуем использовать выполнение командной строки Java-кода в Python.
Майкл Тамиллоу

@MichaelTamillow, если я пишу код, который будет загружен в pypi, я признаю, что это не очень хорошая идея. Однако, если это просто скрипт на python с shebang для временного использования, это не плохо, не так ли?
pah8J

Ну, вопрос не озаглавлен "python" - поэтому я думаю, что утверждение "вот как это сделать на Java" более приемлемо, чем это. Технически, вы можете делать все, что захотите в Python. Вот почему это и потрясающе, и ужасно. Временное использование - вредная привычка.
Майкл Тамиллоу

0

Если вы попробуете это в Anaconda в Windows, PyPDF2 может не обрабатывать некоторые PDF-файлы с нестандартной структурой или символами Юникода. Я рекомендую использовать следующий код, если вам нужно открыть и прочитать много файлов 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.