HTTP-сервис на Go для извлечения текста из файлов (pdf, docx, rtf, txt).
- POST
/extract— принимает JSON{ filename, content_base64 }, возвращает{ success, text }. - GET
/health— статус сервиса. - Поддерживаемые форматы:
.pdf,.docx,.rtf,.txt. - PDF обрабатывается через системный
pdftotext(Poppler). - DOCX распаковывается и читается напрямую из
word/document.xml. - RTF — упрощённый парсер с нормализацией пробелов/переносов.
- TXT — авто-детекция кодировок (Windows-1251, KOI8-R, ISO-8859-5, MacCyrillic, CP866) + нормализация переводов строк.
- Go 1.22+
- Для PDF: установленный
pdftotextиз состава Poppler (или Xpdf).
Используйте скрипт:
scripts/install_pdftotext.shСкрипт поддерживает macOS (brew), Ubuntu/Debian (apt), Fedora (dnf), RHEL/CentOS (yum/dnf), Arch (pacman), Alpine (apk), openSUSE/SLES (zypper). Если pdftotext уже установлен — скрипт завершится успешно.
Альтернативно, вручную:
- macOS:
brew install poppler - Ubuntu/Debian:
sudo apt-get install -y poppler-utils - Fedora:
sudo dnf install -y poppler-utils - Arch:
sudo pacman -S poppler - Alpine:
sudo apk add poppler-utils - openSUSE/SLES:
sudo zypper install -y poppler-tools
# из корня репо
go build ./...Порт задаётся флагом -port (по умолчанию 8080):
# старт на 8080
go run ./cmd/server
# кастомный порт
go run ./cmd/server -port 9090curl -s http://localhost:8080/health# "Hello, world!\n" в base64
curl -s -X POST http://localhost:8080/extract \
-H 'Content-Type: application/json' \
-d '{"filename":"sample.txt","content_base64":"SGVsbG8sIHdvcmxkIQo="}'Ответ:
{"success": true, "text": "Hello, world!\n"}# Перед вызовом убедитесь, что установлен pdftotext
curl -s -X POST http://localhost:8080/extract \
-H 'Content-Type: application/json' \
-d '{"filename":"doc.pdf","content_base64":"<BASE64_OF_PDF>"}'Если pdftotext не установлен, сервис вернёт:
{"success": false, "text": "exec: \"pdftotext\": executable file not found in $PATH"}curl -s -X POST http://localhost:8080/extract/batch \
-H 'Content-Type: application/json' \
-d '[
{"filename": "a.txt", "content_base64": "SGVsbG8h"},
{"filename": "b.rtf", "content_base64": "{\\rtf1...}"}
]'Ответ:
[
{"filename":"a.txt","success":true,"text":"Hello!"},
{"filename":"b.rtf","success":true,"text":"..."}
]- Успех:
{ "success": true, "text": "...извлечённый текст..." } - Ошибка:
{ "success": false, "text": "описание ошибки" }
- RTF-парсер реализован упрощённо (поддержка
\par,\line,\tab,\uN,\'hhи игнор некоторых destination-групп). Для нетипичных RTF возможны артефакты; присылайте образцы для улучшений. - TXT-детектор кодировки использует эвристику: выбирается лучшая из популярных кириллических кодировок, далее нормализация CRLF/CR→LF.