PYTHON – wyciąganie danych z PDF

Business Case:

Otrzymujemy folder pełen plików PDF, które są bardzo podobne do siebie, jednak zawierają różne wartości np. kwoty do wpłaty. Naszym zadaniem jest wyciągnąć wartość kwoty do wpłaty oraz numer klienta z każdego pdfa i zapisać te dane do zbiorczego excela. Ponadto, nie z każdego pliku pdf mamy wykonać te operacje, tylko dla tych co mają „main” w nazwie.

Zasada działania algorytmu:

Wiedząc, że kwota do wpłaty jest wartością dziesiętną, pobieramy wszystkie wartości dziesiętne z pdf i zapisujemy do listy. W związku z tym że pdf-y są do siebie podobne, zawsze interesująca nas wartość będzie na n-tym miejscu w tej liście. Podobnie wyznaczamy numer klienta, tylko że są to wartości całkowitoliczbowe.

Importujemy biblioteki:

from tika import parser

import re

import pandas as pd

import os

import glob

Zapis ścieżek wszystkich plików z folderu do listy:

files = glob.glob("C:Users/pdfy/*.pdf")

Ograniczamy ścieżki plików do tych co mają „main” w nazwie:

l1=[k for k in files if 'main' in k]

Tworzymy puste listy:

lista_kwot=[]

lista_klient=[]

lista_bledow=[]

Tworzymy pętlę:

for element in l1:

    parsed_pdf = parser.from_file(element)  – przeksztalcenie pdfa do string

    x=re.findall("\d+\.\d+", parsed_pdf['content']) -zapis wszystkich wartości dziesiętnych ze string

    try:

        lista_kwot.append(x[28]) – zapis tej jednej interesującej nas wartości do listy (jest ona zawsze na 29. miejscu)

    except:

        lista_bledow.append(element) – zapis sciezki pliku do listy w razie wystąpienia bledu

    y=re.findall(r'\d+', parsed_pdf['content']) – zapis wszystkich wartosci całkowitych ze string

    try:

        lista_klient.append(x[3]) – zapis tej jednej interesującej nas wartości do listy (jest ona zawsze na 3. miejscu)

    except:

        lista_bledow.append(element)

Tworzymy końcowy dataframe:

df=pd.DataFrame()

df[‘kwota’]=lista_kwot

df['klient']=lista_klient

Zapisujemy do Excel:

excel_dir = 'C:/sciezka_do_zapisu/plik.xlsx'

df.to_excel(excel_dir)

Wyciąganie tekstu z określonej strony (np. drugiej):

from pypdf import PdfReader
import re
import pandas as pd
import os
import pandas as pd
import glob

file = glob.glob("sciezka/*.pdf")
reader = PdfReader(file)
page = reader.pages[1]
text = page.extract_text()
print(text)
s=text[0:5]