Files
compress/README.md
Dmitriy Fofanov eee9a4a093 Добавлены скрипты сборки для кроссплатформенных двоичных файлов и лицензия GPL.
- Добавлен файл LICENSE с лицензией GNU General Public License версии 3.0.
- Создан скрипт PowerShell (build-all.ps1) для сборки двоичных файлов Windows и Linux из Windows с использованием кросс-компиляции.
- Разработан скрипт сборки Linux (build-linux.sh) для сборки двоичных файлов Linux.
- Реализован скрипт PowerShell (build-windows.ps1) для сборки двоичных файлов Windows.
- Каждый скрипт сборки включает упаковку и генерацию контрольной суммы SHA256 для двоичных файлов.
2025-11-05 13:05:49 +03:00

307 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Universal File Compress
Высокопроизводительный инструмент на Go для массового сжатия PDF и изображений (JPEG/PNG) с удобным TUI-интерфейсом, гибкой конфигурацией и модульной архитектурой (Clean Architecture). Поддерживает выбор алгоритма сжатия (PDFCPU / UniPDF), параметрическое управление качеством, рекурсивную обработку директорий, параллельное выполнение, расширяемость через дополнительные компрессоры.
---
## Содержание
1. Обзор и ключевые особенности
2. Быстрый старт
3. Конфигурация (полный справочник)
4. Алгоритмы сжатия (PDFCPU vs UniPDF)
5. Сжатие изображений (JPEG / PNG)
6. Архитектура и внутреннее устройство
7. Поток обработки (Pipeline)
8. Параллельность и производительность
9. Логирование и мониторинг
10. Расширяемость (как добавить новый компрессор)
11. Сценарии использования и рекомендации
12. Устранение неполадок
13. План развития / Roadmap
14. Лицензия (если применимо)
---
## 1. Обзор и ключевые особенности
| Возможность | Описание |
|-------------|----------|
| Сжатие PDF | Алгоритмы PDFCPU (скорость) и UniPDF (качество) |
| Сжатие изображений | JPEG (1050% качество), PNG (адаптивная оптимизация) |
| Рекурсивная обработка | Поиск файлов во всех поддиректориях |
| Сохранение структуры | **Полное сохранение иерархии папок** в целевой директории |
| Параллельность | Несколько воркеров, управляемые через конфигурацию |
| Замена или сохранение | Перезапись оригиналов или вывод в целевую папку |
| Интеллектуальное сжатие | Автоматический выбор оригинала при неэффективном сжатии |
| TUI интерфейс | Настройка, запуск, мониторинг прогресса и логов |
| Логирование | В файл и/или на экран, ротация по размеру |
| Универсальная конфигурация | YAML + динамическая загрузка в рантайме |
| Расширяемость | Чистые интерфейсы для добавления новых компрессоров |
| Обработка ошибок | Повторы (retry), таймауты, агрегирование статистики |
---
## 2. Быстрый старт
### Установка из исходников
```bash
git clone https://github.com/your-username/compress.git
cd compress
go mod tidy
go build -o compress cmd/main.go
./compress # (Windows: compress.exe)
```
### Минимальный сценарий
1. Поместите файлы в директорию `./pdfs` (или измените путь в `config.yaml`).
2. Запустите программу.
3. В TUI выберите «Конфигурация», настройте параметры.
4. Сохраните и запустите обработку.
5. Результаты появятся в выбранной целевой директории или заменят оригиналы.
---
## 3. Конфигурация (config.yaml)
```yaml
scanner:
source_directory: "./pdfs" # Папка с исходными файлами
target_directory: "./compressed" # Если пусто и replace_original=true — замена
replace_original: false # true — перезаписывать исходники
compression:
level: 50 # Общий уровень (1090) влияет на стратегию
algorithm: "pdfcpu" # pdfcpu | unipdf
auto_start: false # Автозапуск при старте приложения
unipdf_license_key: "" # Ключ для UniPDF (опционально)
# Сжатие изображений
enable_jpeg: true # Включить JPEG
enable_png: true # Включить PNG
jpeg_quality: 30 # 1050 (шаг 5)
png_quality: 25 # 1050 (шаг 5)
processing:
parallel_workers: 2 # Количество воркеров
timeout_seconds: 30 # Таймаут на файл
retry_attempts: 3 # Повторы при падениях
output:
log_level: "info" # debug|info|warning|error
progress_bar: true
log_to_file: true
log_file_name: "compress.log"
log_max_size_mb: 10
```
### Валидация параметров
| Параметр | Диапазон | Ошибка при нарушении |
|----------|----------|----------------------|
| compression.level | 1090 | ErrInvalidCompressionLevel |
| jpeg_quality | 1050 (шаг 5) | ErrInvalidJPEGQuality |
| png_quality | 1050 (шаг 5) | ErrInvalidPNGQuality |
---
## 4. Алгоритмы сжатия PDF
| Критерий | PDFCPU | UniPDF |
|----------|--------|--------|
| Основной фокус | Скорость | Максимальное сжатие |
| Сжатие изображений | Базовое | Продвинутое (перекодирование) |
| Скорость (относит.) | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| Степень сжатия | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Стабильность | Высокая | Высокая |
| Зависимости | Легковесный | Более тяжелая библиотека |
Рекомендации:
- Выберите PDFCPU, если: массовая обработка, преобладает текст, важна скорость.
- Выберите UniPDF, если: критичен размер, много изображений, важна агрессивная оптимизация.
Переключение: `compression.algorithm: "unipdf"`.
---
## 5. Сжатие изображений (JPEG / PNG)
### Поддерживаемые форматы
- JPEG: `.jpg`, `.jpeg`
- PNG: `.png`
### Параметры
| Параметр | Назначение |
|----------|------------|
| enable_jpeg | Включает проход по JPEG файлам |
| enable_png | Включает проход по PNG файлам |
| jpeg_quality | Управляет степенью перекодирования и масштабирования |
| png_quality | Управляет коэффициентом масштабирования и уровнем компрессии |
### Алгоритм JPEG (улучшенный с защитой от увеличения)
1. **Декодирование** исходного JPEG.
2. **Адаптивное масштабирование**: quality 10→50%, quality 50→90% размера.
3. **Консервативное качество**: маппинг 10→30, 30→55, 50→75 (вместо агрессивного 20-100).
4. **Кодирование во временный файл** с проверкой размера.
5. **Интеллектуальный выбор**:
- Если результат ≥95% от оригинала → копируется оригинал (без потери качества)
- Если результат меньше → используется сжатая версия
6. **Гарантия**: выходной файл никогда не будет больше исходного.
### Алгоритм PNG (улучшенный с защитой от увеличения)
1. **Декодирование** исходного PNG.
2. **Консервативное масштабирование**: quality 10→60%, quality 50→90% размера.
3. **Адаптивная обработка**: маленькие изображения (<400px) не изменяются в размерах.
4. **Кодирование во временный файл** с максимальным сжатием (`png.BestCompression`).
5. **Интеллектуальный выбор**:
- Если результат 95% от оригинала копируется оригинал
- Если результат меньше используется сжатая версия
6. **Гарантия**: выходной файл никогда не будет больше исходного.
**Важно**: PNG lossless формат. Для уже оптимизированных файлов алгоритм автоматически сохраняет оригинал, предотвращая увеличение размера.
---
## 6. Архитектура
Следует принципам Clean Architecture.
Слои:
- `domain` сущности, ошибки, интерфейсы (`Сompress`, `FileRepository`, `Logger`).
- `usecase` сценарии: `ProcessPDFsUseCase`, `CompressImageUseCase`, `ProcessAllFilesUseCase`.
- `infrastructure` реализации (компрессоры, файловый репозиторий, конфигурация, логирование).
- `presentation/tui` UI слой, отображение прогресса, ввод настроек.
- `cmd/main.go` композиция.
Преимущества: тестируемость, независимость от фреймворков, лёгкая замена реализаций.
---
## 7. Поток обработки (Pipeline)
1. Загрузка `config.yaml` через `config.Repository`.
2. Инициализация логирования и TUI.
3. Выбор реализации компрессора PDF.
4. Создание UseCases.
5. Пользователь подтверждает запуск (или auto_start).
6. Сканирование директорий фильтрация поддерживаемых файлов.
7. Постановка задач в воркеры.
8. Сжатие + повторы при сбоях.
9. Обновление прогресса через callback TUI.
10. Запись статистики, логов, замена/вывод файлов.
---
## 8. Параллельность и производительность
- Модель: пул воркеров (число `parallel_workers`).
- Ограничение таймаутом: `timeout_seconds`.
- Повторы: `retry_attempts` (экспоненциальную стратегию можно внедрить дополнительно).
- Потенциальные оптимизации: кэширование размеров, отложенное пересохранение, batch-операции.
---
## 9. Логирование и мониторинг
| Тип | Назначение |
|-----|------------|
| Console/TUI | Интерактивное наблюдение за процессом |
| File logger | История и аудит |
| Уровни | debug, info, warning, error, success |
Ротация по максимальному размеру (MB).
---
## 10. Расширяемость
### Добавление нового PDF компрессора
1. Создайте файл в `internal/infrastructure/compress/` (например, `myengine_compressor.go`).
2. Реализуйте интерфейс `PDFCompressor`.
3. Добавьте значение в конфигурацию (`compression.algorithm`).
4. Расширьте `main.go` switch.
### Добавление формата изображений
1. Дополните `IsImageFile` и `GetImageFormat`.
2. Реализуйте метод в `ImageCompressor`.
3. Добавьте поля в `AppCompressionConfig`, валидацию, TUI форму.
---
## 11. Сценарии и рекомендации
| Сценарий | Рекомендации |
|----------|--------------|
| Архивирование большого массива офисных PDF | PDFCPU + level 4060 |
| Максимальное уменьшение для рассылки | UniPDF + level 7085 |
| Много цветных сканов | UniPDF + включить сжатие JPEG 2535% |
| Оптимизация сайта (изображения + PDF) | PDFCPU + JPEG/PNG 30% |
| Быстрая предпрод. обработка | PDFCPU + low retries |
---
## 12. Устранение неполадок
| Проблема | Причина | Решение |
|----------|---------|---------|
| UniPDF ошибка лицензии | Нет ключа | Установите `UNIDOC_LICENSE_API_KEY` или в config |
| PNG вырос в размере | Уже оптимален | Повышайте качество или отключите PNG |
| Нет файлов найдено | Неверный путь | Проверьте `scanner.source_directory` |
| Высокая нагрузка CPU | Слишком много воркеров | Уменьшите `parallel_workers` |
| Медленно при больших изображениях | Масштабирование | Увеличьте качество или отключите уменьшение |
---
## 13. Тестирование
### Комплексное тестирование всех алгоритмов
Проект включает единый комплексный тест, который проверяет все основные алгоритмы и компоненты:
```powershell
# Запуск через скрипт (рекомендуется)
cd tests
.\run-tests.ps1
# Или вручную
cd tests
go build -o comprehensive_test.exe comprehensive.go
.\comprehensive_test.exe
```
### Покрытие тестами
Комплексный тест проверяет:
**Валидация конфигурации** (5 тестов)
- Корректность настроек JPEG/PNG качества
- Граничные значения (10-50%)
- Обнаружение невалидных параметров
**Сжатие JPEG** (4 теста)
- Различные уровни качества (10%, 30%, 50%)
- Защита от увеличения размера файла
**Сжатие PNG** (4 теста)
- Различные уровни качества
- Защита от увеличения размера файла
**Сжатие PDF** (1 тест)
- Алгоритм PDFCPU
**Структура папок** (1 тест)
- Сохранение иерархии при обработке
**Вычисления** (3 теста)
- Коэффициент сжатия
- Экономия места
**Результаты:** Автоматический отчёт с детальной статистикой, время выполнения каждого теста, коды возврата для CI/CD.
Подробности: [tests/README.md](tests/README.md)
---
## 14. План развития (Roadmap)
- [ ] Поддержка WebP / AVIF
- [ ] Асинхронное журналирование с буферизацией
- [ ] REST API слой / gRPC
- [ ] Пакетный режим без TUI (`--headless`)
- [ ] Экспорт отчётов (JSON / HTML)
- [ ] Более точные эвристики выбора стратегии сжатия
- [ ] Плагинная система компрессоров
- [x] Комплексное тестирование всех алгоритмов
---
## 15. Лицензия
---
## Приложение A. Пример расширенного запуска
```bash
PDF_CONFIG=./config.yaml ./compress
```
## Приложение B. Метрики качества (пример)
| Показатель | PDFCPU (сред.) | UniPDF (сред.) |
|------------|----------------|----------------|
| Снижение размера | 3045% | 5070% |
| Время (100 файлов) | 1× | 23× |
| Ошибки повторной попытки | Низко | Низко |