Формат HTML
HTML — текстовый файл с тегами, который браузер разбирает и раскладывает по ширине окна. Листа бумаги в нём нет: страницы появляются только в момент печати, и решает их движок, а не автор. Наш конвертер принимает .html и .htm весом до 10 МБ, отправляет файл в headless Chromium под именем index.html и печатает на A4 размером 8,27 × 11,69 дюйма с полями 0,4 дюйма со всех сторон. Фоновые заливки и картинки при этом печатаются, а не отбрасываются.
Коротко о цифрах
- Что принимаем
- .html и .htm, не больше 10 МБ
- Чем печатаем
- headless Chromium, файл уходит как index.html
- Лист
- A4 8,27 × 11,69 дюйма, поля 0,4 дюйма со всех сторон
- Фоны
- печатаются: printBackground включён на стороне сервера
- Проверка сигнатуры
- для HTML отключена — надёжных первых байт нет
- Частота обращений
- 10 за 10 минут, при очереди больше 5 — отказ «занято»
Почему у HTML нет своей ширины
Разметка говорит «это заголовок», «это абзац», «это таблица», но молчит о том, сколько сантиметров занимает строка. Ширину задаёт окно, а высоту — сколько получилось. Поэтому один и тот же файл на широком мониторе, на телефоне и на листе A4 выглядит по-разному, и это не поломка, а устройство формата.
Разрывы страниц возникают только при печати. Автор может подсказать движку через правила CSS для печати, но если он этого не сделал, движок разложит содержимое сам: длинная таблица разъедется по листам, а заголовок легко окажется последней строкой страницы. Ровно то же самое произойдёт и у нас, потому что печатает тот же самый Chromium.
Что именно делает наш конвертер
- Принимает только .html и .htm — файл с любым другим расширением отклоняется до загрузки на конвейер.
- Потолок 10 МБ, вдвое с половиной ниже, чем у офисных маршрутов: HTML такого веса — это уже документ со вшитыми в него картинками.
- Файл уходит в Gotenberg под именем index.html, независимо от того, как он назывался у вас.
- Лист A4 в книжной ориентации, поля по 0,4 дюйма — это примерно 10 мм, и сменить их в интерфейсе нельзя.
- Печать фонов включена: серые подложки таблиц и цветные шапки попадут в PDF, а не побелеют.
- Проверки содержимого по первым байтам для HTML нет — надёжной сигнатуры у формата не существует, в отличие от ZIP-контейнеров вроде DOCX.
- Ограничение частоты — десять обращений за десять минут, а при очереди больше пяти запросов сервер отвечает отказом «занято», а не копит их.
Почему в PDF пропали картинки и шрифты
Вы отправляете один файл, а не папку. Всё, на что HTML ссылается относительным путём — src="images/logo.png", href="style.css", локальный шрифт в @font-face, — на сервере просто не существует. Chromium честно не находит ресурс и рисует пустое место или подставляет запасной шрифт.
Лечится двумя способами. Либо все ссылки переводятся на абсолютные адреса по HTTPS, и тогда браузер конвертера скачает ресурс сам. Либо содержимое вшивается прямо в файл: стили в тег style, картинки в data:-адрес с кодировкой base64, шрифт туда же. Второй путь надёжнее, потому что не зависит от доступности чужого сервера в момент печати.
Порядок работы
- Соберите одностраничный файл: стили внутрь, картинки либо по абсолютным HTTPS-адресам, либо в base64.
- Проверьте вид заранее — откройте файл в браузере и нажмите печать: то, что покажет предпросмотр, вы и получите.
- Загрузите .html или .htm на конвертер и дождитесь ответа; на длинных документах это единицы секунд.
- Проверьте в готовом PDF таблицы на разрывах страниц — это первое место, где вёрстка расходится с ожиданием.
- Дальше документ обычный: его можно сжать, пронумеровать страницы, склеить с другими файлами.
Частые вопросы
Можно ли дать ссылку на сайт вместо файла?
Нет, конвертер принимает только загруженный файл. Сохраните страницу в браузере сочетанием клавиш для сохранения и выберите вариант «веб-страница полностью», а затем загрузите получившийся .html.
Почему PDF пришёл без картинок, хотя в браузере они видны?
В браузере файл лежал рядом со своей папкой ресурсов, а на сервер уехал только он один. Относительные пути там ведут в пустоту, поэтому переведите ссылки на абсолютные адреса или вшейте изображения прямо в разметку.
Почему в PDF макет уже, чем на экране?
Ширина листа фиксирована: A4 без полей по 0,4 дюйма с каждой стороны. Всё, что на мониторе занимало полторы тысячи точек, ужимается до этой ширины, а блоки с жёстко заданной шириной могут выйти за край.
Что будет, если переименовать в .html чужой файл?
Проверка расширения пропустит его, потому что содержимое HTML по первым байтам не опознаётся. Chromium отрисует то, что найдёт: у текстового файла получится страница исходника, у двоичного — набор нечитаемых символов.