---
name: DSD변환
description: 'DART 에 공시된 감사보고서 · 연결감사보고서(접수번호, DART 에서 받은 PDF, 공시서류원본 xml)를 DART 편집기 파일(dsd)로 바꾼다. 본문(문단 · 표 · 칸 · 숫자 · 서식 표시)은 원문 그대로 두고, 공시 때 빠진 편집기 요소(삽입 위치 13곳 · 목차 · 안내문 · 문서 머리 · meta.xml)와 문단 안 줄바꿈(DART 공시 화면 기준)만 되살린다. 요청하면 다음 기수 초안(당기 숫자를 전기 칸으로, 기수 · 해 +1, 변동표의 새 당기 기초를 작년 기말로)까지 만든다. 회사가 dsd 를 주지 않을 때, 초도 감사라 전기 dsd 가 없을 때, 작년 공시로 올해 dsd 를 시작할 때 쓴다. "다트 보고서 dsd 로", "공시 원문 dsd 변환", "DART 받은 거 dsd 로 바꿔줘", "작년 감사보고서 dsd 로", "전기 dsd 없어", "다트에서 받은 PDF 로 dsd", "접수번호로 dsd", "dsd 변환", "다음 기수 초안", "기초 채워서", "롤포워드 dsd", "DSD변환 어떻게 써", "설치했어"가 언급되면 트리거. dsd 숫자 검증은 DSD푸팅 스킬이다.'
---

# DSD변환

DART 공시 원문 하나만 있으면 된다. 감사 폴더가 없어도 된다. 엔진이 다 하고 AI 판단은 없다. 이 스킬은 명령을 고르고, 결과 줄을 읽어 사용자에게 전한다.

- 엔진: 이 스킬 폴더의 `scripts/`. 감사 엔진에서 dsd 변환과 원고 엑셀에 쓰는 부분만 담았다(`scripts/audit/report/dsd_convert.py` 변환 · `dsd_draft.py` 원고 판독과 롤포워드 · `dsd_draft_book.py` 원고 엑셀 · `dsd_build.py` 원고 → dsd · `dart_fetch.py` OpenDART 받기).
- 명령: `python scripts/run.py <convert · check · build> …`. 스킬 폴더에서 부르고 환경변수 `PYTHONIOENCODING=utf-8` 을 준다. 옵션은 `python scripts/run.py convert -h`.
- 의존성: `pip install -r requirements.txt`(openpyxl · pyyaml).

## 처음 쓰는 사람에게(설치 직후 · 「어떻게 써」)

설치한 뒤 처음 부르거나 「DSD변환 어떻게 써」 라고 하면 아래를 짧게 알려 준다. Claude 에게 보낼 문장으로 적는다(터미널 명령은 적지 않는다). 사용자가 접수번호나 파일을 이미 줬으면 안내 없이 바로 1절부터 돌린다.

1. 「<접수번호> dsd 로 바꿔 줘」 또는 「<DART 에서 받은 PDF · 원문 xml 경로> dsd 로 바꿔 줘」. 결과 폴더를 말하지 않으면 파일 옆(접수번호면 지금 폴더)에 둔다.
2. 다음 해 dsd 를 시작하려면 「다음 기수 초안까지 만들어 줘」. 원고 엑셀도 함께 나온다. 엑셀에서 고친 뒤 「이 원고로 dsd 다시 만들어 줘」.
3. 접수번호 · PDF 로 받으려면 OpenDART 인증키를 환경변수 `DART_API_KEY` 에 둔다(https://opendart.fss.or.kr 에서 발급). 원문 xml 이 이미 있으면 필요 없다.
4. 만든 dsd 는 DART 편집기로 열어 본 뒤에 쓴다.

## 1. 무엇을 받았는지 보고 명령을 고른다

| 가진 것 | 명령 |
|---|---|
| 접수번호(14자리) | `python scripts/run.py convert <접수번호> --out <폴더>` |
| DART 에서 받은 PDF | `python scripts/run.py convert "<PDF>" --out <폴더>` (PDF 이름 · 쪽에서 접수번호를 찾아 원문을 받는다) |
| 공시서류원본 xml | `python scripts/run.py convert "<xml>"` |
| 다음 기수 초안도 | 위 명령에 `--roll` |
| 고친 원고 엑셀 | `python scripts/run.py build "<원고.xlsx>"` |

인증키는 환경변수에서만 읽고 화면 · 파일에 적지 않는다. 받지 못하면 「원문을 받지 못함: …」 으로 종료 코드 2 다.

회사명만 알면 OpenDART 공시 목록(`list.json`, `corp_code`)에서 「감사보고서 (YYYY.12)」 접수번호를 찾아 넣는다. 사업보고서 · 반기보고서 안의 감사보고서는 서식이 달라 바꾸지 않는다(「감사보고서(00760) · 연결감사보고서(00761) 원문만」 으로 멈춘다). 2019년 무렵 이전의 옛 dart3 원문도 받지 않는다.

## 2. 결과

| 파일 | 내용 |
|---|---|
| `<회사>_<결산연도>_감사보고서_변환.dsd` | 원문 그대로 바꾼 dsd. 연결이면 `…_연결감사보고서_변환.dsd` |
| `<회사>_<다음 연도>_감사보고서_초안.dsd` | `--roll` 일 때. 다음 기수 초안 |
| `원고_<회사>_<다음 연도>_감사보고서_초안.xlsx` | 초안의 원고 엑셀. C 열부터 고친다 |
| `원고검사_….json` | 초안을 만들 때의 원고 검사 |

첫 줄에 「본문 원문과 같음」 이 나와야 한다. 「다름」 이면 종료 코드 1 이고 그 dsd 를 넘기지 않는다. `python scripts/run.py check <원문 xml> <변환.dsd>` 로 다시 보고 보고한다.

## 3. 사용자에게 전할 것

1. 만든 파일과 첫 줄(서식 · 회사 · 결산일 · 삽입 위치 수 · 본문 같음 · 되살린 줄바꿈 수).
2. DART 편집기 5.1 에서 열린다(2026-11-06 확인: 감사보고서 · 연결감사보고서 둘 · 다음 기수 초안 모두 목차 · 재무제표 · 주석 · 외부감사 실시내용이 보이고, 파일형식 검사의 구조 검사를 넘는다). 편집기에서 재무제표마다 [재무제표 > 재무제표 검사] 를 돌린 뒤 파일형식 검사를 하라고 전한다. 공시 원문에는 그 검사 기록이 없어 처음 검사 때 「재무제표 검사를 다시 하여야 합니다」 가 뜬다. 재무제표 검사가 회사가 만든 계정(계정코드 `99999999999999`)을 「표준과 다릅니다」 로 짚으면 편집기에서 표준 계정과 짝짓는다(회사가 저장한 원래 dsd 에서도 같은 줄이 나온다). `--bare` 판은 편집기가 「오류가 발견되어 문서를 열 수 없습니다」 로 거절하니 쓰지 않는다.
3. 결과 줄의 알림을 그대로 옮긴다.
   - 연결 감사보고서: 편집기 샘플이 없어 별도 틀을 연결 이름으로 바꾼 추정 틀이다. 2026-11-06 편집기에서 연결 두 건(라이브러리 표 · 직접 만든 표)이 열렸고 구조 검사를 넘었다.
   - 「감사보고서」 FILENAME 추정: 감사인의 감사보고서 라이브러리 파일 이름은 확인한 편집기 파일에 없었다.
   - 「직접 만든 표」: K-IFRS 회사처럼 재무제표를 라이브러리 표가 아닌 일반 표로 만든 원문이다. 재무제표 삽입 위치는 비워 두었다.
   - 「공시 화면이 없어 … 줄바꿈을 되살리지 못했다」: 공시 원문 xml 에는 문단 · 칸 안 줄바꿈이 없다. 접수번호 · PDF 로 받으면 같은 보고서의 DART 공시 화면(`<이름>.view.html`)도 받아 화면대로 되살린다. xml 만 받았으면 공시 화면을 원문과 같은 폴더에 `<원문 이름>.view.html` 로 두거나 `--view` 로 준다. 화면을 받지 못해도 변환은 되고, 편집기에서 긴 문단이 한 줄로 이어져 보일 뿐이다.
   - 「그림 n개 … dsd 에 들어가지 않았다」: 공시서류원본 zip 에는 그림 파일이 없다. 상장사 내부회계관리제도 운영실태보고서 · 부정위험 내부통제 붙임이 그림으로 들어 있어, 그대로 편집기에서 열면 파일형식 검사가 「이미지 파일 형식이 올바르지 않습니다」 로 막는다. 회사에서 그림 파일을 받아 편집기에서 그 그림을 지우고 다시 넣는다.
   - 상장사는 감사보고서 · 연결감사보고서가 사업보고서 접수번호 안에 붙어 있다(`<접수번호>_00760.xml` · `_00761.xml`). 정정 사업보고서 접수번호에는 붙임이 없을 수 있어 원래 사업보고서 접수번호로 받는다.
4. 요약 코드(자산총계 · 감사의견 구분 등)는 원문 값 그대로다. 당기 감사에 쓸 때는 편집기 「문서 헤더정보」 에서 고친다. 이 스킬은 감사의견을 정하지 않는다.

`--roll` 이면 이어서:

5. 롤포워드 표 수 · 기초 채운 칸 수와 「옮기지 않았다」 줄. 당기 · 전기를 찾지 못한 표, 자본변동표, 날짜별 변동 내역처럼 줄이 해마다 다른 표는 손대지 않는다. 화면에는 안내 30줄 · 원고 검사 20줄만 나오고, 전체는 `초안안내_<원고>.txt` 에 있다(「… 외 n건」 줄이 그 파일을 가리킨다).
6. 기초를 채운 곳: 변동표(머리 「기초 · … · 기말」, 또는 첫 칸 「기초 · 기말」 줄)의 새 당기 기초는 작년 당기 기말이다. 당기 · 전기 열을 둔 한 표에 「기초금액 · 기말금액」 줄이 있으면 새 전기 기말을 새 당기 기초로 넣는다. 두 표의 열이 다르면 머리 이름으로 맞춰 옮기고, 열 수가 같은데 이름만 다른 열(「1년 미만」 · 「3개월 미만」)은 같은 자리 열로 옮기고 알린다. 전기 표에만 있던 열과 작년 당기에 없던 줄은 비운다(재작년 숫자가 남지 않게).
   - 기간 표시를 읽는 곳: 표 위 문단 앞머리, 문단 끝에 붙은 머리(「… 같습니다.5.2.1 당기말」), 표 위 한 줄 표, 표 왼쪽 위 칸(「당 기」 · 「전 기」). 「(전기말)」 표시만 있고 앞 표에 표시가 없으면 첫 열 머리와 열 수가 같을 때 앞 표를 당기 표로 본다. 「당기와 전기 중 …」 처럼 두 기간을 함께 말하는 문단과 「(*) 전기는 …」 각주는 기간 표시로 읽지 않는다. 머리에 당기 · 전기 열이 다 있는 표는 다른 표와 짝짓지 않는다.
   - 당기말 · 전기말 · 전기초 세 기간 표(K-IFRS 최초 채택 · 재작성 해)는 당기말을 전기말 열로 옮기고 전기초 열은 비운다. 그 열은 편집기에서 지우라고 전한다. 기간마다 범주 열 수가 다른 표는 기간을 뗀 열 이름으로 맞춘다. 「당기손익-공정가치 측정」 같은 범주 이름의 「당기」 는 기간으로 세지 않는다.
   - 기초 · 기말이 줄로 놓인 변동표의 새 당기 기초는 같은 표의 작년 기말 줄에서 가져온다. 표의 줄이 모두 재작년 줄이어도 마지막 줄은 남기고 숫자만 비운다(줄 없는 표는 편집기가 열지 않는다).
   - 안내의 주석 번호는 dsd 의 절 차례다. 회사가 한 절 안에 「13. 부가가치의 내역」 처럼 다른 번호 제목을 문단으로 넣었으면 안내는 앞 절 번호(주석12)로 적는다.
   - 작년 전기가 감사받지 않은 숫자였으면(초도 감사) 괄호 · 따옴표로 감싼 「(감사받지 않은 재무제표)」 표시를 표지 · 재무제표 · 주석에서 지운다. 감사보고서 기타사항처럼 문장으로 적은 것은 고치지 않고 알린다.
7. 그대로 남은 것: 감사인의 감사보고서, 외부감사 실시내용, 문단 속 날짜 · 금액은 작년 글이다. 외부감사 실시내용의 「감사대상 사업연도」 칸만 표지 기간과 함께 다음 해로 옮긴다(둘이 다르면 편집기 파일형식 검사가 막는다). 원고 엑셀에서 고치고 `build` 로 다시 만든다. 고친 판의 숫자는 DSD푸팅 스킬로 검증한다.

## 변환이 바꾸는 것

공시 원문은 편집기 dsd 의 본문(contents.xml)과 같은 dart4 꼴인데 편집기 요소를 걷어 낸 판이다. 같은 보고서의 공시 원문과 편집기 저장 파일을 견주어 다른 곳 다섯을 찾았고, 변환은 그 다섯만 되돌린다.

| 번호 | 편집기 dsd | 공시 원문 | 변환 |
|---|---|---|---|
| 1 | `DOCUMENT-HEADER` 가 서식 이름 · 판 · 회사명 · 요약 코드를 감싼다 | 감싸개 없음 | 감싼다 |
| 2 | `TOC` 가 목차 제목 · 목차 표 · 쪽 나눔을 감싼다 | 감싸개 없음 | 감싼다 |
| 3 | 삽입 위치(INSERTION) 13곳. 라이브러리로 넣은 절은 그 안에 `LIBRARY > FILENAME` | LIBRARY 만 남음 | 13곳을 편집기 차례대로 되살리고 원문 LIBRARY 를 맞는 곳에 넣는다 |
| 4 | 안내문(WARNING) 둘 | 없음 | 편집기와 같은 위치에 둔다 |
| 5 | 라이브러리가 넣은 재무제표 제목에만 ENG | 2025년 공시부터 목차 · 절 · 표지 칸에도 ENG | LIBRARY 에 들지 않은 요소의 ENG 를 뺀다 |

공시 원문에서 빠진 문단 · 칸 안 줄바꿈(편집기의 `&cr;`)은 공시 화면이 있으면 화면대로 되살린다. 글자 · 숫자 · 요소는 그대로이고 「본문 원문과 같음」 은 줄바꿈 표시를 빼고 견준다. 빈 문단 줄바꿈은 화면에도 없어 되살리지 않는다(세로 여백만 다르다). meta.xml 은 원문 머리에서 만든다.

## 하지 않는 것

- 원문 글 · 숫자를 고치지 않는다. 바꾸는 것은 위 다섯 가지와 공시 화면대로 되살린 줄바꿈뿐이다.
- 고객 dsd · 원고 엑셀을 저장소나 공유 폴더에 올리지 않는다.
