기능

기본이지만 중요한 부분을 제대로.

PDF 래퍼 안의 브라우저 스크린샷이 아닌 실제 문서 시맨틱.

Browse use cases
/01

픽셀 단위 제어

x/y는 밀리미터, x_anchor로 우측 정렬, 라벨에서는 서브 밀리미터 배치. 좌표이지 근사값이 아닙니다.

// inside elements[i]
"x_anchor": {
  "reference": "content_right",
  "offset": 6
}
/02

벡터 바코드

GS1-128, QR, PDF417, DataMatrix를 포함한 30+ 심볼로지. 모두 벡터. 전체 길이 0.1 mm 정확도.

// 30+ formats: code128, qrcode, datamatrix, pdf417, ...
"type": "barcode",
"format": "code128",
"content": "INV-2026-001"
Why vector beats raster
/03

폰트 폴백 체인

font_mode 세 가지: strict(선언된 폰트가 모든 글리프를 커버해야 함), prefer(내장 폰트 체인으로 폴백), auto(엔진 선택). auto/prefer 모두 실패 시 API-504 반환 — 침묵 실패가 아닌 명시적 실패.

// inside style{}
"font_family": "NotoSans-Regular",
"font_mode": "prefer"
/04

컴플라이언스 모드

settings.profile = "pdfa-3b" 한 줄로 PDF/A-3b 준수와 Factur-X / ZUGFeRD가 요구하는 임베디드 XML 첨부 스트림이 모두 켜집니다. 한 필드, 한 준수 문서.

// top-level on DocumentRequest
"settings": {
  "profile": "pdfa-3b"
}
PDF/A and Factur-X, explained
/05

변수 + 페이지네이션

{page} / {total_pages}는 레이아웃 후 해결됨. keep_together, widow/orphan, page_break 블록.

// element of type "variable"
{ "type": "variable",
  "name": "page",
  "scope": "system" }
/06

페이지네이션하는 테이블

페이지를 넘는 row_span, 헤더 반복, alternate_fill, 복합 이중 테두리. 항상 깨지는 1%.

// inside table element
"pagination": {
  "keep_spans_together": true
}
/07

하나의 JSON, 두 인터페이스

같은 DocumentRequest JSON이 POST /api/v1/pdf/render와 editor.gpdf.com의 비주얼 에디터를 동시에 구동. 비주얼 편집, API 출력, 손으로 작성 — 세 경로가 같은 파일을 라운드트립합니다.

// three routes, one engine
POST /api/v1/pdf/render
POST /api/v1/template-render
POST /api/v1/e-invoice/render
Read the API reference
/08

인보이스를 위해 구축

페이지당 $0.00005, p50 3 ms, 내장 CJK, PDF/A-3 첨부 스트림. 핀테크, ERP, 세무 컴플라이언스 팀이 먼저 확인하는 네 숫자.

// invoice — header + table pattern
{ "size": "a4",
  "elements": [
    { "type": "text",  "x": 18, "y": 22, ... },
    { "type": "table", "x": 18, "y": 60, ... }
  ]}
Why JSON beats HTML→PDF
/09

배송 라벨을 위해 구축

label_100_150 및 label_4_6_in 크기 프리셋. 0.1 mm 정밀도의 벡터 GS1-128, ITF-14, SSCC. 운송사와 3PL은 피크 시간에도 래스터화된 바코드 없이 출력할 수 있습니다.

// 4×6 thermal shipping label
{ "size": "label_4_6_in",
  "elements": [{
    "type": "barcode",
    "format": "code128",
    "content": "1Z999AA10123456784" }]}
Shipping-label use case