| 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ı.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |