Bir PDF dosyasından metin nasıl çıkarılır?


190

Kullanarak bu PDF dosyasında bulunan metni ayıklamak çalışıyorum Python.

PyPDF2 modülünü kullanıyorum ve aşağıdaki komut dosyasına sahibim :

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

Kodu çalıştırdığımda, PDF belgesinde bulunandan farklı aşağıdaki çıktıyı alıyorum:

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

PDF belgesinde olduğu gibi metni nasıl ayıklayabilirim?


9
Bu modülü hiç kullanmadım, ancak dosyayı ikili modda açarsanız bir fark yaratır pdf_file = open('sample.pdf', 'rb')mı?
PM 2Ring

2
Cevabın için teşekkürler. Bunu ikili modda denedim, ancak hiçbir şey değişmedi
Sadelik

3
Metni iyi bir PDF görüntüleyici kullanarak kopyalayın - mümkünse Adobe'nin standart Acrobat Reader'ı. Aynı sonucu mu alıyorsunuz? Fark, metnin farklı olması değil , yazı tipi - karakter kodlarının diğer değerlerle eşleşmesidir. Tüm PDF'ler bunu geri yüklemek için doğru verileri içermez.
usr2564301

2
PDF'nin bir karakter CMap tablosu içerdiğinden, bu iş parçacığında ele alınan kısıtlamalar ve geçici çözümler önemlidir - stackoverflow.com/questions/4203414/… .
dwarring

2
PDF gerçekten doğru bir CMAP içerir, bu nedenle geçici karakter eşlemesini düz metne dönüştürmek çok önemlidir. Ancak, metnin doğru sırasını almak ek işlem gerektirir . Mac OS X'in Quartz PDF oluşturucusu kötü bir iş! Orijinal oluşturma sırasında "m T'h iuss iisn ga tosam fopllloew DalFo dnogc ntht eI öğretici" ... Sadece x koordinatlarına göre sıraladıktan sonra çok daha doğru bir sonuç elde ederim: "Bu örnek bir PDF belgesi I öğretici ile birlikte takip etmek için kullanıyorum ".
usr2564301

Yanıtlar:


200

Python 3.x ve windows için kullanmak için basit bir çözüm arıyordu. Textract'tan destek yok gibi görünüyorTalihsiz olan , ancak windows / python 3 için basit bir çözüm arıyorsanız tika paketini okuyorsanız, pdf'leri okumak için gerçekten düz.

Tika-Python, Apache'nin Tika ™ REST hizmetlerine bağlanan bir Python olup, Tika'nın Python topluluğunda yerel olarak çağrılmasını sağlar.

from tika import parser # pip install tika

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

Tika'nın Java ile yazıldığından, Java çalışma zamanının yüklü olması gerektiğini unutmayın


17
Pypdf2, tika'yı test ettim ve textract ve pdftotext'i yüklemeyi denedim ve başarısız oldum. Pypdf2 99 kelime, tika test faturamdaki 858 kelimenin hepsini döndürdü. Böylece tika ile devam ettim.
Stian

8
Adamım seni seviyorum. Neden böyle iyi bir yanıt StackOverflow gizlidir bilmiyorum. Herkes PyPDF2 veya pdfminer kullanmamız gerektiğini söylüyor ama kokuyorlar. Şimdi tika aşığım
jxpython

15
"RuntimeError: Tika sunucusu başlatılamıyor" hatası alıyorum.
Nav

3
Yanıt Tüm hayatımı aradım, neden başka hiç kimse Tika'yı önermiyor? Teşekkürler!
Jacob-Jan Mosselman

4
Bunu bir dizindeki tüm PDF dosyalarında (yinelemeli olarak) çalıştırmanız gerekiyorsa, bu komut dosyasını alın
Hope

58

Textract kullanın.

PDF'ler dahil birçok dosya türünü destekler

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

24
Textwrap güzel bir sarıcı gibi görünüyor, ancak belirli bir sistemde kolayca bulunamayan çok sayıda Python olmayan yardımcı programa güveniyor.
David Brown

1
PDF'ler, epublar, vb. İçin çalışır - PDFMiner'ın bile başarısız olduğu PDF'leri işler.
Ulad Kasach

aws lambda nasıl kullanılır, bunu denedim ama textract fro ithalat hatası oluştu
Arun Kumar

5
textractPoppler:pdftotext(diğerleri arasında) için bir sarıcıdır .
onewhaleid

1
@ArunKumar: AWS Lambda'da yerleşik olmayan bir şey kullanmak için, onu ve tüm ekstra bağımlılıkları paketinize eklemeniz gerekir.
Jeff Learman

51

Şu koda bakın:

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

Çıktı:

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

201308FCR.pdf dosyasından bir pdf okumak için aynı kodu kullanın . Çıktı normaldir.

Onun belgeler açıklıyor:

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 için bir şey alıyor musunuz? Evetse, (utf-8) dışında farklı bir kodlama kullanarak yardımcı olup olmadığını görün
Quinn

Python kullanarak pdf okumak için bulduğum en iyi kütüphane 'tika'
Vineesh TP

201308FCR.pdf bulunamadı.
Chaitanya Bapat

30

Textract (çok fazla bağımlılığa sahip gibi görünüyordu) ve pypdf2 (test ettiğim pdfs'den metin çıkaramadı) ve tika'yı (çok yavaştı) pdftotextdenedikten sonra (başka bir cevapta zaten önerildiği gibi) xpdf kullanarak bitirdim ve doğrudan python'dan ikili olarak adlandırılır (pdftotext yolunu uyarlamanız gerekebilir):

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

Orada pdftotext temelde aynı işi yapar ama AWS lambda bu kullanarak ve geçerli dizinden kullanmak istedi am oysa bu pdftotext / usr / local / bin varsayar.

Btw: Bunu lambda'da kullanmak için ikili ve bağımlılığı libstdc++.solambda işlevinize koymanız gerekir . Şahsen xpdf derlemem gerekiyordu. Bunun için talimatlar bu cevabı havaya uçuracağından onları kişisel bloguma koydum .


4
Aman tanrım, işe yarıyor !! Son olarak, metni doğru sırada ayıklayan bir çözüm! Bu cevap için sana sarılmak istiyorum! (Ya da sarılmayı sevmiyorsanız, işte sanal bir kahve / bira / ...)
sarılmayı

4
yardımcı oldu sevindim! Upvoting sarılmakla aynı hissi veriyor, bu yüzden iyiyim!
hansaplast

basit ... kutudan düşünme gr8!
shantanu pathak

10

Metin çıkarmak için kanıtlanmış xPDF ve türetilmiş araçları kullanmak isteyebilirsiniz, çünkü pyPDF2 hala metin çıkarma ile ilgili çeşitli sorunlara sahip gibi görünüyor .

Uzun cevap, bir metnin PDF içinde nasıl kodlandığı ve PDF dizesinin kendisinin kodunun çözülmesi gerekebileceği, daha sonra CMAP ile eşleşmesi gerekebileceği, ardından kelimeler ve harfler arasındaki mesafeyi analiz etmesi gerekebileceğidir.

PDF'nin hasar görmesi (yani doğru metni görüntüleme ancak kopyalarken çöp verir) ve gerçekten metin çıkarmanız gerekiyorsa, PDF'yi görüntüye dönüştürmeyi düşünebilirsiniz ( ImageMagik kullanarak) ) ve ardından görüntüden metin almak için Tesseract'ı kullanmak isteyebilirsiniz. OCR kullanarak.


-1 çünkü Python pdfs okumak istiyor ve python için bir xpdf sarıcı olmasına rağmen kötü korunur.
cduguet

9

Birçok Python PDF dönüştürücüsünü denedim ve bu incelemeyi güncellemeyi seviyorum. Tika en iyilerinden biri. Ama PyMuPDF @ehsaneha kullanıcısı iyi bir haber.

Ben bunları karşılaştırmak için bir kod yaptım: https://github.com/erfelipe/PDFtextExtraction Sana yardım etmeyi umuyorum.

Tika-Python, Apache'nin Tika ™ REST hizmetlerine bağlanan bir Python olup, Tika'nın Python topluluğunda yerel olarak çağrılmasını sağlar.

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
için teşekkür ederiz.encode('utf-8', errors='ignore')
Evgeny

AttributeError: 'os' modülünün '
setsid

7

Aşağıdaki kod Python 3'teki soruya bir çözümdür . Kodu çalıştırmadan önce, PyPDF2kitaplığı ortamınıza yüklediğinizden emin olun . Yüklü değilse, komut istemini açın ve aşağıdaki komutu çalıştırın:

pip3 install PyPDF2

Çözüm Kodu:

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
Tüm içeriği bir metin dosyasına nasıl kaydeder ve daha fazla analiz için nasıl kullanırsınız
Rahul Agarwal

7
Bu, asıl soruda belirtilen sorunu çözmez.
Soumik Rakshit

6

PyPDF2 bazı durumlarda beyaz boşlukları yok sayar ve sonuç metnini dağınık hale getirir, ancak PyMuPDF kullanıyorum ve daha fazla bilgi için bu bağlantıyı kullanabileceğinizden gerçekten memnunum


pymupdf gözlemlediğim en iyi çözüm, pdftotext veya tika gibi java gibi ek C ++ kütüphaneleri gerektirmez
Kay

pymypdf gerçekten en iyi çözümdür, ek sunucu veya kitaplık yoktur ve PyPDF2 PypDF3 PyPDF4'ün boş metin dizesini yeniden elde ettiği dosya ile çalışır. çok teşekkürler!
Andrea Bisello

pymupdf yüklemek için çalıştırın pip install pymupdf==1.16.16. Bu sürümün kullanılması nedeniyle bugün en yeni sürüm (17) çalışmıyor. Ben yeni satır karakter metin kaydırma alanları ayıklar çünkü pymupdf seçti \n. Bu yüzden pymupdf ile bir dizeye pdf metin ayıklamak ve sonra bir my_extracted_text.splitlines()satır halinde metin, satırlara bölünmüş almak için kullanıyorum .
erickfis

PyMuPDF gerçekten şaşırtıcıydı. Teşekkürler.
erfelipe

6

pdftotext en iyi ve en basit olanıdır! pdftotext de yapıyı saklı tutar.

PyPDF2, PDFMiner ve diğer birkaçını denedim ama hiçbiri tatmin edici bir sonuç vermedi.


Pdf2text yüklerken aşağıdaki gibi mesaj Collecting PDFMiner (from pdf2text), bu yüzden şimdi bu cevabı anlamıyorum.
zhy

pdf2text ve pdftotext farklıdır. Cevaptan bağlantıyı kullanabilirsiniz.
Dharam

TAMAM. Bu biraz kafa karıştırıcı.
zhy


5

Çok sayfalı pdf, aşağıdaki kodu kullanarak bağımsız sayfa numarasını bağımsız değişken olarak vermek yerine tek seferde metin olarak çıkarılabilir

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

Buradaki tek sorun, yeni sayfanın içeriğinin
Rahul Agarwal

3

İşte metin ayıklamak için en basit kod

kod:

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

Tavsiye edilen 'tika'
Vineesh TP

2

Burada bir çözüm buldum PDFLayoutTextStripper

İyi çünkü orijinal PDF'in düzenini koruyabiliyor .

Java ile yazılmış ama Python'u desteklemek için bir Ağ Geçidi ekledim.

Basit kod:

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'dan örnek çıktı : resim açıklamasını buraya girin

Burada daha fazla ayrıntı görebilirsiniz Burada Python ile Striptizci


2

OCR'den daha iyi bir işim var ve PDF'den metin çıkarırken sayfa hizalamasını korumak için. Yardım olmalı:

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. En son sürüm artık codecarg değerini kullanmıyor . Yani kaldırarak bunu düzelttimdevice = TextConverter(rsrcmgr, retstr, laparams=laparams)
atomh33ls

1

PDF'den Metin çıkarmak için aşağıdaki kodu kullanın

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

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

print(pdfReader.numPages)

pageObj = pdfReader.getPage(0)

a = pageObj.extractText()

print(a)

0

Bunu başarmak için kod ekliyorum: Benim için iyi çalışıyor:

# 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

Sen den tika-app-xxx.jar (son) indirebilirsiniz İşte .

Sonra bu .jar dosyasını python komut dosyanızın aynı klasörüne koyun.

sonra betiğe aşağıdaki kodu ekleyin:

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

Bu yöntemin avantajı:

daha az bağımlılık. Tek bir .jar dosyasını bir python paketi yönetmek daha kolaydır.

çoklu format desteği. Konum source_pdfherhangi bir belgenin dizini olabilir. (.doc, .html, .odt vb.)

güncel. tika-app.jar her zaman tika python paketinin ilgili sürümünden önce yayınlanır.

kararlı. PyPDF'den çok daha kararlı ve bakımlı (Apache tarafından desteklenmektedir).

dezavantaj:

Bir baş dönmesi gerekir.


tamamen pitonik bir çözüm değil. Bunu tavsiye ederseniz, bir python paketi oluşturmalı ve insanların bunu içe aktarmasını sağlamalısınız. Python'da java kodunun komut satırı yürütmelerini kullanmanızı önermeyin.
Michael Tamillow

@ MichaelTamillow, pypi'ye yüklenecek bir kod yazıyorsanız, bunun iyi bir fikir olmadığını kabul ediyorum. Ancak, geçici kullanım için shebang ile sadece bir python betiği ise, kötü değil, değil mi?
pah8J

Peki, soru "python" ile başlıklı değil - bu yüzden "Java burada nasıl yapılacağını" belirtmek bundan daha kabul edilebilir olduğunu düşünüyorum. Teknik olarak, Python'da istediğinizi yapabilirsiniz. Bu yüzden hem müthiş hem de korkunç. Geçici kullanım kötü bir alışkanlıktır.
Michael Tamillow

0

Windows Anaconda'da denerseniz, PyPDF2 standart olmayan yapıya veya unicode karakterlere sahip bazı PDF'leri işlemeyebilir. Çok sayıda pdf dosyasını açmanız ve okumanız gerekirse aşağıdaki kodu kullanmanızı öneririm - göreceli yolu olan klasördeki tüm pdf dosyalarının metni .//pdfs//listede saklanır 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 çalışır, ancak sonuçlar değişebilir. Sonuç çıkarılmasından oldukça tutarsız bulgular görüyorum.

reader=PyPDF2.pdf.PdfFileReader(self._path)
eachPageText=[]
for i in range(0,reader.getNumPages()):
    pageText=reader.getPage(i).extractText()
    print(pageText)
    eachPageText.append(pageText)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.