표 데이터 빌더
빌더 열기
캔버스에서 표를 선택하세요. 속성 패널의 데이터 탭에서 데이터 빌더 열기를 선택합니다. 필드, 원본, 미리 보기 탭은 표 구조와 데이터를 분리해 다룹니다.
열과 요약 행
필드에서 열을 추가하고 각 제목과 데이터 필드를 설정합니다. 필요에 따라 너비, 서식, 고급 모양을 조정하세요. 표 아래에 합계, 소계, 메모 행을 추가할 수 있습니다. 계산 방법은 합계 섹션에서 설명합니다.
합계
합계나 소계 행에서 계산을 선택하세요. 합계, 평균, 최솟값, 최댓값, 행 수를 사용할 수 있습니다. 결과는 값 열에 표시되며, 해당 열의 모든 행을 기준으로 계산합니다. 행에 별도 서식이 없으면 열의 서식을 사용합니다.
"summaryRows": [
{ "type": "total", "label": "총합계",
"aggregate": "sum", "targetColumnKey": "total" }
]
숫자로 전달된 셀만 계산에 포함합니다. 빈 셀은 건너뛰며, 금액을 텍스트(“1,250.00”)로 보내면 결과가 비어 있습니다. 소계도 페이지별이 아니라 모든 행을 대상으로 합니다. 대신 데이터 필드를 선택하면 값 상자는 표가 아니라 데이터의 루트에서 읽습니다. 예를 들어 {{ grandTotal }}입니다.
원본 및 샘플 JSON
원본에서 표의 데이터 배열을 선택하고 샘플 JSON을 편집하세요. 열의 field는 배열 안 객체의 속성과 일치해야 합니다. 예를 들어 items의 quantity를 표시하려면 열의 field를 quantity로 설정합니다. 유효하지 않은 JSON 경고는 계속하기 전에 해결하세요.
기본 표 모양
| 품목 | 수량 | 합계 |
|---|---|---|
| 고장 진단 | 2 | 1.700,00 |
| 연결 모듈 | 1 | 2.850,00 |
| 현장 교정 | 1 | 850,00 |
다음 크기는 제품 기본값입니다. 머리글 40px, 행 40px, 셀 안쪽 여백 10px, 테두리 1px입니다. 템플릿에서 각각 바꿀 수 있습니다.
표 요소의 전체 작업 과정
표는 데이터의 배열에 바인딩되며 각 항목당 한 행을 그립니다. 아래 요소는 청구서 템플릿에 포함된 요소이며 그 아래 호출은 같은 표에 세 행의 데이터를 전달합니다.
{
"id": "invoice-items",
"type": "table",
"placementMode": "flow",
"binding": "lineItems",
"layout": { "x": 0, "y": 330, "width": 100, "widthUnit": "percent", "height": 220 },
"style": {
"tableHeaderHeight": 36,
"tableRowHeight": 34,
"tableRepeatHeader": true,
"tablePreventRowSplit": true
},
"columns": [
{ "key": "name", "label": "설명", "valueTemplate": "{{ name }}",
"align": "left", "widthPercent": 46 },
{ "key": "quantity", "label": "수량", "valueTemplate": "{{ quantity }}",
"align": "right", "widthPercent": 14 },
{ "key": "unitPrice", "label": "단가", "valueTemplate": "{{ unitPrice }}",
"align": "right", "widthPercent": 20,
"format": { "kind": "currency", "currency": "USD", "decimals": 2 } },
{ "key": "total", "label": "금액", "valueTemplate": "{{ total }}",
"align": "right", "widthPercent": 20,
"format": { "kind": "currency", "currency": "USD", "decimals": 2 } }
]
}
curl -X POST https://api.pdfgine.com/api/v1/render \
-H "X-PDFgine-Key: $PDFGINE_KEY" \
-H "Content-Type: application/json" \
-d '{
"templateCode": "invoice",
"format": "pdf",
"locale": "ko",
"data": {
"document": { "title": "청구서 요약" },
"referenceNo": "DOC-2026-0042",
"issueDate": "2026-09-06",
"currency": "USD",
"customer": "Northwind Trading Ltd.",
"lineItems": [
{ "name": "고장 진단", "quantity": 2, "unitPrice": 850.00 },
{ "name": "연결 모듈", "quantity": 1, "unitPrice": 2850.00 },
{ "name": "현장 교정", "quantity": 1, "unitPrice": 850.00 }
]
}
}'
binding은 데이터의 배열을, key는 각 항목의 필드를, valueTemplate은 출력할 내용을 지정합니다. tableRepeatHeader는 모든 페이지에 머리글을 반복하고 tablePreventRowSplit은 페이지 나눔에서 행이 잘리는 것을 막습니다.
긴 표 적용 및 테스트
미리 보기에서 열 순서, 빈 필드, 요약을 확인한 후 표에 변경 사항을 적용하세요. 이어 문서 미리 보기에서 0행, 1행, 많은 행을 테스트하세요. 긴 텍스트, 머리글 높이, 행 높이는 페이지 분할에 영향을 줍니다. 짧은 샘플만으로 판단하지 마세요.
차트와 보고서 →dataset 요소
dataset 요소는 바인딩된 컬렉션을 표로 렌더링하며 데이터에서 열을 자동으로 정하므로 직접 선언하지 않습니다. 컬렉션의 구조가 템플릿이 아닌 페이로드로 정해질 때 사용하세요.
| 바인딩된 값 | 문서에 표시되는 내용 |
|---|---|
[{ "name": "…", "quantity": 2 }] |
필드가 처음 나타나는 순서대로 필드당 하나의 열을 만듭니다. 어떤 행에 필드가 없어도 해당 열은 유지됩니다. |
[{ "party": { "name": "…" } }] |
중첩 객체는 최대 세 단계까지 party.name 같은 점 구분 열로 펼쳐집니다. 행 안의 배열은 한 셀에 유지됩니다. |
["urgent", "warranty"] |
값 자체가 셀에 들어가는 하나의 열이며 제목은 binding의 마지막 부분입니다. |
{ "status": "released" } |
한 행으로 표시되며 객체의 필드마다 하나의 열이 생깁니다. |
[] |
아무것도 그리지 않습니다. 바인딩되지 않은 dataset 요소도 아무것도 그리지 않습니다. |
열 제목은 필드 이름입니다. dataset 요소에는 자체 라벨이 없으므로 열 이름을 직접 지정하려면 table 요소를 사용하세요.
자주 발생하는 문제
- 데이터에 없는 배열을 binding으로 지정하면 오류가 아닌 빈 표를 그립니다. 표가 비어 있으면 binding과 요청의 키를 비교하세요.
- 열의 key는 해당 배열 객체의 속성입니다. 키 하나의 철자가 틀리면 나머지 표는 정상이어도 그 열만 비게 됩니다.
- 금액과 수량은 숫자로 전송해야 합니다. 문자열은 서식 설정을 건너뛰므로 열 정렬과 천 단위 구분 기호가 사라집니다.
- 긴 표는 여러 페이지로 이어집니다. tableRepeatHeader가 없으면 두 번째 페이지가 제목 없이 시작되고 tablePreventRowSplit이 없으면 행이 반으로 잘릴 수 있습니다.
- 0행, 1행, 여러 행을 테스트하세요. 세 행으로만 시험한 표에서는 빈 경우와 페이지 나눔 문제가 드러나지 않습니다.