Как декодировать Base64 в PDF
- Вставьте строку в поле Base64 или data URI. Подойдёт полный URI
data:application/pdf;base64,…, а также переносы строк, кавычки вокруг, URL-safe Base64 (-и_) и отсутствующее дополнение=. Длинную строку, сохранённую в файле, откройте кнопкой Открыть файл .txt или перетащите файл в поле; всё, что больше 4 MB, декодируется без показа в текстовом поле. - Превью откроется под кнопками. Декодирование начинается сразу при вставке; снимите галочку На лету, если хотите нажимать Декодировать сами.
- Проверьте Имя файла. Сначала там
decoded, но имя берётся из параметраname=в data URI или из открытого текстового файла:invoice.pdf.b64.txtпревращается вinvoice.pdf. - Нажмите Скачать файл. Ссылка откройте его в новой вкладке под превью покажет тот же PDF в полный размер.
При открытии страницы загружен пример PDF, чтобы вы увидели, как выглядит рабочий результат, ещё до вставки своей строки.
Откуда берутся PDF в Base64
JSON не умеет передавать сырые байты, поэтому сервисы, которые возвращают документы через JSON API, отдают их строкой Base64, часто в поле с названием вроде content, document, file или label.
- Транспортные этикетки. API этикеток и логистики возвращают этикетку для печати в виде PDF в Base64. Тот же запрос, в зависимости от параметра формата, часто может выдать ZPL или PNG, так что поле «PDF» не всегда содержит PDF (см. таблицу ниже).
- Сервисы электронной подписи возвращают подписанный документ, а часто и отдельный сертификат аудита, в Base64 в ответе о завершении или в вебхуке.
- Электронные счета. XML-счета в формате UBL встраивают читаемую PDF-копию в элемент вроде
<cbc:EmbeddedDocumentBinaryObject mimeCode="application/pdf" filename="INV-1001.pdf">. Скопируйте текст между тегами; атрибутfilenameподскажет, что вписать в поле Имя файла. - Вложения писем. В исходном коде письма вложение PDF выглядит как MIME-часть с
Content-Transfer-Encoding: base64и строками по 76 символов. Вставьте только закодированный блок или откройте всё письмо в декодере EML, который перечисляет все вложения. Структура объясняется в статье Base64 в электронной почте. - Выгрузки из баз данных. Документы из столбцов BLOB часто выгружаются как текст.
encode(data, 'base64')в PostgreSQL иTO_BASE64()в MySQL и MariaDB вставляют перенос строки после каждых 76 символов; декодер их пропускает.
Если в JSON-ответе несколько закодированных полей, декодирование Base64 внутри JSON найдёт и декодирует их все сразу. Для обратной задачи, из файла PDF в строку, используйте PDF в Base64.
Что показывает превью
| Поле | Откуда берётся |
|---|---|
| Версия PDF | Из строки заголовка, например %PDF-1.7 |
| Страницы | Подсчёт объектов страниц в файле (см. ниже) |
| Заголовок | Заголовок из информации о документе, если он хранится простым текстом |
| Зашифрован | Появляется, если в файле есть словарь шифрования: пароль на открытие или только ограничения прав |
| SHA-256 | Хеш декодированных байтов. Сравните его с sha256sum invoice.pdf на стороне отправителя, чтобы доказать, что файл дошёл целым |
Превью рисует встроенный просмотрщик PDF браузера: он показывает декодированные байты из локального URL blob:. Chrome, Edge, Firefox и Safari на компьютере показывают PDF прямо на странице. Превью остаётся пустым, если браузер настроен скачивать PDF, а не открывать их (Chrome: «Настройки» → «Конфиденциальность и безопасность» → «Настройки сайтов» → «Дополнительные настройки контента» → «PDF-документы»; Firefox: «Настройки» → «Основные» → «Приложения» → «Portable Document Format»), а многие мобильные браузеры вообще не умеют показывать PDF внутри страницы. В таких случаях откройте его в новой вкладке или Скачать файл всё равно работают, а сведения над превью заполняются в любом случае.
Как считаются страницы
Чтобы посчитать страницы, инструмент не отрисовывает PDF. Он считает объекты страниц (/Type /Page) в первых 32 MB файла. Если их не видно, он читает запись /Count в дереве страниц, а если скрыта и она, показывает неизвестно. Две ситуации дают число, отличное от того, что покажет просмотрщик:
- Слишком много страниц. PDF, который редактировали, аннотировали или подписывали после создания, часто сохраняется инкрементально: изменённые страницы дописываются новыми объектами, а старые версии остаются в файле. В тестовом файле с 2 страницами и одной переписанной страницей счёт даёт 3.
- Неизвестно. Начиная с PDF 1.5 объекты можно упаковывать в сжатые потоки объектов, и тогда ни объекты страниц, ни дерево страниц нельзя прочитать без распаковки.
Если числа расходятся, верьте просмотрщику.
Если результат не PDF
Если декодированные байты оказались чем-то другим, над полями появится подсказка с найденным форматом, например «Похоже на HTML, а не на PDF.», и кнопка Скачать как .html. Начало Base64 часто объясняет, что произошло:
| Base64 начинается с | Что у вас |
|---|---|
JVBERi0 | PDF (%PDF-) |
SlZCRVJpMH | PDF, закодированный дважды: Base64 от JVBERi0… |
H4sI | Данные, сжатые gzip |
PCFET0NUWVBF, PCFkb2N0eXBl, PGh0bWw | HTML-страница, обычно страница ошибки или входа |
eyJ | JSON, часто сообщение об ошибке вроде {"error":… |
XlhB | Этикетка ZPL (^XA) для термопринтеров |
iVBORw0KGgo | Картинка PNG |
Для дважды закодированной строки или данных gzip инструмент покажет вторую подсказку с кнопкой Декодировать ещё раз, которая заменит ввод внутренним слоем; Назад вернёт то, что вы вставили. Для повреждённого или нераспознанного файла подсказка начинается со слов «Не похоже на PDF» и называет определённый тип, а расширение остаётся .pdf, чтобы можно было всё равно скачать байты и попробовать другую программу.
У ошибок до декодирования свои причины:
- Экранирование из сырого JSON, например
\/(так пишет слешиjson_encodeв PHP) или буквальный\nмежду строками, убирается автоматически. Если какое-то другое экранирование с\всё равно вызывает Недопустимый символ\, используйте починку Base64 или сначала разберите JSON и скопируйте значение. - Недопустимый символ
%означает, что строку закодировали для URL. Последовательности для+,/и=(%2B,%2F,%3D) исправляются автоматически; для всего остального сначала пропустите строку через URL-декодер. - PDF определяется, но ничего не показывает: обычно он обрезан. Заголовок цел, поэтому определение проходит, но конца файла, где лежит таблица перекрёстных ссылок, нет. Другие типичные причины разобраны в статье ошибки Base64.
Как декодировать Base64 в PDF в коде
Python, из JSON-ответа:
import base64, json
with open("response.json") as f:
b64 = json.load(f)["document"]
if b64.startswith("data:"):
b64 = b64.split(",", 1)[1]
pdf = base64.b64decode(b64)
if not pdf.startswith(b"%PDF-"):
raise ValueError(f"not a PDF, starts with {pdf[:16]!r}")
with open("document.pdf", "wb") as f:
f.write(pdf)
b64decode молча отбрасывает символы вне стандартного алфавита, поэтому URL-safe строка с - и _ без всякой ошибки декодируется в мусор. Для таких строк используйте base64.urlsafe_b64decode. Node.js принимает оба алфавита одним вызовом:
import { readFile, writeFile } from "node:fs/promises";
const { document } = JSON.parse(await readFile("response.json", "utf8"));
const pdf = Buffer.from(document.replace(/^data:[^,]*,/, ""), "base64");
if (pdf.toString("latin1", 0, 5) !== "%PDF-") throw new Error("not a PDF");
await writeFile("document.pdf", pdf);
В командной строке важен jq -r: без -r значение сохраняет кавычки, и base64 -d останавливается с ошибкой «invalid input».
jq -r '.document' response.json | base64 -d > document.pdf
Ключ document взят для примера: в вашем API поле может называться иначе. Больше приёмов в статьях Base64 в Python, Base64 в Node.js и Base64 в Bash.
Вопросы и ответы
Как превратить строку Base64 в файл PDF?
Вставьте строку в поле выше, проверьте превью и нажмите Скачать файл. Из JSON копируйте только значение между кавычками; префикс data:application/pdf;base64, и переносы строк можно оставить.
Почему декодированный PDF открывается как повреждённый или пустой?
Почти всегда строку обрезали (лимит длины строки в логе, столбец базы данных или ограничение при копировании), и конца файла не хватает. Полный PDF заканчивается на %%EOF; сравните декодированный размер с тем, что сообщает отправитель.
Можно ли посмотреть PDF с паролем?
Да. В сведениях будет Зашифрован: да, а встроенные просмотрщики Chrome и Firefox спросят пароль прямо в превью. Скачанный файл не меняется и открывается тем же паролем.
Почему инструмент пишет, что мой Base64 не PDF?
Декодированные байты не начинаются с %PDF-. Чаще всего API прислал страницу ошибки или JSON-сообщение вместо документа; предупреждение назовёт, что найдено, и предложит сохранить файл с этим расширением, чтобы его можно было прочитать.
Безопасно ли декодировать здесь конфиденциальный PDF?
PDF декодируется и показывается внутри браузера, а политика безопасности контента (CSP) страницы не даёт ей выполнять сетевые запросы, кроме счётчика просмотров Cloudflare. Можно даже отключиться от сети после загрузки страницы и продолжать работать.