|
import PyPDF2
|
|
from pathlib import Path
|
|
from datetime import datetime
|
|
import logging
|
|
import re
|
|
|
|
|
|
from .storage import add_document, load_dataframe, save_dataframe, DOC_COLUMNS
|
|
|
|
|
|
RAW_DATA_PATH = Path("data/raw")
|
|
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
|
|
|
def extract_text_from_pdf(pdf_path: Path) -> str | None:
|
|
"""
|
|
Verilen PDF dosyasının metin içeriğini çıkarır.
|
|
|
|
Args:
|
|
pdf_path (Path): PDF dosyasının yolu.
|
|
|
|
Returns:
|
|
str | None: Çıkarılan metin veya hata durumunda None.
|
|
"""
|
|
try:
|
|
with open(pdf_path, 'rb') as file:
|
|
reader = PyPDF2.PdfReader(file)
|
|
text = ""
|
|
for page in reader.pages:
|
|
page_text = page.extract_text()
|
|
if page_text:
|
|
text += page_text + "\n"
|
|
logging.info(f"Metin çıkarıldı: {pdf_path.name}")
|
|
return text
|
|
except Exception as e:
|
|
logging.error(f"PDF metni çıkarılırken hata ({pdf_path.name}): {e}")
|
|
|
|
if "password" in str(e).lower():
|
|
logging.warning(f"Dosya şifreli olabilir: {pdf_path.name}")
|
|
return None
|
|
|
|
def parse_date_from_filename(filename: str) -> datetime | None:
|
|
"""
|
|
Dosya adından YYYY-MM-DD veya YYYYMMDD formatında tarih ayrıştırmaya çalışır.
|
|
|
|
Args:
|
|
filename (str): Dosya adı.
|
|
|
|
Returns:
|
|
datetime | None: Bulunan tarih veya None.
|
|
"""
|
|
|
|
patterns = [
|
|
r"(\d{4}-\d{2}-\d{2})",
|
|
r"(\d{4}_\d{2}_\d{2})",
|
|
r"(\d{8})"
|
|
]
|
|
for pattern in patterns:
|
|
match = re.search(pattern, filename)
|
|
if match:
|
|
date_str = match.group(1).replace("_", "-")
|
|
try:
|
|
|
|
return datetime.strptime(date_str, '%Y-%m-%d').date()
|
|
except ValueError:
|
|
continue
|
|
logging.warning(f"Dosya adından geçerli tarih ayrıştırılamadı: {filename}")
|
|
return None
|
|
|
|
def process_raw_documents():
|
|
"""
|
|
'data/raw/' klasöründeki tüm PDF dosyalarını işler,
|
|
tarihlerini ayrıştırır ve sisteme ekler (eğer zaten ekli değillerse).
|
|
"""
|
|
if not RAW_DATA_PATH.exists():
|
|
logging.error(f"Ham veri klasörü bulunamadı: {RAW_DATA_PATH}")
|
|
return
|
|
|
|
logging.info(f"'{RAW_DATA_PATH}' klasöründeki PDF dosyaları işleniyor...")
|
|
processed_count = 0
|
|
added_count = 0
|
|
|
|
|
|
pdf_files = list(RAW_DATA_PATH.glob('*.pdf'))
|
|
|
|
if not pdf_files:
|
|
logging.warning(f"'{RAW_DATA_PATH}' klasöründe işlenecek PDF dosyası bulunamadı.")
|
|
return
|
|
|
|
for pdf_path in pdf_files:
|
|
processed_count += 1
|
|
filename = pdf_path.name
|
|
filepath_str = str(pdf_path.resolve())
|
|
|
|
|
|
publication_date = parse_date_from_filename(filename)
|
|
|
|
if publication_date:
|
|
|
|
|
|
doc_id = add_document(filepath_str, publication_date)
|
|
if doc_id:
|
|
|
|
|
|
|
|
pass
|
|
|
|
else:
|
|
logging.warning(f"'{filename}' için yayın tarihi bulunamadı, doküman eklenemedi.")
|
|
|
|
logging.info(f"Toplam {processed_count} PDF dosyası tarandı.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|