История изменений

История обновлений PDF Утилиты. Данные подгружаются из changelog.md.

26.07.01
Текущая версия
34
Релизов
15.08.2025
Начало разработки
25.08.01
Первая версия

Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/).

Схема версий: `ГГ.ММ.НН`, где **ГГ** — год (25 = 2025), **ММ** — месяц, **НН** — порядковый номер правки в месяце.

Начало разработки: **15.08.2025**, версия **25.08.01**.

26.07.01

Fixed

  • Split больше не пишет рабочие файлы в системный `/tmp`: каталоги создаются в `uploads/split/` и удаляются после ошибки, скачивания или по таймеру (и через `cleanup_files.py`).
  • Убрана загрузка шрифтов с Google Fonts: используются системные шрифты (нет ошибок в консоли при блокировке Google).

26.06.01

Added

  • Новая главная страница с плитками всех модулей и фильтрами по типу задач.

Changed

  • Обновлена навигация: быстрый доступ к основным операциям с PDF и выпадающий список всех инструментов; сжатие PDF вынесено на отдельный адрес.

Fixed

  • Исправлено отображение мега-меню, вёрстка главной на широких экранах и положение футера.

26.05.03

Added

  • Страница «История изменений» (`/changelog`): timeline-отображение changelog.md, навигация по версиям.
  • Автоматическое обновление версии в футере из `changelog.md` (парсер `app/utils/changelog_parser.py`).

Changed

  • Модуль «PDF → JPEG»: страница конвертации приведена к единому стилю с drag-and-drop и карточками.
  • Модуль «Удаление страниц из PDF»: страницы загрузки и выбора страниц приведены к единому стилю с модулем «Разделение PDF» (заголовок, карточки, drag-and-drop).
  • Модуль «JPEG/PNG → WebP»: полный редизайн интерфейса — breadcrumbs, карточки, drag-and-drop, пресеты качества, статистика сжатия.
  • Модули «Сжатие изображений» и «CSV → XLSX»: упрощение разметки, выравнивание под общий UI-kit.
  • Расширен `.gitignore`: bytecode и `__pycache__` на всех уровнях, venv, coverage, uploads, SSL-ключи, резервные копии; ранее отслеживаемые артефакты сняты с индекса Git.

Fixed

  • Image to PDF: при загрузке файлов с не-ASCII именем (например кириллица) `secure_filename` обрезал основу имени и точку расширения; файл сохранялся без `.png`/`.jpg`, и конвертер отклонял его как неподдерживаемый формат. Расширение теперь берётся из исходного имени; для файлов без суффикса добавлено определение формата по содержимому через Pillow.

26.05.02

Changed

  • Проект перенесён с prod-сервера в Git-репозиторий; удалены артефакты среды выполнения (кэш, venv, uploads, SSL-ключи).
  • Image to PDF: уникальные имена загружаемых файлов через UUID; улучшена обработка расширений.

Fixed

  • Image to PDF: корректная работа с кириллическими именами файлов (доработано в 26.05.03).

26.05.01

Added

  • Тесты для модуля Image to PDF: кириллические имена, определение формата, роут `/image-to-pdf/convert`.
  • Интеграционные и unit-тесты для PDF Crop Export (загрузка, экспорт JPEG, формула points→cm).

Changed

  • Обновлены зависимости pytest до 7.4.3, добавлен pytest-cov.

26.04.03

Added

  • Тесты `test_file_manager.py`: форматирование размера, метаданные файлов, очистка старых файлов.
  • Тесты `test_routes.py`: валидация PDF, сохранение/загрузка JSON temp data.
  • Фикстуры в `conftest.py`: app/client, генерация тестовых PDF.

26.04.02

Added

  • Эндпоинт `/health` — проверка директорий, Ghostscript, Tesseract, активных задач.
  • Эндпоинт `/status` — сводка по сервису (лимиты, уровни сжатия, очередь файлов).
  • Эндпоинт `/debug/tasks` — диагностика задач сжатия (только DEBUG).
  • Эндпоинт `/cleanup-temp` — ручная очистка временных файлов (только DEBUG).

26.04.01

Added

  • Flask-Limiter: rate limiting 200 запросов/день, 50/час; поддержка Redis через `REDIS_URL`.
  • Обработчики ошибок 404, 413, 500 на уровне приложения и blueprint.

Security

  • Лимит размера загрузки 200 МБ через `MAX_CONTENT_LENGTH`.
  • Автоматическое удаление загруженных и обработанных файлов через 1–2 часа.

26.03.03

Added

  • SSL-конфигурация для Gunicorn (`ssl/cert.pem`, `ssl/key.pem`).
  • Скрипт `setup-ssl.sh` для генерации самоподписанных сертификатов.
  • `ProxyFix` в `run.py` для корректной работы за reverse proxy.

Changed

  • Gunicorn: timeout 20 минут для больших PDF, preload_app, логи access/error.

26.03.02

Added

  • Документация `docs/INTEGRATION_GUIDE.md` — рекомендации по Celery, Redis, Prometheus, Sentry.

26.03.01

Added

  • Модуль PDF Crop Export (`/pdf-crop-export/`): интерактивная вырезка области одностраничного PDF в PNG/JPEG.
  • Настройка DPI (300–1200), калибровка px↔pt↔см, CSRF-защита сессии.
  • Клиентский JS `static/js/pdf_crop_export.js`.

26.02.03

Added

  • Модуль Визуальный редактор PDF (`/pdf-editor/`): превью страниц, drag-and-drop reorder, удаление, поворот 0/90/180/270°.
  • REST API: upload, reorder, delete-pages, rotate-pages, download.

26.02.02

Added

  • Модуль CSV → XLSX (`/csv-convert/`): конвертация CSV/TXT с автоопределением кодировки (chardet) и разделителя.
  • Нормализация колонок под доменную схему, конвертация дат UTC→Екатеринбург, стилизация Excel.
  • Утилита `app/utils/csv_converter.py`, клиентский JS `static/js/csv_convert.js`.

26.02.01

Added

  • Модуль JPEG/PNG → WebP (`/jpeg-to-webp`): пакетная конвертация до 20 файлов, пресеты качества, lossless, EXIF-ориентация.
  • Модуль HEIC → JPEG (`/heic-to-jpeg`): многоступенчатая конвертация через exiftool, heif-convert, ImageMagick, pillow-heif.
  • Утилиты `app/utils/image_converter.py`, `heic_converter.py`.
  • Условное отображение пунктов меню при успешном импорте blueprint (`image_convert_available`).

26.01.03

Added

  • Модуль Сжатие изображений (`/image-compress/`): пакетное сжатие JPG/PNG/WebP, уровни low/medium/high.
  • Скачивание по одному файлу или ZIP-архивом.
  • Утилита `app/utils/image_compressor.py`, клиентский JS `static/js/image_compress.js`.

26.01.02

Added

  • Модуль Image to PDF (`/image-to-pdf/`): объединение изображений в PDF.
  • Форматы JPG, PNG, TIFF, BMP, WebP; размеры страниц A4/A3/A5/Letter/Legal/Tabloid/auto.
  • Параметры fit-to-page, quality, orientation, margin.
  • Утилита `app/utils/image_to_pdf_converter.py`, клиентский JS `static/js/image_to_pdf.js`.

26.01.01

Added

  • Модуль PDF → DOCX (`/pdf-to-docx`): конвертация с OCR (Tesseract) и прямым извлечением текста.
  • Опции: язык OCR, сохранение форматирования, извлечение изображений, автоповорот, preview первых 3 страниц.
  • Шаблоны `pdf_to_docx.html`, `pdf_to_docx_preview.html`.

25.12.03

Added

  • Скрипт `cleanup_files.py` для периодической очистки старых uploads/compressed.
  • APScheduler в зависимостях (планировщик фоновых задач).

25.12.02

Added

  • Модуль PDF → JPEG (`/pdf-to-jpeg`): конвертация всех страниц PDF в JPEG (150 DPI, quality 90), упаковка в ZIP.
  • Утилита `app/utils/pdf_to_jpeg_converter.py` (PyMuPDF + Pillow).

25.12.01

Added

  • Документация: `docs/README.md`, `docs/INSTALL.md`, `docs/QUICKSTART.md`.
  • Скрипт `install.sh`: проверка Python 3.8+, Ghostscript, libmagic, Tesseract, HEIC-зависимостей, создание venv и `.env`.
  • Скрипт `setup_local.py` для локальной установки.
  • Скрипт `start.sh` для запуска через Gunicorn.

25.11.03

Added

  • Классы конфигурации `DevelopmentConfig`, `ProductionConfig`, `TestingConfig` в `config.py`.
  • Переменные окружения: `SECRET_KEY`, `FLASK_ENV`, `PORT`, `REDIS_URL`.
  • Gunicorn-конфигурация `gunicorn.conf.py`.

Changed

  • `run.py`: выбор конфига по `FLASK_ENV`, ротационное логирование в prod.

25.11.02

Changed

  • Единый UI-kit: Bootstrap 5, Font Awesome 6, шрифт Inter, тёмная тема.
  • Базовый шаблон `base.html`: навигация с dropdown-меню «Редактирование» и «Конвертация», breadcrumbs, flash-сообщения.
  • Стили `static/css/mystyle.css`, `static/css/style.css`.
  • Паттерн drag-and-drop для загрузки файлов на главной странице.

25.11.01

Added

  • Модуль Удаление страниц из PDF (`/rebuild/`): визуальный выбор страниц на превью (до 200 стр.), пересборка PDF.
  • Утилита `app/utils/pdf_rebuild.py`: `get_pdf_preview_info()`, `rebuild_pdf_without_pages()`.
  • Шаблоны `rebuild/rebuild.html`, `rebuild/editor.html`.

25.10.03

Added

  • Модуль Объединение PDF (`/merge/`): drag-and-drop сортировка 2–20 файлов, опции закладок и метаданных.
  • Утилита `app/utils/pdf_utils.py`: `merge_pdfs()`, `get_pdf_info()`.
  • Клиентский JS `static/js/merge.js`.

25.10.02

Added

  • Модуль Разделение PDF (`/split`): методы pages, ranges, single, bookmarks.
  • Анализ PDF перед разделением (`/split/analyze`), скачивание ZIP (`/split/download`).
  • Утилита `app/utils/pdf_splitter.py`: класс `PDFSplitter`, `split_pdf()`.
  • Шаблон `templates/split.html`.

25.10.01

Added

  • Модуль Удаление пустых страниц (`/remove-empty-pages`): анализ пикселей, настраиваемый порог (по умолчанию 99%).
  • Режим preview (только анализ) и полная очистка с отчётом.
  • Утилита `app/utils/pdf_cleaner.py`: `remove_empty_pages()`, `analyze_pdf_pages()`.

25.09.04

Added

  • Утилита `app/utils/file_manager.py`: метаданные файлов, коэффициент сжатия, отложенное удаление, очистка старых файлов.
  • Автоочистка uploads/compressed при загрузке главной страницы (файлы старше 6 часов).
  • Планирование удаления обработанных файлов через 2 часа.

Changed

  • Хранение состояния задач сжатия в JSON-файлах (`uploads/temp_data/`) вместо in-memory — устойчивость к перезапуску worker.

25.09.03

Added

  • Утилита `app/utils/pdf_analyzer.py`: анализ сложности PDF, оценка времени обработки, предупреждения пользователю.
  • Клиентский JS `static/js/progress.js`: класс `ProgressTracker` — upload → анализ → сжатие → download.

Changed

  • Двухэтапный процесс сжатия: сначала загрузка и анализ, затем выбор уровня и запуск задачи.

25.09.02

Added

  • Фоновое сжатие PDF в отдельном потоке (`threading.Thread`) с polling прогресса.
  • Эндпоинты `/set-compression-level`, `/progress/<task_id>`, `/download/<file_id>`.
  • Четыре уровня сжатия через Ghostscript: low, medium, high, maximum.

Changed

  • Утилита `app/utils/pdf_compressor.py`: `compress_pdf_with_progress()` с callback прогресса.

25.09.01

Added

  • Валидация PDF через python-magic (MIME `application/pdf`) и проверка заголовка `%PDF-`.
  • Эндпоинт `/upload` — загрузка и анализ PDF без немедленного сжатия.

25.08.04

Added

  • Drag-and-drop зона загрузки на главной странице.
  • Карточки выбора уровня сжатия с описанием скорости и степени сжатия.
  • Секции UI: initial → analysis → compression → result.
  • Клиентский JS `static/js/main.js`, `static/js/utils.js`.

Changed

  • Шаблон `templates/index.html`: адаптивный дизайн, Bootstrap 5.

25.08.03

Added

  • Утилита `app/utils/pdf_compressor.py`: базовое сжатие PDF через Ghostscript.
  • Утилита `app/utils/file_utils.py`: `allowed_file()`, `clean_temp_files()`.
  • Модуль `app/progress_tracker.py` (in-memory трекер, legacy).

25.08.02

Added

  • Blueprint `main` с маршрутом `/` — главная страница сжатия PDF.
  • Директории `uploads/`, `compressed/`, `logs/`.
  • Базовый шаблон `templates/base.html`, `templates/error.html`.

Changed

  • Структура проекта: `app/routes/`, `app/utils/`, `templates/`, `static/`.

25.08.01

Added

  • Инициализация проекта PDF Утилиты (Flask 3.x, Python 3.11+).
  • Фабрика приложений `create_app()` в `app/__init__.py`.
  • Точка входа `run.py`, конфигурация `config.py`.
  • Зависимости: Flask, Werkzeug, PyMuPDF, Pillow, Ghostscript, python-magic.
  • Базовое логирование (консоль в dev, файл в prod).