Сравнения

gPdf vs jsPDF: PDF в браузере или API на edge

jsPDF удобен для легких PDF в браузере, но CJK-шрифты, точность штрихкодов, память мобильных устройств и требования соответствия меняют архитектуру.

Кратко

jsPDF практичен для легких PDF, которые создаются прямо в браузере: прототипов, квитанций, небольших экспортов и офлайн-режимов. Компромисс появляется, когда боевому документу нужны CJK-текст, сканируемые штрихкоды, стабильность на мобильных устройствах или вывод под требования соответствия. gPdf переносит работу со шрифтами, штрихкодами, макетом и PDF-генерацией в контролируемый API на edge: браузер отправляет данные и получает готовый PDF.

Бок о бок

Критерий gPdf jsPDF Преимущество
Где выполняется рендеринг
jsPDF ценен именно потому, что работает на клиенте; та же особенность переносит нагрузку CPU и памяти на каждое устройство пользователя.
V8-изоляты Cloudflare Workers на edge Вкладка браузера пользователя gPdf
Работа с CJK-шрифтами
Стандартные PDF-шрифты jsPDF не покрывают UTF-8/CJK; командам приходится загружать или упаковывать подходящие TTF-данные.
Встроенные резервные шрифты для упрощенного китайского, японского и корейского Требует пользовательский шрифт с нужными глифами gPdf
Размер фронтенд-пакета для CJK Без CJK-файла шрифта в пакете веб-приложения Часто многомегабайтные файлы шрифтов или сгенерированные base64-модули шрифтов gPdf
Модель генерации штрихкодов Нативный элемент `barcode` для 1D- и 2D-форматов Обычно отдельная библиотека штрихкодов, SVG/canvas или путь через изображение gPdf
Точность печати штрихкодов
Для транспортных этикеток, складских этикеток и билетов сканерам важны печатная геометрия, тихие зоны и размер модуля, а не только внешний вид на экране.
Векторные штрихи и модули внутри PDF Зависит от того, как браузерный штрихкод конвертируется и масштабируется в PDF gPdf
Стабильность мобильного браузера Рендеринг вынесен из вкладки PDF-генерация, шрифты, изображения и штрихкоды потребляют память клиента gPdf
Офлайн-поддержка Требует сетевого доступа к API Может работать полностью офлайн в PWA или локальном приложении jsPDF
PDF/A и электронные счета PDF/A-профили и эндпоинт Factur-X/ZUGFeRD Обычно не подходит для архивных или гибридных пакетов электронных счетов gPdf
Публичная цена Basic за 5 USD/мес. включает 100 000 страниц; доплата начинается с 0,00005 USD за страницу Библиотека с открытым исходным кодом; счета поставщика за саму библиотеку нет jsPDF
Стоимость владения в боевой эксплуатации API отвечает за шрифты, рендер штрихкодов, среду вывода и обновления Веб-приложение отвечает за упаковку шрифтов, конвертацию штрихкодов, память на мобильных устройствах и проверку в браузерах gPdf
Лучший стандартный сценарий Структурированные боевые документы: транспортные этикетки, счета, квитанции, билеты, выписки Небольшие браузерные экспорты, прототипы, офлайн-документы и простые PDF с латиницей Поровну

Когда что выбрать

Выбирайте gPdf, если
  • В документах есть китайский, японский или корейский текст, и вы не хотите отправлять крупные файлы шрифтов в каждый браузер.
  • Вы генерируете критичные для сканирования этикетки или билеты с Code 128, GS1-128, QR, DataMatrix, PDF417 или другими штрихкодами.
  • Пользователи часто работают в мобильных браузерах, и PDF-генерация не должна конкурировать со страницей за память.
  • Нужны PDF/A, Factur-X, ZUGFeRD или один контролируемый рендерер для вывода, чувствительного к аудиту.
  • Один и тот же PDF-процесс должен вызываться из фронтенда, бэкенда, фоновых задач и интеграций.
Выбирайте jsPDF, если
  • Нужен полностью офлайн-экспорт из браузера или PWA без серверного вызова.
  • PDF маленький, только с латиницей и генерируется редко одним пользователем.
  • Вы прототипируете и хотите быстрее всего рисовать текст, линии и изображения в JavaScript.
  • Данные не должны покидать устройство пользователя даже для краткого запроса на рендер.
  • Вы готовы владеть упаковкой шрифтов, кодированием штрихкодов, масштабированием и краевыми случаями памяти браузера.
Возможности

gPdf — это edge-native API преобразования JSON в PDF для больших объёмов счетов, документов, транспортных этикеток, штрихкодов, PDF/A и электронных счетов. PDF-рендеринг миллисекундного класса в глобальной edge-сети — оптимизирован для предсказуемой генерации документов промышленного уровня. Цены уровня инфраструктуры, достаточно низкие, чтобы заменить создание и эксплуатацию собственной PDF-инфраструктуры.

Возможности

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-вызова.

Почему стоимость штрихкодов выделена отдельно?

Потому что штрихкод, который хорошо выглядит на экране, все равно может не сканироваться после масштабирования, растеризации или печати на термопринтере. Операционным документам нужна надежность сканирования, а не только видимый узор.

См. также