재직증명서 양식
보안 패턴 워터마크, 사각 직인, 원본 확인 QR이 있는 재직증명서.
사용법
- 아래 예제 데이터와 같은 구조로 내 데이터를 만듭니다. 서버에서 JSON으로 내려 주면 됩니다.
- getTemplate(id)로 정의를 불러오거나, 아래 JSON을 내 프로젝트에 저장해서 씁니다.
- 회사 이름·로고·직인·문구는 [디자이너에서 열기]로 바꾼 뒤 [저장]으로 JSON을 받습니다.
- 인쇄, PDF, 엑셀, HWPX 저장은 뷰어 도구 모음에 이미 있습니다.
import { getTemplate, createViewer } from '@freereportjs/core';
import '@freereportjs/core/styles.css';
const t = getTemplate('employment-certificate'); // a fresh copy each call
createViewer(document.getElementById('report'), {
definition: t.definition,
data: 내데이터, // 아래 예제 데이터와 같은 구조
});직인은 데이터의 글자로 그려지는 생성 직인입니다. 실제 인감 이미지를 쓰려면 디자이너에서 직인 요소에 이미지를 지정하세요. 글꼴은 나눔고딕·나눔명조가 기본입니다.
데이터 구조
| 키 | 종류 | 필드 |
|---|---|---|
docNo | string | 제 2026-0412 호 |
person | 객체 | name, birth, address, dept, position, joined |
purpose | string | 금융기관 제출용 |
company | 객체 | name, ceo, address |
issued | string | 2026-10-15 |
보고서 정의 (JSON)
{
"version": 1,
"name": "재직증명서",
"page": {
"size": "A4",
"margins": 20
},
"font": {
"family": "Nanum Gothic",
"size": 10.5
},
"fingerprint": true,
"watermark": [
{
"text": "{company.name} 원본",
"repeat": true,
"opacity": 0.05,
"fontSize": 9,
"gap": 32,
"angle": -30
},
{
"text": "원 본",
"opacity": 0.06,
"fontSize": 120,
"color": "#2340f5"
}
],
"bands": {
"title": {
"height": 250,
"elements": [
{
"type": "field",
"x": 0,
"y": 0,
"w": 85,
"h": 7,
"expr": "docNo",
"style": {
"fontSize": 9,
"color": "#555"
}
},
{
"type": "text",
"x": 0,
"y": 14,
"w": 170,
"h": 18,
"text": "재 직 증 명 서",
"style": {
"fontSize": 26,
"bold": true,
"align": "center",
"letterSpacing": 1.5
}
},
{
"type": "text",
"x": 0,
"y": 44,
"w": 10,
"h": 33,
"text": "인\n적\n사\n항",
"style": {
"background": "#f6f7f9",
"bold": true,
"align": "center",
"border": "0.25 solid #333",
"lineHeight": 1.5
}
},
{
"type": "text",
"x": 10,
"y": 44,
"w": 30,
"h": 11,
"text": "성 명",
"style": {
"background": "#f6f7f9",
"bold": true,
"align": "center",
"border": "0.25 solid #333"
}
},
{
"type": "field",
"x": 40,
"y": 44,
"w": 50,
"h": 11,
"expr": "person.name",
"style": {
"border": "0.25 solid #333",
"padding": [
0.5,
2,
0.5,
2
]
}
},
{
"type": "text",
"x": 90,
"y": 44,
"w": 30,
"h": 11,
"text": "생년월일",
"style": {
"background": "#f6f7f9",
"bold": true,
"align": "center",
"border": "0.25 solid #333"
}
},
{
"type": "text",
"x": 120,
"y": 44,
"w": 50,
"h": 11,
"text": "{format(person.birth, \"yyyy년 M월 d일\")}",
"style": {
"border": "0.25 solid #333",
"padding": [
0.5,
2,
0.5,
2
]
}
},
{
"type": "text",
"x": 10,
"y": 55,
"w": 30,
"h": 22,
"text": "주 소",
"style": {
"background": "#f6f7f9",
"bold": true,
"align": "center",
"border": "0.25 solid #333"
}
},
{
"type": "field",
"x": 40,
"y": 55,
"w": 130,
"h": 22,
"expr": "person.address",
"style": {
"border": "0.25 solid #333",
"padding": [
0.5,
2,
0.5,
2
]
}
},
{
"type": "text",
"x": 0,
"y": 77,
"w": 10,
"h": 33,
"text": "재\n직\n사\n항",
"style": {
"background": "#f6f7f9",
"bold": true,
"align": "center",
"border": "0.25 solid #333",
"lineHeight": 1.5
}
},
{
"type": "text",
"x": 10,
"y": 77,
"w": 30,
"h": 11,
"text": "회 사 명",
"style": {
"background": "#f6f7f9",
"bold": true,
"align": "center",
"border": "0.25 solid #333"
}
},
{
"type": "field",
"x": 40,
"y": 77,
"w": 130,
"h": 11,
"expr": "company.name",
"style": {
"border": "0.25 solid #333",
"padding": [
0.5,
2,
0.5,
2
]
}
},
{
"type": "text",
"x": 10,
"y": 88,
"w": 30,
"h": 11,
"text": "부 서",
"style": {
"background": "#f6f7f9",
"bold": true,
"align": "center",
"border": "0.25 solid #333"
}
},
{
"type": "field",
"x": 40,
"y": 88,
"w": 50,
"h": 11,
"expr": "person.dept",
"style": {
"border": "0.25 solid #333",
"padding": [
0.5,
2,
0.5,
2
]
}
},
{
"type": "text",
"x": 90,
"y": 88,
"w": 30,
"h": 11,
"text": "직 위",
"style": {
"background": "#f6f7f9",
"bold": true,
"align": "center",
"border": "0.25 solid #333"
}
},
{
"type": "field",
"x": 120,
"y": 88,
"w": 50,
"h": 11,
"expr": "person.position",
"style": {
"border": "0.25 solid #333",
"padding": [
0.5,
2,
0.5,
2
]
}
},
{
"type": "text",
"x": 10,
"y": 99,
"w": 30,
"h": 11,
"text": "재직기간",
"style": {
"background": "#f6f7f9",
"bold": true,
"align": "center",
"border": "0.25 solid #333"
}
},
{
"type": "text",
"x": 40,
"y": 99,
"w": 130,
"h": 11,
"text": "{format(person.joined, \"yyyy년 M월 d일\")} ~ 현재 ({floor(dateDiff(person.joined, issued) / 365)}년 {floor((dateDiff(person.joined, issued) % 365) / 30)}개월)",
"style": {
"border": "0.25 solid #333",
"padding": [
0.5,
2,
0.5,
2
]
}
},
{
"type": "text",
"x": 0,
"y": 110,
"w": 40,
"h": 11,
"text": "용 도",
"style": {
"background": "#f6f7f9",
"bold": true,
"align": "center",
"border": "0.25 solid #333"
}
},
{
"type": "field",
"x": 40,
"y": 110,
"w": 130,
"h": 11,
"expr": "purpose",
"style": {
"border": "0.25 solid #333",
"padding": [
0.5,
2,
0.5,
2
]
}
},
{
"type": "text",
"x": 0,
"y": 136,
"w": 170,
"h": 10,
"text": "위와 같이 재직하고 있음을 증명합니다.",
"style": {
"align": "center",
"fontSize": 13
}
},
{
"type": "text",
"x": 0,
"y": 160,
"w": 170,
"h": 10,
"text": "{format(issued, \"yyyy년 M월 d일\")}",
"style": {
"align": "center",
"fontSize": 12
}
},
{
"type": "text",
"x": 0,
"y": 186,
"w": 170,
"h": 12,
"text": "{company.name} 대표이사 {company.ceo}",
"style": {
"align": "center",
"fontSize": 15,
"bold": true,
"letterSpacing": 0.6
}
},
{
"type": "seal",
"x": 133,
"y": 179,
"w": 22,
"h": 22,
"rotate": -4,
"generate": {
"text": "{replace(company.name, \"(주)\", \"\")}대표이사인",
"shape": "square"
},
"style": {
"fontFamily": "Nanum Myeongjo"
}
},
{
"type": "field",
"x": 0,
"y": 199,
"w": 170,
"h": 7,
"expr": "company.address",
"style": {
"align": "center",
"fontSize": 9,
"color": "#555"
}
},
{
"type": "barcode",
"x": 0,
"y": 224,
"w": 22,
"h": 22,
"expr": "\"https://freereport.app/verify/\" + replace(docNo, \" \", \"\") + \"?h=\" + docHashShort",
"format": "qr",
"ecc": "Q"
},
{
"type": "text",
"x": 24,
"y": 228,
"w": 90,
"h": 14,
"text": "이 증명서는 위·변조 방지 처리가 되어 있습니다.\nQR 코드로 원본 여부를 확인할 수 있습니다.\n확인코드 {docHashShort}",
"style": {
"fontSize": 7.5,
"color": "#555",
"valign": "top"
}
}
]
}
}
}예제 데이터
{
"docNo": "제 2026-0412 호",
"person": {
"name": "홍길동",
"birth": "1990-03-15",
"address": "서울특별시 중구 세종대로 110",
"dept": "개발팀",
"position": "책임연구원",
"joined": "2019-03-04"
},
"purpose": "금융기관 제출용",
"company": {
"name": "(주)세컨드코리아",
"ceo": "구명석",
"address": "경기도 파주시 와석순환로 507, 701호"
},
"issued": "2026-10-15"
}