Сценарии использования · Логистика и доставка

PDF транспортных этикеток на carrier-grade масштабе

Рендерьте 4×6 thermal shipping labels с векторными GS1-128 barcodes, ITF-14 carton codes и SSCC-18 pallet IDs. Edge rendering держит p99 ниже 15 ms даже при пиках Black Friday.

Задача

Рендерить готовые для перевозчика 4×6 thermal shipping labels напрямую из order JSON — включая векторные GS1-128, ITF-14 и SSCC-18 barcodes — без запуска headless browser на каждый request. Output должен надежно сканироваться при 203 dpi на принтерах Zebra, SATO и Honeywell и оставаться ниже 15 ms p99 во время пиков retail-нагрузки.

Почему здесь подходит gPdf

  • Векторные Code 128, QR, DataMatrix, PDF417 и GS1-128 / ITF-14 / SSCC-18 — с субпиксельной точностью при 203 dpi, 300 dpi и 600 dpi.
  • Точность координат 0,1 mm — помогает выдерживать carrier tolerance по общей длине human-readable interpretation lines.
  • Размеры страниц `label_4_6_in`, `label_4_8_in` и `label_a6` уже настроены для основных thermal-printer formats.
  • Детерминизм: один и тот же order JSON рендерится в byte-identical PDF, поэтому reprints на складе не создают «другую» этикетку.
  • Edge rendering: p50 3 ms, p99 8 ms, даже когда 50 000 этикеток печатаются в одну минуту перед carrier pickup.
  • Без состояния: этикетка существует в памяти Cloudflare Worker isolate около 4 ms, затем освобождается. Нет document store и дополнительной carrier-data leakage surface.

Пример запроса

POST /api/v1/pdf/render — минимальная 4×6 thermal label с Code 128 barcode для carrier tracking.

{
  "pages": [{
    "size": "label_4_6_in",
    "elements": [
      {
        "type": "text",
        "x": 4, "y": 6,
        "content": "SHIP TO",
        "style": { "font_size": 8, "font_family": "NotoSans-Regular" }
      },
      {
        "type": "text",
        "x": 4, "y": 12,
        "content": "Acme Distribution Centre\n1200 Logistics Pkwy\nMemphis TN 38116",
        "style": { "font_size": 11, "font_family": "NotoSans-Regular" }
      },
      {
        "type": "barcode",
        "format": "code128",
        "content": "1Z999AA10123456784",
        "x": 4, "y": 60,
        "width": 92, "height": 22,
        "barcode_text": { "enabled": true, "position": "bottom" }
      }
    ]
  }]
}

Соответствие и технические требования

  • GS1 General Specifications: module width (X-dimension), quiet zone и overall length соответствуют допускам GS1 Section 5.4 при 203 dpi.
  • Carrier mandates: UPS, FedEx, DHL и USPS принимают rendered output как scannable; per-carrier post-processing не требуется.
  • PDF/A-2b доступен для archival через `settings.profile = "pdfa-2b"`, если label PDF нужно хранить по tax или audit reasons.

Workload транспортных этикеток в одном абзаце

Каждый заказ создает один PDF, каждый PDF один раз печатается на thermal printer, а отказ при медленной генерации — это не «страница грузится медленно», а «складская отгрузка стоит в очереди за вашим label-rendering API». В доставке p99 latency — главная продуктовая метрика. Deterministic output важен, потому что reprints на складе обычное дело. А качество штрихкода — измеренное GS1 X-dimension tolerances, а не пикселями — решает, прочитает ли scanner этикетку с первого прохода.

PDF-стекам на headless browser трудно одновременно закрыть все три фактора: cold-start cost накапливается при spike, raster barcodes теряют качество на маленьких thermal labels, а font rasterisation дрейфует между версиями Chromium, поэтому byte-identical reprint становится невозможным.

Почему gPdf подходит

4×6 thermal label невелика (576 × 864 pixels при 203 dpi), содержит мало элементов (text blocks + 1–2 barcodes + optional carrier logo) и генерируется в большом объеме. Средний 3PL рендерит 50 000–500 000 таких этикеток в день. Это именно тот workload, под который сделан gPdf. Renderer:

  1. Компилирует layout один раз — page coordinates, font cascades и barcode geometry resolve at request time, а не через browser layout engine.
  2. Векторизует каждый barcode — modules рисуются прямо в PDF stream, поэтому 30 mm-wide GS1-128 читается cleanly при 203 dpi или 600 dpi без DPI-aware rasterisation logic на вашей стороне.
  3. Встраивает NotoSans CJK + Latin — один и тот же payload корректно рендерит Chinese carrier-name без provisioned fonts на render container.

p99 остается ровным — 8 ms на нашем reference workload (1 000 invocations примерa выше в EU-WEST), независимо от того, отрендерил один isolate одну этикетку или 10 000 этикеток.

Расчет объема и стоимости

Типичный средний 3PL работает примерно с 50 000 labels/day, то есть около 1,5 млн labels/month. На Basic plan (5 USD/month за 100 000 pages, 0,00005 USD за страницу overage) получается:

1,5 млн страниц × 0,00005 USD       = 75,00 USD overage
+ Basic plan base                   =  5,00 USD
──────────────────────────────────────────
total                                = 80,00 USD/month

Тот же workload на Puppeteer-on-Lambda при типичных Lambda concurrency settings попадает в диапазон 200–400 USD/month еще до учета cold-start tax во время peak.

Black Friday: расчетный пример

Пиковый всплеск — это workload, где edge rendering особенно явно окупается. Retail customer, который в первый час Black Friday выходит на 200% обычного объема этикеток — например, 100 000 labels за 60 minutes, в среднем 1,7K labels/minute и до 5K/minute в burst, — укладывается в один Cloudflare Workers region pool без cold-start tax. Тот же workload на Puppeteer warm pool, рассчитанном под average traffic, дает 1,5–2,5 s cold-starts на burst-spawned containers, и пункт отгрузки на складе чувствует каждую такую задержку.

Что читать дальше