서명 요청 시 텍스트로 필드 자동 배치하기
Anchor 파라미터 활용하기
서명 요청 API(POST /documents)에서 입력란(필드)의 위치를 좌표 대신 문서 안의 텍스트를 기준으로 지정하는 방법입니다. 문서의 내용이 길어지거나 표의 행이 늘어나 레이아웃이 바뀌어도, 기준 텍스트만 그대로 있으면 필드가 알아서 따라갑니다.

< 예시 : (인) 텍스트에 서명 필드 자동배치 >
시작하기 전에 꼭 이해하기Anchor는 "문서에서 이 글자를 찾아, 그 자리에 입력란을 놓아라"는 지시입니다.
기존 방식은 "1페이지의 가로 15%, 세로 25% 지점에 서명란을 놓아라"처럼 좌표를 직접 알려줍니다. 그래서 문서 양식이 조금만 바뀌어도 좌표를 다시 계산해야 합니다.
Anchor 방식은 "문서에서
근로자 서명이라는 글자를 찾아, 그 옆에 서명란을 놓아라"처럼 글자를 알려줍니다. 문서가 바뀌어도 그 글자만 있으면 되므로 좌표를 다시 계산할 필요가 없습니다.그래서 Anchor의 가장 중요한 전제는 하나입니다. 문서 안에 "찾을 수 있는 글자"가 실제로 들어 있어야 합니다. 스캔한 이미지처럼 눈에는 글자로 보여도 데이터로는 그림인 파일에서는 동작하지 않습니다.
한눈에 보는 차이
| 구분 | 좌표 기반 (position.x, y, page) | Anchor 기반 (position.anchor) |
|---|---|---|
| 위치 지정 방식 | 페이지 번호 + 절대 좌표 | 문서 내 기준 텍스트 |
| 페이지 지정 | page로 직접 지정 | 기준 텍스트가 있는 페이지를 자동 감지 |
| 레이아웃 변경 대응 | 좌표 재계산 필요 | 기준 텍스트만 유지되면 자동 대응 |
| 지원 필드 타입 | 전체 | TEXT, SIGNATURE |
| 지원 파일 | 이미지 파일에서도 사용 가능 | 텍스트 정보가 있는 문서 파일 |
| 생성되는 필드 수 | 지정한 만큼 1개 | 텍스트가 매칭된 개수만큼 |
| 적합한 문서 | 양식이 고정된 정형 문서 | 길이·행 수가 바뀌는 비정형 문서 |
Anchor는 기존 좌표 방식을 대체하지 않습니다. 기존 연동 코드는 그대로 동작하며, 한 문서 안에서 필드별로 두 방식을 섞어 쓸 수 있습니다.
사용 전 확인하세요
- Anchor는 서명 요청 API(
POST /documents)의TEXT·SIGNATURE필드에서만 쓸 수 있습니다. 템플릿·임베디드 초안에서는 지원하지 않습니다.- 텍스트 레이어가 없는 스캔 PDF와 이미지 파일에서는 동작하지 않습니다. 문서를 만드는 단계부터 텍스트 기반 파일을 쓰도록 업무 흐름을 설계하세요.
- 기준 텍스트가 여러 번 등장하면 그만큼 필드가 늘어납니다. 짧고 흔한 문구 대신 그 위치에만 나타나는 문구를 기준으로 잡으세요.
- 기준 텍스트를 찾지 못하거나 필드가 페이지를 벗어나면 서명 요청 자체가 생성되지 않습니다. 운영 적용 전 실제 문서로 검증하고 실패 시 재시도·알림 처리를 함께 설계하세요.
전체 흐름
문서를 업로드하고 anchor를 지정해 서명 요청을 보내면, 모두싸인 서버가 문서를 파싱해 기준 텍스트의 위치를 찾고 그 자리에 필드를 생성합니다. 파란색은 서버·API 처리 단계, 민트색은 참여자 화면 단계입니다.
POST /files— 서명받을 문서 파일을 업로드하고fileId·token을 받습니다.POST /documents— 참여자의 각 필드에position.anchor.text로 기준 텍스트를 지정해 서명을 요청합니다.- 모두싸인 서버가 업로드된 문서를 파싱해
anchor.text의 위치를 검색합니다. - 검색된 위치에서
anchor.offset만큼 이동한 좌표에size크기의 필드가 자동 생성됩니다. - 참여자가 서명 화면에서 자동 배치된 입력란을 채우고 서명합니다.
1. 문서 파일 업로드
먼저 서명받을 문서를 파일 업로드 API로 올립니다.
curl -X POST 'https://api.modusign.co.kr/files?type=document' \
-H 'Authorization: Basic {인코딩된 API-KEY}' \
-F 'file=@근로계약서.pdf'응답으로 받은 fileId와 token을 다음 단계의 서명 요청에서 사용합니다.
업로드는 base64 가 아닌, 파일 업로드 API를 사용하세요서명 요청의
file객체는 base64 인라인 방식(file.base64+file.extension)도 지원하지만, 다음 이유로 파일 업로드 API(POST /files) 사용을 권장합니다.
- base64는 인코딩이 조금만 어긋나도
This file is invalid오류가 발생하기 쉽습니다.- base64로 변환하면 데이터가 원본 대비 약 33% 커져 요청 용량 제한과 응답 지연 위험이 있습니다.
- 모두싸인의 파일 관련 기능은 파일 업로드 API를 중심으로 개선되고 있어, 향후 호환성 측면에서도 유리합니다.
파일 업로드 API는
multipart/form-data형식이며,type=document일 때 PDF는 최대 10MB, 그 외 확장자는 최대 5MB입니다. 응답으로 받은token의 유효시간은 2시간이므로 업로드 후 2시간 안에 서명 요청을 보내세요.
2. Anchor로 필드 위치 지정
필드의 position 객체에 좌표 대신 anchor 객체를 넣습니다.
{
"type": "TEXT",
"required": true,
"position": {
"anchor": {
"text": "근로자 이름",
"offset": {
"x": 0.08,
"y": 0
}
}
},
"size": {
"width": 0.2,
"height": 0.04
}
}Anchor 파라미터
| 파라미터 | 타입 | 필수 | 범위 | 설명 |
|---|---|---|---|---|
anchor.text | string | ✓ | 1~200자 | 문서에서 찾을 기준 텍스트. 특수문자를 쓸 수 있고, 영문 대소문자를 구분합니다. |
anchor.offset | object | 기준 텍스트로부터 얼마나 떨어뜨릴지. 생략하면 기준 텍스트 위치에 바로 배치됩니다. | ||
anchor.offset.x | number | ✓ | -1 ~ 1 | 가로 오프셋. 양수는 오른쪽, 음수는 왼쪽. |
anchor.offset.y | number | ✓ | -1 ~ 1 | 세로 오프셋. 양수는 아래쪽, 음수는 위쪽. |
offset 객체를 넣는 경우 x와 y는 둘 다 지정해야 합니다. 한쪽만 이동시키려면 나머지를 0으로 두세요.
좌표 단위는 문서 크기 대비 비율입니다
offset과 size 값은 픽셀이 아니라 문서 너비·높이에 대한 0~1 비율입니다. 예를 들어 offset.x: 0.08은 문서 너비의 8%만큼 오른쪽으로, size.width: 0.2는 문서 너비의 20% 크기를 뜻합니다.
크기(size)는 Anchor를 써도 필수입니다
size)는 Anchor를 써도 필수입니다size는 position과 같은 레벨에 두며, Anchor 방식에서도 생략할 수 없습니다.
| 필드 타입 | size.width | size.height |
|---|---|---|
TEXT | 필수 (0~1) | 필수 (0~1) |
SIGNATURE | 필수 (0.01~1) | 필수 (0.01~1) |
3. Anchor를 쓸 수 있는 범위
Anchor는 모든 서명 요청 상황에서 쓸 수 있는 기능이 아닙니다. 연동을 설계하기 전에 아래 세 가지를 먼저 확인하세요.
사용할 수 있는 API
| API | Anchor 지원 | 비고 |
|---|---|---|
POST /documents (서명 요청) | 지원 | participants[].fields[].position.anchor |
POST /documents/request-with-template (템플릿으로 서명 요청) | 미지원 | 요청 본문에 입력란 위치를 지정하는 position이 없습니다. 필드 위치는 템플릿에 저장된 값을 따릅니다. |
POST /embedded-drafts (임베디드 초안 생성) | 미지원 | position은 x·y·page 좌표만 지원합니다. |
사용할 수 있는 필드 타입
| 필드 타입 | Anchor 지원 |
|---|---|
TEXT | 지원 |
SIGNATURE | 지원 |
CHECKBOX, SIGNING_DATE, DATE, IMAGE, DROPDOWN, NAME, COMPANY_NAME, ADDRESS | 미지원 (좌표 기반 사용) |
위치 지정 방식만 달라질 뿐, TEXT의 textStyle·format이나 SIGNATURE의 signatureTypes·enableOneClick 같은 기존 옵션은 Anchor 방식에서도 그대로 사용할 수 있습니다. 참고로 SIGNATURE 필드의 signatureTypes는 위치 지정 방식과 무관하게 필수 값입니다.
사용할 수 있는 파일
Anchor는 문서에서 텍스트를 읽어 위치를 찾기 때문에, 텍스트 정보가 들어 있는 문서 파일에서만 동작합니다.
bmp, gif, jpg, jpeg, png, tiff 등 이미지 파일은 텍스트 정보가 없어 Anchor를 지원하지 않습니다. 이미지 파일에는 좌표 기반 방식을 사용하세요.
주의PDF라고 해서 항상 되는 것은 아닙니다.
종이 문서를 스캔해서 만든 PDF는 확장자만 PDF일 뿐 내용은 그림이라 텍스트 레이어가 없습니다. 이런 파일에서는
Anchor text not found in PDF오류가 발생합니다. OCR로 텍스트 레이어를 넣었거나, 워드·한글 등에서 바로 내보낸 텍스트 기반 PDF를 사용하세요.또한 PDF 생성 시 폰트가 임베딩되지 않으면 텍스트가 깨져 검색되지 않을 수 있습니다. 표준 폰트를 쓰거나 폰트를 임베딩해 PDF를 만드세요.
4. 매칭 규칙 — 필드가 여러 개 생길 수 있습니다
Anchor는 "가장 먼저 찾은 한 곳"에 배치하는 것이 아닙니다. anchor.text와 일치하는 텍스트가 문서에 여러 번 등장하면, 매칭된 개수만큼 동일한 설정의 필드가 자동으로 생성됩니다.
예를 들어 "text": "(인)"으로 지정했는데 문서에 (인)이 3번 등장하면, 같은 설정의 필드가 3개 만들어집니다. 이는 "모든 서명란에 한 번에 배치"할 때는 편리하지만, 의도치 않은 곳까지 필드가 생기는 원인이 되기도 합니다.
dataLabel 자동 넘버링
dataLabel 자동 넘버링매칭이 여러 건일 때 해당 필드에 dataLabel이 지정되어 있으면 자동으로 번호가 붙습니다.
| 매칭 순서 | 생성되는 dataLabel |
|---|---|
| 첫 번째 | 개인정보 동의 서명 (1) |
| 두 번째 | 개인정보 동의 서명 (2) |
| N번째 | 개인정보 동의 서명 (N) |
이때 자동 생성된 dataLabel이 다른 필드의 dataLabel과 겹치면 오류가 발생합니다. dataLabel 값을 정할 때 (숫자) 넘버링 패턴과 충돌하지 않도록 주의하세요.
필드 개수 제한
Anchor로 자동 생성되는 필드도 아래 제한에 포함됩니다.
| 대상 | 최대 개수 |
|---|---|
| 전체 필드 | 2,000개 |
| 서명·도장 필드 | 100개 |
제한을 초과하면 서명 요청이 실패합니다. 매칭 수가 많아질 것 같다면 anchor.text를 더 구체적으로 지정해(예: (인) 대신 근로자 (인)) 매칭 수를 조절하세요.
안내사항Anchor 텍스트는 짧을수록 위험합니다.
(인),서명,날짜처럼 문서 곳곳에 등장할 수 있는 단어는 예상보다 많은 필드를 만들어 냅니다. 운영에 적용하기 전에 실제 문서로 한 번 요청해 보고, 문서 상세 조회(GET /documents/{documentId})나 서명자 입력란 조회(GET /documents/{documentId}/participant-fields)로 몇 개의 필드가 생성됐는지 확인하는 것을 권장합니다.
5. 전체 요청 예시
한 서명 요청 안에서 Anchor 기반 필드와 좌표 기반 필드를 함께 사용하는 예시입니다.
curl -X POST 'https://api.modusign.co.kr/documents' \
-H 'Authorization: Basic {인코딩된 API-KEY}' \
-H 'Content-Type: application/json' \
-d @request.json{
"title": "근로계약서",
"file": {
"fileId": "{업로드한 파일의 fileId}",
"token": "{업로드한 파일의 token}"
},
"participants": [
{
"name": "김모두",
"signingOrder": 1,
"signingMethod": {
"type": "EMAIL",
"value": "[email protected]"
},
"fields": [
{
"type": "SIGNATURE",
"required": true,
"signatureTypes": ["SIGN"],
"position": {
"anchor": {
"text": "근로자 서명",
"offset": {
"x": 0.01,
"y": 0.005
}
}
},
"size": {
"width": 0.15,
"height": 0.05
}
},
{
"type": "TEXT",
"required": true,
"position": {
"anchor": {
"text": "근로자 이름",
"offset": {
"x": 0.08,
"y": 0
}
}
},
"size": {
"width": 0.2,
"height": 0.04
},
"textStyle": {
"size": 12,
"font": "NOTO_SANS",
"align": "LEFT"
}
},
{
"type": "CHECKBOX",
"position": {
"x": 0.05,
"y": 0.8,
"page": 1
},
"size": {
"width": 0.03
}
}
]
}
]
}CHECKBOX처럼 Anchor를 지원하지 않는 필드 타입은 위 예시처럼 좌표 기반으로 지정하면 됩니다. 다만 하나의 필드 안에서 좌표와 Anchor를 동시에 쓸 수는 없습니다.
6. 활용 시나리오
인사 문서 — 인원에 따라 표 행이 늘어나는 계약서
참여 인원 수에 따라 표의 행이 늘어나는 계약서에서, 표 하단의 서명란 텍스트를 기준으로 서명 필드를 배치합니다. 행이 추가되거나 삭제되어도 서명란 텍스트 위치에 맞춰 필드가 자동으로 이동합니다.
회의록 — 참석자·내용에 따라 길이가 달라지는 문서
참석자 수와 회의 내용에 따라 문서 길이가 달라지는 회의록에서, 각 참석자 이름 옆에 서명 필드를 배치합니다. 참석자가 늘어 페이지가 넘어가더라도 이름 텍스트를 기준으로 필드가 배치됩니다.
계약서 — 조항 추가·삭제로 서명 위치가 바뀌는 문서
계약 조건에 따라 항목이 추가·삭제되는 계약서에서, 마지막 페이지의 갑 / 을 텍스트를 기준으로 서명 필드를 배치합니다. 조항이 늘어 서명 위치가 다음 페이지로 밀려도 자동으로 대응됩니다.
7. API 호출 시 주의사항
- 좌표와 Anchor는 상호 배타적입니다. 하나의 필드에서
position에 좌표(x,y,page)와anchor를 동시에 지정하거나, 둘 다 지정하지 않으면400오류가 발생합니다. - 기준 텍스트가 문서에 실제로 있어야 합니다. 대소문자·공백·특수문자가 정확히 일치해야 하며, 찾지 못하면 서명 요청 자체가 생성되지 않습니다.
- 필드가 페이지 영역을 벗어나면 안 됩니다.
offset이 너무 크거나size가 커서 필드가 문서 경계를 넘으면 오류가 발생하고 서명 요청이 생성되지 않습니다. - API KEY는 서버사이드 전용입니다. 브라우저 등 클라이언트에 노출하지 마세요.
- Rate Limit — Standard는 분당 300·초당 10, High-cost는 분당 150·초당 5입니다. 이 문서에서 사용하는 서명 요청(
POST /documents)과 파일 업로드(POST /files)는 모두 High-cost API이므로 대량 발송 시 특히 주의하세요. 초과 시429와 함께X-Retry-After(초)가 반환되므로 그만큼 대기한 뒤 지수 백오프로 재시도하세요. 체험(Trial) 기간에는 한도가 더 낮으므로 API Rate Limit 정책 안내를 확인하세요. - 파일 크기 — 문서 파일은 PDF 최대 10MB, 그 외 확장자 최대 5MB입니다. 문서 파일은 PDF를 권장합니다.
자주 발생하는 오류
| 응답 | 에러 메시지 | 원인 | 해결 방법 |
|---|---|---|---|
| 400 | Position must have either (x, y, page) or anchor, not both or neither | 한 필드에 좌표와 anchor를 함께 지정했거나 둘 다 지정하지 않음 | position에 좌표 또는 anchor 중 하나만 지정 |
| 400 | Anchor text not found in PDF | anchor.text와 일치하는 텍스트가 문서에 없음 | 텍스트 일치 여부 확인, 텍스트 레이어가 있는 문서 사용 |
| 401 | Unauthorized | API KEY 또는 인증 헤더 오류 | API KEY와 Authorization 헤더(Basic 인코딩) 확인 |
| 403 | Usage limit exceeded | API 사용량 소진 | 사용량 한도 확인 또는 플랜 업그레이드 |
| 422 | This file is invalid | 파일 무효 또는 base64 인코딩 오류 | 파일 업로드 API로 올린 뒤 fileId·token 사용 |
| 429 | Too Many Requests | Rate Limit 초과 | X-Retry-After(초)만큼 대기 후 재시도 |
8. 자주 묻는 질문
FAQ
기존 좌표 기반 연동 코드를 수정해야 하나요?
아니요. Anchor는 기존 position + size 기반 배치를 대체하지 않습니다. 기존 연동 코드는 변경 없이 그대로 동작합니다.
한 문서 안에서 좌표 기반 필드와 Anchor 기반 필드를 함께 쓸 수 있나요?
네, 가능합니다. 서명 필드는 Anchor로, 체크박스 필드는 좌표 기반으로 배치하는 식으로 필드마다 다르게 지정할 수 있습니다. 단, 하나의 필드 안에서 두 방식을 동시에 쓸 수는 없습니다.
Anchor를 쓰면 page를 지정하지 않아도 되나요?
네. Anchor 방식에서는 기준 텍스트가 위치한 페이지를 자동으로 감지합니다. 문서 내용이 늘어나 텍스트가 다음 페이지로 밀려도 필드가 따라갑니다. (좌표 기반에서는 position.page를 반드시 지정해야 합니다.)
문서에 동일한 텍스트가 여러 번 등장하면 어떻게 되나요?
매칭된 개수만큼 동일한 설정의 필드가 자동 생성됩니다. 예를 들어 (인)이 문서에 3번 등장하면 필드가 3개 생성됩니다.
dataLabel이 지정되어 있으면... (1),... (2)형태로 자동 넘버링됩니다.- 자동 생성된
dataLabel이 다른 필드의 값과 중복되면 오류가 발생합니다. - 의도한 개수만 만들려면
anchor.text를 더 구체적인 문구로 지정하세요.
이미지 파일(JPG, PNG 등)에서도 Anchor를 사용할 수 있나요?
아니요. bmp, gif, jpg, jpeg, png, tiff 등 이미지 파일은 텍스트 정보가 없으므로 Anchor 기반 배치를 지원하지 않습니다. 이미지 파일에는 좌표 기반 방식을 사용하세요.
템플릿으로 서명 요청할 때도 Anchor를 쓸 수 있나요?
아니요. Anchor는 서명 요청 API(POST /documents)에서만 사용할 수 있습니다. 템플릿으로 서명 요청하는 API(POST /documents/request-with-template)의 요청 본문에는 입력란 위치를 지정하는 position이 없으며, 필드 위치는 템플릿에 저장된 값을 따릅니다. 임베디드 초안 생성 API(POST /embedded-drafts)의 position도 x·y·page 좌표만 지원합니다.
400 Position must have either (x, y, page) or anchor 오류가 발생합니다.
하나의 필드에서 좌표(x, y, page)와 anchor를 동시에 지정했거나, 둘 다 지정하지 않았을 때 발생합니다.
응답 예시:
{
"type": "ValidationFailedException",
"title": "Validation failed",
"instance": "/documents",
"data": {
"constraints": [
{
"property": "participants[0].fields[0].position",
"message": "Position must have either (x, y, page) or anchor, not both or neither"
}
]
},
"detail": "Validation failed with 1 properties: participants[0].fields[0].position"
}- 한 필드에
x·y·page와anchor를 함께 넣고 있지 않은지 확인하세요. - 반대로
position객체에 좌표도anchor도 없는 경우에도 같은 오류가 발생합니다. - 반드시 둘 중 하나의 방식만 사용하세요.
400 Anchor text not found in PDF 오류가 발생합니다.
anchor.text에 지정한 텍스트를 문서에서 찾지 못했을 때 발생합니다.
응답 예시:
{
"statusCode": 400,
"error": "BadRequestException",
"message": "Anchor text not found in PDF"
}- 업로드한 문서에
anchor.text와 동일한 텍스트가 실제로 들어 있는지 확인하세요. - 대소문자, 공백, 특수문자가 정확히 일치하는지 확인하세요.
- 스캔된 이미지 PDF는 텍스트 레이어가 없어 인식되지 않습니다. OCR 처리된 PDF 또는 텍스트 기반 PDF를 사용하세요.
- PDF 생성 시 폰트 임베딩 문제로 텍스트가 깨질 수 있습니다. 표준 폰트를 사용하거나 폰트를 임베딩해 PDF를 만드세요.
주의위 항목을 모두 확인했는데도 오류가 반복된다면 파일 전송 방식을 점검하세요.
file.base64로 인라인 전송하는 경우 인코딩이 어긋나면 파일이 온전히 전달되지 않아 텍스트 검색 자체가 실패할 수 있습니다. 파일 업로드 API(POST /files)로 먼저 업로드한 뒤fileId·token을 사용하는 방식을 권장합니다.
필드가 문서 페이지 영역을 벗어나면 어떻게 되나요?
anchor.offset 값이 너무 크거나 필드 크기가 문서 경계를 넘어서면, 페이지 영역을 벗어났다는 오류가 발생하며 서명 요청이 생성되지 않습니다. offset과 size 값을 조정해 필드가 문서 영역 안에 들어오도록 설정하세요.
더 자세한 API 내용은 API References에서 확인하세요!서명 요청 · 파일 업로드 · 서명자 입력란 조회 의 자세한 내용을 확인하세요.
Updated 2 days ago
