Как декодировать Base64 в документ Word
- Вставьте Base64 в поле Base64 или data URI, с префиксом
data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,или без него. Длинную строку можно загрузить из текстового файла кнопкой Открыть файл .txt. - Под сведениями о файле в блоке Текст документа показано, что в нём написано: по строке на абзац, табуляции и ручные переносы строк сохранены.
- Под текстом список элементов показывает, из каких частей состоит .docx, с кнопками Открыть и Сохранить для каждой.
- Нажмите Скачать файл, чтобы сохранить .docx.
Превью читает word/document.xml XML-парсером вашего браузера. Ничего не отображается как веб-страница, ничего не выполняется, и файл никуда не отправляется: Content Security Policy страницы блокирует все сетевые запросы, кроме счётчика просмотров Cloudflare.
Что попадает в текстовое превью
DOCX по сути ZIP-архив с XML-файлами. Превью берёт текст основной части документа и не трогает остальную структуру, поэтому полезно знать, что куда попадает:
| В документе | В превью |
|---|---|
| Абзацы и заголовки основного текста | По строке на каждый, в порядке документа |
| Таблицы | Абзацы каждой ячейки на отдельных строках, построчно |
| Записанные исправления | Как будто приняты: вставленный текст виден, удалённый скрыт |
| Поля вроде номеров страниц или дат | Последний вычисленный результат; код поля скрыт |
| Надписи и фигуры | Их текст, иногда повторённый (см. вопросы и ответы) |
| Колонтитулы, сноски, примечания | Не в текстовом блоке; откройте нужный элемент кнопкой Открыть |
| Форматирование, картинки, разметка страницы | Не показываются |
Для документа, в котором только картинки или отсканированные страницы, выводится «В документе не найден текст».
Как вытащить картинки и другие части
Файл устроен как ZIP-архив, поэтому каждая часть доступна по отдельности. Картинки лежат в word/media/ как image1.png, image2.jpeg и так далее: Открыть показывает картинку, Сохранить скачивает её под собственным именем. Так можно быстро достать логотип или изображение подписи из сгенерированного документа, не открывая Word. Свойства документа в docProps/core.xml показывают автора, название и даты, записанные программой, которая сохранила файл.
Подробнее о списке элементов, его ограничениях и проверках архива рассказано на странице Base64 в ZIP.
DOCX, DOC или что-то другое
По началу Base64 видно, что за файл перед вами:
| Base64 начинается с | Файл | Что делает инструмент |
|---|---|---|
UEsDBBQABgAI | DOCX, сохранённый Microsoft Word | Текстовое превью и список элементов |
UEsDB и другие символы | DOCX из других программ (LibreOffice пишет UEsDBBQACAgI) или другой файл на основе ZIP | Ищет элементы word/, чтобы решить |
0M8R4KGxGuE | Старый .doc (Word 97–2003) или .docx под паролем | Пишет «Не похоже на DOCX» с типом DOC/XLS/MSG (OLE) |
e1xydGYx | RTF ({\rtf1) | Сообщает, что это похоже на RTF, и предлагает Скачать как .rtf |
JVBERi0 | Сообщает, что это похоже на PDF, и предлагает Скачать как .pdf |
Случай с OLE требует одного ручного шага. Инструмент не может отличить .doc от зашифрованного .docx, поэтому Расширение остаётся docx. Для старого файла Word впишите туда doc перед нажатием Скачать файл; для документа под паролем оставьте docx и откройте его в Word, введя пароль. Текстового превью нет ни в том, ни в другом случае.
Откуда берутся документы Word в Base64
Сервисы генерации документов и шаблонов заполняют .docx и возвращают его внутри JSON-ответа. Почтовые системы передают вложения Word как MIME-части в Base64; декодер EML открывает письмо целиком и показывает список вложений. Выгрузки из CRM и тикет-систем часто хранят вложения как текст Base64 рядом с записью. Чтобы получить такую строку из файла, используйте Word в Base64.
Декодировать DOCX и прочитать текст на Python
Стандартной библиотеки хватит, чтобы сохранить файл и вывести его абзацы примерно так же, как это делает превью:
import base64, io, zipfile
import xml.etree.ElementTree as ET
W = "{http://schemas.openxmlformats.org/wordprocessingml/2006/main}"
with open("memo.b64") as f:
docx = base64.b64decode(f.read())
with open("memo.docx", "wb") as f:
f.write(docx)
with zipfile.ZipFile(io.BytesIO(docx)) as z:
body = ET.fromstring(z.read("word/document.xml"))
for p in body.iter(W + "p"):
print("".join(t.text or "" for t in p.iter(W + "t")))
Как и превью, этот код читает только основную часть. Колонтитулы читайте так же из word/header1.xml. Как декодировать большие файлы по частям, описано в статье Base64 в Python.
Вопросы и ответы
Как конвертировать Base64 в документ Word?
Вставьте строку в поле выше и нажмите Скачать файл: результат сохранится как decoded.docx или под именем из data URI. При желании сначала переименуйте его в поле Имя файла.
Можно отредактировать документ на этой странице?
Нет. Страница показывает текст, чтобы его можно было прочитать, а скачивается исходный файл байт в байт. Редактируйте его в Word, LibreOffice Writer или любой другой программе, которая открывает .docx.
Почему текст надписи выводится дважды?
Word сохраняет каждую надпись в двух видах (современном и запасном для старых программ), а превью читает текст обоих. В самом документе надпись одна.
Где колонтитулы и примечания?
Они лежат в отдельных частях файла (word/header1.xml, word/footer1.xml, word/comments.xml). Нажмите Открыть рядом с нужной частью в списке элементов, чтобы прочитать её XML; текст находится в элементах <w:t>.