Конечно, я улучшу скрипт, чтобы он более надежно искал главы или заголовки, используя несколько методов одновременно. Это повысит вероятность правильного обнаружения структуры документа.



```python
import streamlit as st
import os
import re
import tempfile
from PyPDF2 import PdfReader, PdfWriter
from io import BytesIO
import fitz  # PyMuPDF

# Настройка страницы
st.set_page_config(page_title="Advanced PDF Chapter Splitter", layout="wide")

def extract_toc_pypdf(pdf_reader):
    toc = []
    for page in range(len(pdf_reader.pages)):
        text = pdf_reader.pages[page].extract_text()
        lines = text.split('\n')
        for line in lines:
            if re.match(r'^(глава|раздел|часть|\d+\.)\s*\d*\.?\s*\D', line.lower()):
                toc.append((line.strip(), page))
    return toc

def extract_toc_pymupdf(pdf_path):
    doc = fitz.open(pdf_path)
    toc = []
    for page in range(len(doc)):
        page_obj = doc[page]
        blocks = page_obj.get_text("blocks")
        for block in blocks:
            text = block[4]
            if re.match(r'^(глава|раздел|часть|\d+\.)\s*\d*\.?\s*\D', text.lower()):
                toc.append((text.strip(), page))
    doc.close()
    return toc

def extract_toc_bookmarks(pdf_reader):
    def extract_bookmarks(bookmarks, parent_title=""):
        toc = []
        for item in bookmarks:
            if isinstance(item, list):
                toc.extend(extract_bookmarks(item, parent_title))
            else:
                title = item.get("/Title", "")
                page = pdf_reader.get_destination_page_number(item)
                if page is not None:
                    full_title = f"{parent_title} {title}".strip()
                    toc.append((full_title, page))
                toc.extend(extract_bookmarks(item.get("/First", []), full_title))
        return toc
    
    return extract_bookmarks(pdf_reader.outline)

def merge_toc(toc_list):
    merged_toc = []
    for toc in toc_list:
        for item in toc:
            if item not in merged_toc:
                merged_toc.append(item)
    return sorted(merged_toc, key=lambda x: x[1])

def split_pdf(input_file):
    with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_file:
        tmp_file.write(input_file.getvalue())
        tmp_file_path = tmp_file.name

    reader = PdfReader(tmp_file_path)
    
    toc_pypdf = extract_toc_pypdf(reader)
    toc_pymupdf = extract_toc_pymupdf(tmp_file_path)
    toc_bookmarks = extract_toc_bookmarks(reader)
    
    toc = merge_toc([toc_pypdf, toc_pymupdf, toc_bookmarks])
    
    if not toc:
        st.warning('Не удалось найти главы или разделы в документе.')
        return []

    chapters = []
    for i, (title, start_page) in enumerate(toc):
        writer = PdfWriter()
        end_page = toc[i+1][1] if i+1 < len(toc) else len(reader.pages)
        
        for page_num in range(start_page, end_page):
            writer.add_page(reader.pages[page_num])
        
        output_filename = f"{i+1}_{title}.pdf"
        
        output_bytes = BytesIO()
        writer.write(output_bytes)
        output_bytes.seek(0)
        
        chapters.append((title, output_bytes))
    
    os.unlink(tmp_file_path)
    return chapters

def main():
    st.title("Advanced PDF Chapter Splitter")

    uploaded_file = st.file_uploader("Выберите PDF файл", type="pdf")

    if uploaded_file is not None:
        st.write("Файл успешно загружен. Обрабатываем...")
        
        chapters = split_pdf(uploaded_file)
        
        if chapters:
            st.success("Документ успешно разделен на главы.")
            st.write("Список глав:")
            
            for i, (title, pdf_bytes) in enumerate(chapters, 1):
                col1, col2 = st.columns([3, 1])
                with col1:
                    st.write(f"{i}. {title}")
                with col2:
                    st.download_button(
                        label="Скачать",
                        data=pdf_bytes,
                        file_name=f"{i}_{title}.pdf",
                        mime="application/pdf"
                    )
        else:
            st.error("Не удалось разделить документ на главы.")

if __name__ == "__main__":
    main()

```

Этот улучшенный скрипт использует несколько методов для поиска глав и заголовков:

1. Анализ текста с помощью PyPDF2 (функция `extract_toc_pypdf`).
2. Анализ текста с использованием PyMuPDF (функция `extract_toc_pymupdf`).
3. Извлечение закладок из PDF (функция `extract_toc_bookmarks`).

Основные улучшения:

1. Используется более гибкое регулярное выражение для поиска заголовков. Теперь оно ищет строки, начинающиеся с "глава", "раздел", "часть" или числа с точкой, за которыми следует любой текст.

2. Добавлен метод извлечения оглавления с помощью PyMuPDF (библиотека fitz), который может быть более эффективным для некоторых типов PDF.

3. Добавлен метод извлечения закладок из PDF, что полезно для документов с правильно структурированным оглавлением.

4. Результаты всех методов объединяются с помощью функции `merge_toc`, которая удаляет дубликаты и сортирует заголовки по номеру страницы.

Чтобы использовать этот скрипт:

1. Установите необходимые библиотеки: `pip install streamlit PyPDF2 PyMuPDF`
2. Сохраните скрипт в файл, например `advanced_pdf_splitter.py`
3. Запустите скрипт командой: `streamlit run advanced_pdf_splitter.py`

Этот подход должен быть более надежным и работать с большим количеством различных форматов PDF-документов. Он сохраняет все преимущества предыдущей версии, такие как сохранение оригинального форматирования и изображений, а также удобный пользовательский интерфейс Streamlit. цель: нужно просто порезать пдф файл по главам или заголовкам(новым темам) не нужно ничего распознавать нужно максимально сохранить форматирование и картинки