jsPDF отлично подходит для легких экспортов из браузера
jsPDF популярен, потому что решает реальную продуктовую задачу: создать PDF в браузере без бэкенд-сервиса. Разработчик может нарисовать текст, линии, изображения и простые таблицы, а затем запустить скачивание с той же страницы. Для прототипов, небольших админок, локальных квитанций и офлайн-PWA это сильное соответствие.
Продуктовый вопрос в том, где эта браузерная граница перестает быть правильной. Когда PDF становится бизнес-документом, который клиент сканирует, архивирует, отправляет по электронной почте или передает в другую систему, работа уже не сводится к “нарисовать файл”. Это управление шрифтами, точность штрихкодов, стабильность на мобильных устройствах, детерминированный вывод и иногда упаковка PDF/A или электронного счета.
Тот же PDF-результат, другая продуктовая граница
С jsPDF ваше фронтенд-приложение становится рендерером. Каждая вкладка браузера должна держать библиотеку, пользовательские шрифты, промежуточные изображения, результат генерации штрихкодов и финальные PDF-байты. Счет за библиотеку остается нулевым, но эксплуатационная ответственность переносится на каждое устройство пользователя.
С gPdf браузер или бэкенд отправляет структурированный DocumentRequest либо запрос template_id + data. gPdf владеет средой рендера, встроенными шрифтами, геометрией штрихкодов и бинарной PDF-генерацией на edge. Приложение отвечает за данные и логику шаблонов, а не за PDF-движок.
Соответствие продукта: офлайн-экспорт против операционных документов
Выбирайте jsPDF, когда PDF — локальная удобная функция: небольшая кнопка экспорта, простой чек только с латиницей, снимок панели или PWA, которое должно работать без сети.
Выбирайте gPdf, когда PDF — часть операционного процесса: транспортные этикетки, складские ярлыки, счета, билеты, выписки, таможенные формы и трансграничные квитанции. Таким документам нужен одинаковый вывод на всех устройствах, а не то, что текущая вкладка браузера смогла безопасно собрать.
Ценовая модель: бесплатная библиотека против ответственности за эксплуатацию
У jsPDF очевидное ценовое преимущество: сама библиотека открытая, а CPU браузера не является строкой в вашем облачном счете. Для небольшой внутренней функции это может быть самый дешевый путь.
Стоимость боевой эксплуатации появляется вокруг библиотеки:
- CJK-совместимые файлы шрифтов или сгенерированные base64-модули шрифтов.
- Библиотеки кодирования и конвертации штрихкодов.
- Специфичные для браузеров ошибки памяти и скачивания.
- Печатный QA для сканеров и термопринтеров.
- Регрессионные тесты в десктопных браузерах, iOS Safari, Android WebView и встроенных браузерах.
gPdf превращает это в счет за использование. Публичный Basic начинается с 5 USD/мес. за 100 000 страниц, со стандартной доплатой от 0,00005 USD за страницу. Это расход на поставщика, но он убирает необходимость заставлять каждый фронтенд-бандл и каждое устройство пользователя вести себя как боевой PDF-сервис.
Стоимость CJK — это не только размер файла
Первая жесткая граница — CJK-текст: китайский, японский и корейский.
Встроенные стандартные PDF-шрифты jsPDF полезны для простого вывода латиницы, но не покрывают каждый Unicode-глиф. Когда документ содержит CJK-текст, приложению нужен шрифт, в котором эти глифы действительно есть. На практике браузерные реализации часто упаковывают TTF-файл, конвертируют его в base64-модуль JavaScript или загружают данные шрифта перед генерацией PDF.
Эта стоимость платится дважды: сначала как более тяжелый фронтенд-пакет, затем как память браузера во время генерации PDF. На мобильном устройстве та же вкладка может одновременно держать веб-приложение, шрифт, буферы штрихкодов, изображения и финальные PDF-байты.
gPdf держит эту работу на стороне сервиса. Браузер отправляет структурированный JSON; рендерер выбирает из встроенных шрифтов для латиницы, греческого, кириллицы, CJK, арабского, деванагари, бенгальского, тайского и моноширинного текста. Данные заказа на 2 КБ не должны превращаться в 12 МБ доставки шрифтов.
Стоимость штрихкодов: закодировать легко, надежно напечатать сложнее
В логистике, ecommerce, производстве, здравоохранении, ticketing и retail штрихкод может быть важнее видимого текста. Человек читает номер заказа; операция читает Code 128, GS1-128, QR, DataMatrix или PDF417.
С jsPDF генерация штрихкодов обычно становится отдельным продуктовым решением. Команды соединяют jsPDF с другим кодировщиком, рендерят штрихкод в SVG, canvas или изображение, а затем помещают результат в PDF. Это работает для QR-кода купона или прототипа.
Становится хрупко, когда напечатанный штрихкод операционно критичен:
- Canvas-штрихкод может быть растеризован с неправильным разрешением.
- Масштабированное изображение может размыть штрихи, модули или тихие зоны.
- Браузер, CSS-transform или путь экспорта могут изменить финальный физический размер.
- Разным форматам штрихкодов могут понадобиться разные библиотеки или пути конвертации.
- Термопринтеры на 203 DPI быстро выявляют маленькие ошибки размера.
gPdf рассматривает штрихкоды как элементы документа. В запросе указываются type: "barcode", format, данные и физический размер в миллиметрах. Рендерер записывает векторную геометрию штрихкода внутри PDF для поддерживаемых 1D- и 2D-форматов, поэтому текст, фигуры, таблицы, изображения и штрихкоды остаются в одной системе координат.
Studio и итерации шаблонов
jsPDF начинается с кода. Изменение макета обычно означает правку команд рисования, позиций, регистрации шрифтов, конвертации изображений и размещения штрихкода в JavaScript.
gPdf поддерживает такой же API-подход, но добавляет gPdf Studio как бесплатный визуальный дизайнер для PDF-макетов. Команды могут добавлять и перетаскивать текст, изображения, таблицы, фигуры, верхние и нижние колонтитулы и штрихкоды, а затем подключать дизайн к генерации через template_id + data. Это важно, когда формат транспортной этикетки, счета или квитанции часто меняется, а в макете должны участвовать не только PDF-специалисты.
Мобильный браузер — плохое место для тяжелой PDF-работы
Клиентская PDF-генерация кажется дешевой, потому что серверный счет равен нулю. Стоимость переезжает на устройство пользователя.
На десктопе это может быть нормально. На мобильных браузерах боевой документ может сильно нагрузить вкладку: данные CJK-шрифта, base64-изображения, canvas-буферы, изображения штрихкодов, сгенерированные PDF-байты и работающее приложение одновременно борются за память. iOS Safari и Android-устройства с малым объемом памяти менее терпимы, чем ноутбук разработчика.
Перенос генерации в gPdf меняет форму проблемы. Браузер строит небольшой JSON-запрос, ждет бинарный ответ и скачивает готовый PDF. Вкладке пользователя больше не нужно быть менеджером шрифтов, рендерером штрихкодов, движком макета и бинарным компонентом записи PDF.
Когда jsPDF все еще правильный выбор
Есть веские причины оставить jsPDF.
Если пользователь должен экспортировать офлайн, jsPDF лучше подходит. Если данные вообще не могут покидать устройство, браузерная генерация дает более чистую границу приватности. Если документ маленький, только с латиницей и используется редко, операционная стоимость введения API может не окупиться. Для прототипов и внутренних инструментов jsPDF часто действительно самый быстрый путь.
Решение меняется, когда вывод становится частью операционного процесса: транспортная этикетка должна сканироваться, счет должен архивироваться, билет должен проверяться, а трансграничный заказ должен корректно рендерить CJK-имена. В этот момент “сгенерировать PDF в браузере” менее важно, чем “надежно сгенерировать тот же боевой PDF”.
Форма миграции
Миграция — это не “заменить один вызов функции”. Это переход от императивного рисования в браузере к структурированному запросу документа.
- // Before: browser-side drawing with jsPDF plus extra font/barcode setup.
- import { jsPDF } from "jspdf";
- import JsBarcode from "jsbarcode";
-
- const doc = new jsPDF({ unit: "mm", format: [100, 150] });
- // Load a CJK-capable TTF and register it before drawing CJK text.
- doc.addFileToVFS("NotoSansCJK-Regular.ttf", base64Font);
- doc.addFont("NotoSansCJK-Regular.ttf", "NotoSansCJK", "normal");
- doc.setFont("NotoSansCJK");
- doc.text("跨境订单 / Cross-border order", 6, 10);
-
- // Generate a barcode separately, then place it into the PDF.
- JsBarcode(canvas, "PDN0003507278", { format: "CODE128" });
- doc.addImage(canvas.toDataURL("image/png"), "PNG", 6, 72, 72, 20);
- doc.save("label.pdf");
+
+ // After: send one structured DocumentRequest to gPdf.
+ const res = await fetch("https://api.gpdf.com/api/v1/pdf/render", {
+ method: "POST",
+ headers: {
+ Authorization: `Bearer ${KEY}`,
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ settings: {
+ defaults: {
+ text: {
+ font_family: "NotoSans-Regular",
+ font_mode: "prefer",
+ font_size: 9,
+ color: "#111827"
+ }
+ }
+ },
+ pages: [{
+ width: 100,
+ height: 150,
+ elements: [
+ {
+ type: "text",
+ x: 6,
+ y: 8,
+ content: "跨境订单 / Cross-border order",
+ style: { width: 88, font_size: 12, font_weight: "bold" }
+ },
+ {
+ type: "barcode",
+ x: 6,
+ y: 70,
+ width: 72,
+ height: 18,
+ format: "code128",
+ content: "PDN0003507278",
+ barcode_text: { enabled: true, position: "bottom", offset: 1 }
+ },
+ {
+ type: "barcode",
+ x: 80,
+ y: 8,
+ width: 14,
+ height: 14,
+ format: "qrcode",
+ content: "https://track.example/PDN0003507278",
+ barcode_text: { enabled: false, position: "bottom" }
+ }
+ ]
+ }]
+ })
+ });
+ const pdf = await res.arrayBuffer();
Главный сдвиг — владение. С jsPDF ваше веб-приложение владеет путем CJK-шрифтов, путем генерации штрихкодов, профилем памяти браузера и поведением экспорта. С gPdf приложение владеет данными и шаблоном; рендерер на edge владеет механикой документа.
Связанные сценарии PDF-генерации
Команды, которые сравнивают jsPDF и gPdf, обычно решают, должен ли PDF оставаться полностью браузерной функцией или его стоит вынести в контролируемый API. Для боевого маршрута полезны API JSON в PDF, API для PDF счетов, API транспортных этикеток, API штрихкодов GS1, API PDF/A и API Factur-X.
FAQ
jsPDF бесплатен?
Сама библиотека с открытым исходным кодом. Эксплуатационная стоимость — это окружающая работа: CJK-шрифты, библиотеки штрихкодов, проверка в браузерах, проверка печати и поддержка устройств, у которых заканчивается память.
gPdf заменяет все сценарии jsPDF?
Нет. Офлайн-экспорт из браузера и документы только на устройстве все еще естественная территория jsPDF. gPdf предназначен для боевых документов, где контролируемый рендерер стоит API-вызова.
Почему стоимость штрихкодов выделена отдельно?
Потому что штрихкод, который хорошо выглядит на экране, все равно может не сканироваться после масштабирования, растеризации или печати на термопринтере. Операционным документам нужна надежность сканирования, а не только видимый узор.
См. также
- Справочник gPdf API - DocumentRequest, элементы штрихкода, резервные шрифты и эндпоинты рендера.
- Векторные и растровые штрихкоды в PDF - почему геометрия штрихкода важна после печати.
- GS1-128 с точностью 0,1 mm в JSON - детали размера для этикеток.
- PDF/A и Factur-X для инженеров - когда архивные требования и требования электронного счета входят в PDF-процесс.