/
tsps
/
case_loader
Обзор
Документация
Войти
/
tsps
/
case_loader
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
app/services/pdf_parser.py
58 строк
2 KB
Василий Петров
[43] PdfParser
05 окт 2025, 23:13
05 окт 2025, 23:13
423c8e0
Код
Авторство
О чём код?
import pdfplumber from pathlib import Path from typing import Union import io class PdfParser: def parse(self, pdf_input: Union[str, Path, bytes]) -> str: """ Основной метод парсинга PDF. Args: pdf_input: путь к файлу (str/Path) или бинарные данные PDF (bytes) Returns: str: извлеченный текст из PDF Raises: FileNotFoundError: если указанный файл не существует ValueError: при ошибке парсинга PDF """ if isinstance(pdf_input, bytes): return self._parse_bytes(pdf_input) else: # Обработка пути к файлу file_path = Path(pdf_input) if not file_path.exists(): raise FileNotFoundError(f"PDF файл не найден: {file_path}") return self._parse_file(file_path) def _parse_file(self, file_path: Path) -> str: """Парсинг PDF из файла""" try: with pdfplumber.open(file_path) as pdf: return self._extract_text(pdf) except Exception as e: raise ValueError(f"Ошибка парсинга PDF файла: {str(e)}") def _parse_bytes(self, pdf_bytes: bytes) -> str: """Парсинг PDF из бинарных данных""" try: # Создаем файлоподобный объект из байтов pdf_file = io.BytesIO(pdf_bytes) with pdfplumber.open(pdf_file) as pdf: return self._extract_text(pdf) except Exception as e: raise ValueError(f"Ошибка парсинга PDF байтов: {str(e)}") def _extract_text(self, pdf) -> str: """Общая логика извлечения текста из открытого PDF""" text_parts = [] for page in pdf.pages: page_text = page.extract_text() if page_text: text_parts.append(page_text) return '\n\n'.join(text_parts)