Bir arkadaşımızın talebi üzerine hazırlamış olduğum küçük python scriptini burada da paylaşmak istedim. Bir pdf dosyasında yer alan metinleri belirli bir düzen içerisinde excel e aktarmak istiyordu. örnek pdf dosyası aşağıdaki gibidir. Bu şekilde sayfacalar metin resim vb. içerikten oluşuyor.
Şimdi burada amacımız Bk. ile başlayıp sıralı olmadan devam eden numaraları ve yanlarında bulunan metinleri bir excel e sütunlar halinde aktarmak. Bunun için python un pdfplumber, pandas ve re kütüphanelerini kullanacağız.
projemize bu kütüphaneleri ekleyerek kodumuza başlıyoruz.
import pdfplumber
import pandas as pd
import re
daha sonra pdf dosyamızın yolunu ve adını belirterek pdflumber ile açıp text olarak sonucu alıyoruz.
# PDF dosyasının yolunu belirtiyoruz.
pdf_path = "parsepdf.pdf"
# PDF dosyasını aç ve metni al
with pdfplumber.open(pdf_path) as pdf:
text = ""
for page in pdf.pages:
text += page.extract_text()
Şu an elimizde dağınık ve karmaşık bir metin kümesi oldu. Bunu aşlağıdaki kod ile Bk. ile başlayan metinlerden bir sonraki sayıları ve metinleri ayrı ayrı alacağımız hale getiriyoruz..
# Elimizde belirli bir düzeni ve kuralı olmayan metinler var bunların içerisinden ayıklama yapmak için
# kullanacağımız regular expression düzeni
pattern = r'Bk\. (\d+) (.+?)(?=\nBk\. \d+|\Z)'
matches = re.findall(pattern, text, re.DOTALL)
Verileri excel e aktaracağımızdan düzenleyerek DataFrame haline getiriyoruz.
<span style="background-color: inherit; color: inherit; font-family: inherit; font-size: var(--hcb-font-size,14px);"># Verileri pandas ile düzenliyoruz ve DataFrame'e dönüştürüyoruz. böylece daha düzgün bir tablo yapısı oluşacak.</span>data = {'Bk Numarası': [], 'İçerik Metin': []} for match in matches: bk_numarasi = match[0] bk_metni = match[1].strip() data['Bk Numarası'].append("Bk. " +bk_numarasi) data['İçerik Metin'].append(bk_metni) df = pd.DataFrame(data)
Artık elde ettiğimiz veriyi excel e aktarma zamanı
# Elde ettiğimiz DataFrame'i Excel dosyasına kaydediyoruz.
excel_output_path = "pdfparse.xlsx"
df.to_excel(excel_output_path, index=False)
Ve karşımızda excel dosyamız. Aşağıda da kodun tamamı mevcuttur.
import pdfplumber
import pandas as pd
import re
# PDF dosyasının yolunu belirtiyoruz.
pdf_path = "parsepdf.pdf"
# PDF dosyasını aç ve metni pdf içerisinden çıkar
with pdfplumber.open(pdf_path) as pdf:
text = ""
for page in pdf.pages:
text += page.extract_text()
# Elimizde belirli bir düzeni ve kuralı olmayan metinler var bunların içerisinden ayıklama yapmak için
# kullanacağımız regular expression düzeni
pattern = r'Bk\. (\d+) (.+?)(?=\nBk\. \d+|\Z)'
matches = re.findall(pattern, text, re.DOTALL)
# Verileri pandas ile düzenliyoruz ve DataFrame'e dönüştürüyoruz. böylece daha düzgün bir tablo yapısı oluşacak.
data = {'Bk Numarası': [], 'İçerik Metin': []}
for match in matches:
bk_numarasi = match[0]
bk_metni = match[1].strip()
data['Bk Numarası'].append("Bk. " +bk_numarasi)
data['İçerik Metin'].append(bk_metni)
df = pd.DataFrame(data)
# Elde ettiğimiz DataFrame'i Excel dosyasına kaydediyoruz.
excel_output_path = "pdfparse.xlsx"
df.to_excel(excel_output_path, index=False)

