muryshev's picture
update
86c402d
raw
history blame
3.72 kB
"""
Модуль содержит класс для представления структуры документа.
"""
from dataclasses import dataclass, field
from typing import Any, Callable
from .parsed_formula import ParsedFormula
from .parsed_image import ParsedImage
from .parsed_meta import ParsedMeta
from .parsed_structure import ParsedStructure
from .parsed_table import ParsedTable
from .parsed_text_block import ParsedTextBlock
@dataclass
class ParsedDocument(ParsedStructure):
"""
Документ, полученный в результате парсинга.
"""
name: str = ""
type: str = ""
meta: ParsedMeta = field(default_factory=ParsedMeta)
paragraphs: list[ParsedTextBlock] = field(default_factory=list)
tables: list[ParsedTable] = field(default_factory=list)
images: list[ParsedImage] = field(default_factory=list)
formulas: list[ParsedFormula] = field(default_factory=list)
def to_string(self) -> str:
"""
Преобразует документ в строковое представление.
Returns:
str: Строковое представление документа.
"""
result = [f"Документ: {self.name} (тип: {self.type})"]
if self.paragraphs:
result.append("\nПараграфы:")
for p in self.paragraphs:
result.append(p.to_string())
if self.tables:
result.append("\nТаблицы:")
for t in self.tables:
result.append(t.to_string())
if self.images:
result.append("\nИзображения:")
for i in self.images:
result.append(i.to_string())
if self.formulas:
result.append("\nФормулы:")
for f in self.formulas:
result.append(f.to_string())
return "\n".join(result)
def apply(self, func: Callable[[str], str]) -> None:
"""
Применяет функцию ко всем строковым элементам документа.
Args:
func (Callable[[str], str]): Функция для применения к текстовым элементам.
"""
self.name = func(self.name)
self.type = func(self.type)
# Применяем к параграфам
for p in self.paragraphs:
p.apply(func)
# Применяем к таблицам
for t in self.tables:
t.apply(func)
# Применяем к изображениям
for i in self.images:
i.apply(func)
# Применяем к формулам
for f in self.formulas:
f.apply(func)
def to_dict(self) -> dict[str, Any]:
"""
Преобразует документ в словарь.
Returns:
dict[str, Any]: Словарное представление документа.
"""
# Преобразуем тип в строку, если это объект FileType
type_str = str(self.type) if not isinstance(self.type, str) else self.type
result = {
'name': self.name,
'type': type_str,
'meta': self.meta.to_dict(),
'paragraphs': [p.to_dict() for p in self.paragraphs],
'tables': [t.to_dict() for t in self.tables],
'images': [i.to_dict() for i in self.images],
'formulas': [f.to_dict() for f in self.formulas]
}
return result