# 01_수집지침 — 원문 수집·갱신 작업 절차 (W1~W7) > 법령·행정규칙·표준시방서·교본 **원문(`original/`)의 수집·변환·품질점검·색인 갱신** 절차서. AI가 그대로 실행한다. > 전체 지도: [README.md](README.md) · 기술문서 작성 규칙: [00_운영지침.md](00_운영지침.md) · 실무 분석: [02_분석지침.md](02_분석지침.md) > 사방 원문 특기: 사방기술교본은 ToUnicode 교정으로 텍스트 추출 가능한 `한글교정.pdf`가 원본이다. 교정 방법·검증은 [원문/사방기술교본_한글교정_작업가이드.md]() 참조. 교본시점 대조 기준일은 임도(2019-12-31)와 달리 사방은 교본 2023 발행이라 의미가 약함 — 현행본 위주로 사용. ## 1. 작업 순서 ### W1. 갱신 대상 판별 목록 md의 `시행일`을 국가법령정보센터 현행본과 대조한다. 다른 항목만 W2로 넘긴다. 같으면 종료. ### W2. 원문 수집 | 용도 | 요청 | |---|---| | 현행본 검색 | `lawSearch.do?OC=<키>&type=XML&target=law\|admrul&query=<명칭>` | | 연혁 목록 | 법령 `target=eflaw` / 행정규칙 `target=admrul&nw=2` | | 본문 | `lawService.do?target=law&MST=<법령일련번호>` / `target=admrul&ID=<행정규칙일련번호>` | | 파일 | 링크 앞에 `https://www.law.go.kr` 를 붙이고 `User-Agent` 헤더를 넣는다 | - 검색 결과는 이름이 유사한 다른 법령을 섞어 준다. **정확 일치 → 접두 일치 순으로 고른다.** - 기존 판본을 덮어쓰지 않는다. `현행_새시행일.*` 로 **추가**한다. - XML의 `개정문`·`제개정이유`를 `CHANGELOG.md`에 덧붙인다. - 별표는 `별표단위/별표서식PDF파일링크`로 받는다. ### W3. 첨부파일 수집 — 생략 금지 **고시·훈령은 본문이 껍데기다.** 본문에 `~은 별표와 같다`만 있고 별표 PDF가 `자세한 내용은 상단 메뉴 버튼을 이용하십시오` 안내문인 경우가 많다. - XML `첨부파일/첨부파일링크` 를 전건 받아 `첨부/` 에 저장한다. - 별표 PDF의 문자 수가 120자 미만이거나 `자세한 내용은` 을 포함하면 안내문이다. `별표서식파일링크`(HWP)를 함께 받는다. - **본문 md가 500자 미만이면 첨부를 못 받은 것으로 간주하고 W3을 다시 수행한다.** - **첨부 zip 처리**(`extract_zip.py`): 첨부에 zip이 있으면 `[압축] <이름>/` 로 해제한다. zip 엔트리명이 CP949 mojibake면 `encode("cp437").decode("cp949")` 로 복원한다. 내부 HWP/HWPX는 md로 변환(`hwpx_text`)하고 `index_zip.py` 로 `_목록.md` 를 만든다. - **구형 HWP 표 복원**: `hwp5_text.extract_items` 가 HWP5 레코드 스트림에서 표(CTRL_HEADER `b" lbt"`='tbl ' → TABLE 레코드의 열수 → LIST_HEADER마다 셀 → PARA_TEXT)를 md 표로 재구성한다. 셀 병합은 열수 기준 순차 배치로 근사한다. 서로게이트·사설글리프는 인코딩 전 제거한다. ### W4. PDF → Markdown 변환 `별표/*.pdf`, `첨부/*.pdf` 를 같은 폴더에 같은 이름의 `.md` 로 변환한다. - 표는 `find_tables()`로 뽑되, **표로 못 만들거나 원문 문자 커버리지가 0.90 미만이면 표 취급을 취소하고 텍스트로 되돌린다.** (표 영역 텍스트를 본문에서 제외하기 때문에, 취소하지 않으면 그 내용이 통째로 사라진다.) - 한 셀에 여러 줄이 들어간 행은 세로로 겹쳐진 행이다. 비어있지 않은 셀의 줄 수가 모두 같으면 그 수만큼 행으로 분리한다. - 본문 계층은 `Ⅰ. / 1. / 가. / (1) / (가) / 1) / 가) / ①` 마커 등장 순서로 스택을 쌓아 결정한다. 들여쓰기 픽셀로 판단하지 않는다. - **줄바꿈 이어붙이기**: PyMuPDF는 구조적 줄의 들여쓰기를 텍스트 안에 넣고 x0는 좌측 여백에 둔다. **x0가 좌측 여백보다 큰 줄만 앞줄에서 넘어온 조각**이므로 앞줄에 그대로 붙인다. - 붙일 때 공백을 새로 넣지 않는다. 원문은 줄이 공백에서 끊기면 꼬리 공백을 남기므로 그대로 이어붙이면 맞는다. - **이미지**: PDF 내 그림(40px 이상)은 `pic/` 에 PNG로 추출하고 본문 위치에 `![그림](../pic/…)` 로 인라인 삽입한다(`pdf2md.py`). - **HWPX 첨부**는 `hwpx_text.py` 로 재추출한다(공백·표·글상자·계층 보존). 글상자(단일셀 표) → 인용블록, `제N장`/`N-N-N.`→헤딩, `1./가./(1)/①`→중첩 리스트. 구형 `.hwp` 는 `hwp5_to_md`(표 없는 문서만). - **법령 본문 이미지**: XML 조문에 인라인된 `` / ``(수식·그림)를 `fix_law_images.py` 로 `pic/` 에 내려받아 `![그림](pic/…)` 로 로컬화한다. `id` 값은 `flDownload.do?flSeq=` 로 받는다. ### W5. 문서 품질 점검·보정 변환만으로 끝내지 않는다. 아래를 검사하고 문제가 남으면 보정한다. | 검사 | 방법 | 조치 | |---|---|---| | 문자 손실 | `정규화(md)/정규화(pdf) ≥ 0.985` | 미달이면 W4 표 처리 재검토 | | 줄 누락 | PDF 각 줄의 앞 12자가 md에 있는지 | 누락 시 해당 표·문단 재변환 | | **공백 소실** | 한글 12자 이상 연속 덩어리 비율 > 0.15 | HWP를 PDF로 뽑을 때 공백이 사라진 원본이다. **같은 폴더의 HWPX에서 다시 변환한다** | | **표 셀 순서 왜곡** | 값은 있는데 원문 줄 순서와 어긋남 | 수량·단가표에서 치명적이다. HWPX `/` 로 재변환한다 | | 표 구조 | 구분선 존재, 행별 열 수 일치 | 불일치 행 수정 | | 음절 분리 | `가 나 다` 형태의 글자 단위 공백 | 병합 | - HWPX는 ZIP + `Contents/section*.xml` 이다. `` 가 텍스트, `/` 가 표이며 공백과 병합 정보가 온전하다. **PDF보다 우선한다.** - 구형 `.hwp`(바이너리)는 전용 라이브러리 없이 읽을 수 없다. 읽지 못하면 PDF본을 유지하고 `_meta.md`에 결함을 기록한다. - **판독 불가한 값을 추정해서 채우지 않는다.** 공백·표 구조를 임의로 지어내는 것도 금지다. ### W6. 색인 갱신 `04_참조_법령기준_목록.md`의 **`## 5. 원문 md 색인` 절만** `gen_md.py`로 재생성한다. - **2026-08-15 변경**: 04 문서 전체 재생성 금지. 등록표(§1~§4)와 큐레이션 절(§6~§11)은 수기 관리(사방·조달수수료 등 수기 행 보존) — 스크립트는 `` 마커 사이만 갱신하며, 마커가 없으면 실행을 거부한다. - 등록표에 신규 원문을 추가할 때는 §2 등 해당 절에 **수기로 행 추가** (번호 이어붙임, 재부여 금지) + §11 통계 갱신. - `시행일`·`개정일`·`확보`·`소관` 둘째 줄(실제 내려받은 출처)을 반영한다. - **확인하지 않은 출처는 적지 않는다.** 받지 못한 항목의 출처 칸은 비운다. - 종료 조건: 링크 깨짐 0, 표 열 수 이상 0, 마커 밖 내용 무변경. ### W7. 조달청 제비율 수집 (법령정보센터 밖 — 별도 경로) 조달청 시설공사 원가계산 간접공사비(제비율) 적용기준은 법령·행정규칙이 아니라 **국가법령정보센터에 없다.** 수집 방법: 1. 1차: 조달청 누리집 게시판(시설총괄과 발표). 2차(실사용): **한국표준품셈정보원 자료실**(kseis.co.kr → 자료실에서 "조달청 제비율" 검색) — 변경 시마다 토목/건축/국가유산 xlsx 재게시됨. 첨부 다운로드 URL 형식: `kseis.co.kr/bbs/data/dataFileDown.do?bbs_seq=&file_no=1`(1=토목). 2. 저장: `행정규칙/토목공사원가계산 제비율 적용기준/첨부/YYYY.MM.DD_조달청_토목공사_제비율.xlsx` + 정리본 `현행_YYYYMMDD.md` (기존 판본 덮어쓰지 않고 추가). 3. **갱신 주기: 수동.** 연초(1월) 확인 필수 + 분기 1회 권장 — 2026년에만 3회(01.01/03.13/04.13) 변경된 전례. 변경 확인 시 `technical_info/01_임도/05_원가정보/제비율.md`도 함께 갱신. ## 2. 불변 규칙 - 원문 파일은 수정하지 않는다. 오류가 있어도 그대로 두고 별도로 기록한다. - `교본시점_*` 과 `임도기술교본/` 은 대조 기준이므로 갱신하지 않는다. - 명칭이 바뀌어도 `_meta.md` 의 법령ID는 불변이다. 추적 키로 쓴다. - 폐지·승계된 법령은 폴더를 지우지 않는다. 승계 관계를 `_meta.md`·`CHANGELOG.md` 에 남기고, 폐지 전 판본도 함께 보관한다. ## 3. 처리 방침 (2026-08-09 결정) - [x] **수집·변환 스크립트 저장소 이관 완료** — `original/_pipeline/` 에 최종본 배치. 경로는 폴더 위치 기준 상대라 어디서든 실행된다. 스크립트↔워크플로 대응은 `_pipeline/README.md` 참조. (단, `docs/` 는 `.gitignore`로 원격 제외 = 로컬 볼트. 원격 백업이 필요하면 별도 처리) - [x] **구형 HWP 판독 = 해결** — 이전에 "구형 `.hwp`는 바이너리라 못 읽는다"고 적었으나, `_pipeline/hwp5_text.py`(olefile 기반)로 실제 추출에 성공했다. 임도시설공사 표준시방서 2016.12 HWP를 이 방식으로 읽어 교본 15.4와 83% 일치를 확인함. - [x] **임도시설공사 표준시방서 확보** — HWP 원본 + 설명 md. 본문은 교본 15.4(2020, 더 최신)를 최종본으로 본다. `표준시방서/임도시설공사 표준시방서/_meta.md` 참조. ### 보류 (필요 시 재개) - [ ] **미수집 3건 보류** — 자연휴양림 처리지침 / 중기운용관리예규 / 예산편성기준. 인용 수가 적고 실무 비중 낮음. 진행하다 필요해지면 추가, 불필요하면 목록에서 삭제. - [x] **토목공사원가계산 제비율 — 수집 완료** (2026-08-12) — 조달청 2026.04.13판 xlsx + 정리 md. 수집·갱신 절차는 §W7. 이후 변경분은 수동 갱신. - [ ] **KS 45건 현상 유지** — 메타데이터(◐)만 확보. 원문은 DRM이라 무료 경로 없음. 특정 KS 원문이 필요해지면 그때 다른 방법(뷰어 열람·구매)을 찾는다. - [x] **공백 소실 첨부 md — 해결** — HWPX 원본 11건을 `_pipeline/hwpx_text.py` 로 재추출(공백·표·박스·계층 복원). 산림사업 표준품셈은 표 2438개·헤딩 503개·박스 35개로 완전 복원, 띄어쓰기 0.0. 별표 16건도 `fix_spacing.py` 로 프로즈 띄어쓰기 복원. - [ ] **별표 프로즈 공백 잔여 8건** — 대기환경보전법 자동차 별표 등 주변 문서. 표·수치는 정상, 프로즈만 공백 붙음(판독·검색 가능). md 문단이 HWP보다 길게 병합되거나 서식 이미지 기반이라 자동 복원 한계. 산안비 별지1은 2026-08-17 HWP·PDF 대조로 표 복원 완료. `_품질점검_보고서.md` 참조. ### 갱신 운영 - 갱신 주기·실행은 **사용자가 결정**한다. 자동 스케줄 없음. 사용자가 수동 작업을 요청하면 `_pipeline` 스크립트로 W1~W6을 수행한다. 조달청 제비율은 §W7 별도 경로.