Формат DOC (Word 97–2003)
Файл .doc начинается с байтов D0 CF 11 E0 A1 B1 1A E1 — это сигнатура составного документа OLE, микрофайловой системы внутри одного файла. Ни архиватор, ни текстовый редактор ничего внятного оттуда не достанут. Наш конвертер такие файлы отклоняет намеренно: сервер видит расширение .doc и отвечает сообщением «Старый формат Office не поддерживается. Сохраните файл как .docx, .xlsx или .pptx и попробуйте снова».
Коротко о цифрах
- Первые байты
- D0 CF 11 E0 A1 B1 1A E1 — составной файл OLE
- Ответ сервера
- код LEGACY_FORMAT_NOT_SUPPORTED, статус 400
- Когда срабатывает отказ
- до конвертации, по концу имени файла
- Та же сигнатура
- у .xls и .ppt — расширение решает, чем считать файл
- Что принимает конвертер
- только .docx; список расширений маршрута закрыт
Почему это не «просто старая версия»
DOCX и DOC отличаются не годом выпуска, а принципом хранения. DOCX — ZIP с текстовыми XML внутри: любой язык программирования разберёт его стандартной библиотекой. DOC — двоичный дамп внутренних структур Word: потоки WordDocument, 1Table, Data, таблица форматирования с указателями на смещения. Формат задокументирован Microsoft отдельной спецификацией, но читать его без готовой библиотеки бессмысленно.
Отсюда и разница в живучести. У ZIP каждая запись имеет собственный заголовок, поэтому из побитого DOCX часто вытаскивается хотя бы текст. В DOC достаточно испортить таблицу смещений, чтобы файл перестал открываться целиком. И ещё одна известная особенность старого формата: при «быстром сохранении» Word дописывал изменения в конец файла, из-за чего внутри могли оставаться фрагменты уже удалённого текста.
Что происходит, когда вы грузите .doc к нам
- Окно выбора файла пропускает .doc — в списке принимаемых типов есть application/msword, так что файл выбирается и уходит на сервер.
- Сервер смотрит на конец имени. Проверка срабатывает на .doc, .xls и .ppt, и делает это раньше всех остальных.
- Ответ приходит с кодом LEGACY_FORMAT_NOT_SUPPORTED и статусом 400 — то есть отказ, а не сбой.
- На экране появляется готовая подсказка: сохранить как .docx и повторить. Конвертация при этом не запускалась, время не потрачено.
- Пересохраните файл и загрузите заново — дальше всё идёт обычным путём через LibreOffice на сервере.
Как пересохранить и что проверить
- Word: «Файл» → «Сохранить как» → тип «Документ Word (*.docx)». Режим совместимости в заголовке окна после этого пропадает.
- LibreOffice Writer: «Файл» → «Сохранить как» → «Word 2007-365 (.docx)», подтвердить выбор формата в диалоге.
- Google Документы: загрузить .doc на Диск, открыть, «Файл» → «Скачать» → «Microsoft Word (.docx)».
- После пересохранения проверьте старый WordArt и вставленные объекты — они перерисовываются новым движком и могут сместиться.
- Поля и автонумерацию пересчитайте вручную: значения, посчитанные в Word 2003, обновятся при первом же открытии.
Частые вопросы
Почему сайт не берёт .doc, если LibreOffice его открывает?
Потому что перед конвертацией мы проверяем первые байты на сигнатуру ZIP, а двоичный DOC её не имеет. Поддержка старых форматов в конвейере нестабильна, и внятный отказ с инструкцией полезнее, чем непредсказуемый результат.
Как понять, что у меня .doc, а не .docx?
Включите показ расширений в проводнике или посмотрите заголовок окна Word: у старого формата там написано «Режим ограниченной функциональности». Ещё вернее — открыть файл архиватором: DOCX откроется, DOC нет.
Что теряется при пересохранении в DOCX?
Текст, таблицы и картинки переносятся полностью. Смещаться могут вставленные OLE-объекты, старый WordArt и рамки, нарисованные средствами Word 2003, — их отрисовывает уже другой движок.
Файл всё-таки загрузился на сервер — он там остался?
Нет. Запрос отклоняется до начала конвертации, тело запроса не сохраняется на диск и во временную папку не попадает: отказ по расширению срабатывает раньше любой работы с файлом.