DSD변환 · git:20261104.5b1ed25 · 2026-11-04 · sha256 72ac21dbfba8ceca

DSD변환 git:20261104.5b1ed25A

Immutable. This exact content never changes and is served at /api/v1/blob/72ac21dbfba8ceca.

---
name: DSD변환
description: 'DART 에 공시된 감사보고서 · 연결감사보고서(접수번호, DART 에서 받은 PDF, 공시서류원본 xml)를 DART 편집기 파일(dsd)로 바꾼다. 본문(문단 · 표 · 칸 · 숫자 · 서식 표시)은 원문 그대로 두고, 공시 때 빠진 편집기 요소(삽입 위치 13곳 · 목차 · 안내문 · 문서 머리 · meta.xml)만 되살린다. 요청하면 다음 기수 초안(당기 숫자를 전기 칸으로, 기수 · 해 +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 편집기로 열어 목차 · 재무제표 · 주석이 보이는지 본 뒤 쓴다. 엔진은 편집기가 파일을 받는지 알 수 없다. 열리지 않으면 `--bare` 판(뼈대 없이 문서 머리와 meta.xml 만 더한 판)도 열어 보라고 한다.
3. 결과 줄의 알림을 그대로 옮긴다.
   - 연결 감사보고서: 편집기 샘플이 없어 별도 틀을 연결 이름으로 바꾼 추정 틀이다.
   - 「감사보고서」 FILENAME 추정: 감사인의 감사보고서 라이브러리 파일 이름은 확인한 편집기 파일에 없었다.
   - 「직접 만든 표」: K-IFRS 회사처럼 재무제표를 라이브러리 표가 아닌 일반 표로 만든 원문이다. 재무제표 삽입 위치는 비워 두었다.
4. 요약 코드(자산총계 · 감사의견 구분 등)는 원문 값 그대로다. 당기 감사에 쓸 때는 편집기 「문서 헤더정보」 에서 고친다. 이 스킬은 감사의견을 정하지 않는다.

`--roll` 이면 이어서:

5. 롤포워드 표 수 · 기초 채운 칸 수와 「옮기지 않았다」 줄. 당기 · 전기를 찾지 못한 표, 자본변동표, 날짜별 변동 내역처럼 줄이 해마다 다른 표는 손대지 않는다.
6. 기초를 채운 곳: 변동표(머리 「기초 · … · 기말」, 또는 첫 칸 「기초 · 기말」 줄)의 새 당기 기초는 작년 당기 기말이다. 두 표의 열이 다르면 머리 이름으로 맞춰 옮기고, 전기 표에만 있던 열과 작년 당기에 없던 줄은 비운다(재작년 숫자가 남지 않게).
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 를 뺀다 |

원문의 빈 문단 줄바꿈은 공시 때 빠져 되살리지 않는다(화면의 세로 여백만 다르다). meta.xml 은 원문 머리에서 만든다.

## 하지 않는 것

- 원문 글 · 숫자를 고치지 않는다. 바꾸는 것은 위 다섯 가지뿐이다.
- 고객 dsd · 원고 엑셀을 저장소나 공유 폴더에 올리지 않는다.