Как конвертировать PDF в Base64
- Перетащите PDF в поле или выберите его через диалог. Можно сразу несколько файлов.
- Выберите формат в Формат вывода. На этой странице по умолчанию стоит Чистый Base64: именно его ждёт большинство API.
- Отмечайте Перенос по 76, только если строка пойдёт в «сырое» письмо MIME. Для JSON и HTML оставьте его выключенным.
- Нажмите Скопировать результат. Большой документ сохраните через Сохранить как .txt: получится файл
yourfile.pdf.b64.txt.
В строке с информацией видны имя файла, размер и MIME-тип, а счётчики ниже показывают размер в Base64 и накладные расходы. PDF читает ваш браузер, на сервер он не загружается: политика безопасности контента страницы вообще не позволяет ей отправлять никаких сетевых запросов, кроме счётчика просмотров Cloudflare.
Где используется PDF в Base64
JSON API. В JSON нельзя передать «сырые» байты, поэтому сервисы, которые принимают документы в теле запроса, берут их в Base64. Так устроены платформы электронной подписи, системы выставления счетов и бухгалтерии, сервисы OCR и разбора документов, а также модели ИИ, которые читают PDF. Имена полей в разных API разные, но структура обычно одна: имя файла, MIME-тип и строка Base64.
Модели ИИ для документов. Модели, которые читают PDF напрямую, обычно принимают файл так же: данные в Base64 плюс тип application/pdf, либо отдельными полями, либо одним data URI. Как правило, у них есть ограничения на размер файла и число страниц, так что длинные документы перед кодированием лучше разбить.
Почта. Вложения в письмах MIME кодируются в Base64 со строками не длиннее 76 символов. Если вы собираете сообщение вручную или тестируете SMTP-библиотеку, Перенос по 76 даст ровно тело такой части:
Content-Type: application/pdf; name="invoice.pdf"
Content-Disposition: attachment; filename="invoice.pdf"
Content-Transfer-Encoding: base64
JVBERi0xLjcKJeLjz9MK...
API для отправки почты, которые принимают JSON, наоборот, ждут вложение без переносов в отдельном поле. Подробнее в статье Base64 в электронной почте, а декодер EML извлечёт вложения из «сырого» письма.
Несколько PDF сразу. Перетащите пачку файлов и нажмите Скопировать всё как JSON, чтобы получить массив с объектом {name, type, size, data} для каждого документа. Это удобно для наполнения тестовой базы или массового импорта.
Ссылки на скачивание. Формат вывода HTML <a download> даёт ссылку, которая по клику сохраняет PDF:
<a href="data:application/pdf;base64,JVBERi0xLjcK..." download="invoice.pdf">invoice.pdf</a>
Это пригодится для HTML-отчётов в одном файле. Ссылка на data URI без download обычно не работает: Chrome блокирует переход на data: URL в окне верхнего уровня, если его инициировала страница, так что клик не открывает ничего или открывает пустую вкладку. Firefox делает исключение для PDF, поэтому ссылка может работать в одном браузере и не работать в другом.
Тестовые фикстуры. Небольшой PDF в виде константы Base64 позволяет юнит-тесту проверить загрузку или разбор без отдельного файла с фикстурой.
С чего начинается Base64 у PDF
Любой PDF начинается с %PDF- и номера версии, за которыми идёт перевод строки. В Base64 этот заголовок легко заметить:
| Заголовок файла | Base64 |
|---|---|
%PDF-1.4 + перевод строки | JVBERi0xLjQK |
%PDF-1.5 + перевод строки | JVBERi0xLjUK |
%PDF-1.7 + перевод строки | JVBERi0xLjcK |
%PDF-2.0 + перевод строки | JVBERi0yLjAK |
Если результат не начинается с JVBERi0, значит, выбран не PDF или перед заголовком есть мусор. Строка, которая начинается с PCFET0NUWVBF (<!DOCTYPE) или PGh0bWw (<html), содержит HTML; чаще всего это значит, что по ссылке на скачивание сохранилась страница с ошибкой, названная .pdf.
Насколько вырастает закодированный PDF
Base64 даёт 4 символа на каждые 3 байта, а перенос добавляет по переводу строки на каждые 76 символов:
| Размер PDF | Длина Base64 | С «Перенос по 76» |
|---|---|---|
| 100 КБ | 136 536 симв. | 138 332 симв. |
| 1 МБ | 1 398 104 симв. | 1 416 500 симв. |
| 5 МБ | 6 990 508 симв. | 7 082 488 симв. |
| 10 МБ | 13 981 016 симв. | 14 164 976 симв. |
| 25 МБ | 34 952 536 симв. | 35 412 437 симв. |
Размеры указаны в двоичных единицах (1 МБ = 1 048 576 байт). Сверяйте ограничение размера запроса в API с закодированным размером, а не с размером файла. Если API принимает ещё и загрузку multipart или предподписанный URL, этот путь обходится без накладных расходов и лучше подходит для документов в десятки мегабайт. Калькулятор размера посчитает это для любого размера.
Этот инструмент кодирует большие PDF в браузере, но не копирует в буфер обмена результат больше примерно 48 МБ. В таком случае используйте Сохранить как .txt.
Как закодировать PDF в коде
Python, сборка тела JSON:
import base64, json
from pathlib import Path
path = Path("invoice.pdf")
data = base64.b64encode(path.read_bytes()).decode("ascii")
body = json.dumps({"filename": path.name, "content": data})
Node.js:
import { readFile } from "node:fs/promises";
const b64 = (await readFile("invoice.pdf")).toString("base64");
const payload = JSON.stringify({ filename: "invoice.pdf", content: b64 });
Из командной строки с GNU coreutils и jq (-w 0 отключает перенос строк):
base64 -w 0 invoice.pdf > invoice.b64
jq -n --rawfile content invoice.b64 '{filename: "invoice.pdf", content: $content}'
Ключи filename и content условные; используйте имена из документации вашего API. Больше вариантов в статьях Base64 в Python и Base64 в Node.js.
Частые проблемы
- API говорит, что Base64 некорректный. Чаще всего в строку попал префикс
data:application/pdf;base64,, хотя API ждёт чистый Base64, или остались переводы строк отbase64без-w 0, отopenssl base64(переносит на 64) или от Перенос по 76. Некоторые API к тому же отвергают URL-safe Base64. - Декодированный PDF повреждён или пуст. Строку где-то обрезали: часто виноваты ограничение длины строки лога, слишком короткая колонка в базе данных или ячейка таблицы. Сравните длину с таблицей выше. PDF заканчивается на
%%EOF, и полная строка декодируется в байты с этим маркером в конце. - У вас PDF открывается, а получатель видит пустую страницу. Base64 документ не меняет, значит, дело в самом PDF: отсутствующие шрифты, необычная версия PDF или повреждённая таблица перекрёстных ссылок. Проверьте, декодировав строку в Base64 в PDF и открыв результат.
- Base64 не шифрует. Любой, у кого есть строка, может декодировать документ. Если PDF конфиденциальный, защищайте канал или шифруйте файл; см. кодирование и шифрование.
Вопросы и ответы
Как отправить PDF в JSON-запросе?
Закодируйте файл в чистый Base64 и положите строку в поле, которое ваш API отводит под содержимое файла; обычно оно идёт рядом с именем файла и MIME-типом application/pdf. Формат вывода JSON даёт готовый объект с name, type, size и data, который останется подогнать под API.
Можно ли конвертировать в Base64 PDF с паролем?
Да. Base64 работает с байтами, и шифрование PDF ему безразлично. Закодированный файл остаётся защищённым, и тому, кто его декодирует, всё равно понадобится пароль, чтобы его открыть.
Как узнать PDF, закодированный в Base64?
Он начинается с JVBERi0, то есть с закодированного %PDF-. Следующие символы показывают версию, например JVBERi0xLjc для PDF 1.7.
Почему ссылка на PDF в Base64 открывает пустую вкладку?
Chrome не даёт страницам переводить окно верхнего уровня на data: URL, другие браузеры тоже это ограничивают. Используйте формат вывода HTML <a download> (такая ссылка сохраняет файл, а не открывает его) или соберите Blob URL на JavaScript.
Сколько будет весить мой PDF в Base64?
Около 4/3 от размера файла: PDF в 3 МБ превращается примерно в 4 МБ текста. Точное значение показывает счётчик накладных расходов под результатом, а Base64 в PDF выполняет обратное преобразование.