최초 확인: npm kordoc@4.22.2, main b964335. 원본과 최종 Markdown을 대조한 두 사례다. 4.22.5에서 아래 PDF 번호 6종을 복원했다. HWP5의 공동 범위를 나타내는 HTML 선 출력은 남는다. 문서 전체의 완전 복원 판정은 아니다.
원본은 「관세법 제71조에 따른 할당관세의 적용에 관한 규정」 별표3, 2026-06-30 개정본이다. 기관 제공 PDF는41쪽이다.
- 공식 HWP, SHA256
6ec5473ed801bae2ba7bf46c0842412859b7386c4d65148ec345be851537129d - 공식 PDF, SHA256
8a0c0e87e87ebfe839f61e5520783da141fa6b5fba0ed5bb12049198b245ea54
PDF1~4쪽의 21,000톤·200,500톤·커피의 ‘수입 전량’은 좁은 별도 열의 괄호선으로 공통 범위를 나타낸다. 수량 셀의 rowspan만으로 범위를 판단하면 안 된다. 예를 들어 커피 수량의 rowspan2는 첫 품목 자체의 두 원시 행만 덮으며, 다음 디카페인 품목까지 덮지 않는다.
재현:
npm ci
npm run build
node dist/cli.js /path/to/quota.hwp --html-tables -o /tmp/quota-visual.md
node dist/cli.js /path/to/quota.hwp --html-tables --keep-layout-tables --keep-empty-cols -o /tmp/quota-keep.md
node --import tsx --test tests/table-rule-rows.test.ts원본 HWP5는502행9열, 명시셀3,239개다. DocInfo의 BORDER_FILL을 통해 좁은 열7의 선이 CELL_EDGES까지 전달된다. 원시 셀 (28,7)은 빈 문자열이지만 네 변이 있고 두 행에 걸친 괄호 중심 셀이다.
확인한 문제는 두 단계다.
- 기본 visual 모드의 빈행 접기가 괄호 중심 셀을 삭제한다. 빈 행 경계는 기존처럼 접되, 가로·세로 선이 만나며 다음 행까지 걸친 빈 셀과 그 변 정보는 압축된 격자 안에 보존한다. 압축 후 한 칸이고 시작·끝 행/열 경계가 기존 경계 집합에 모두 있을 때만 모서리를 남겨 논리 격자를 바꾸지 않는다. 넓거나 높게 남는 빈 병합틀, 범위 전체가 빈 칸, 한 행짜리 여백과 연속 세로선, 숨겨진 누름틀은 기존대로 접는다.
- HTML 직렬화가 원본 셀의 보이는/없는 변과 좁은 열의 기하를 출력하지 않는다. 이 부분은 아직 해결하지 않았다. 빈 셀을 보존하는 수정만으로 공동 수량의 Markdown 의미 보존이 완성됐다고 주장하지 않는다. 원문 병합을 임의로 늘리거나 수량을 다른 품목에 추론 배치하는 해결은 피한다.
후속 수정은 원본 변·기하의 IR 직렬화, 선을 출력하는 HTML, roundtrip/markdown-units.ts의 HTML 재현 계약을 함께 다뤄야 한다. 격자 압축으로 원시 rowspan2가1이 될 수 있으며, 셀과 변 정보 보존이 원본의 높이·품목 사이 교차 위치까지 보존한다는 뜻은 아니다. CSS를 제거하는 뷰어의 한계도 명시해야 한다.
원본은 정책브리핑 「청년일자리 회복방안」23쪽 PDF다. 공개 게시물.
- PDF SHA256:
d9f4f07b6e33604f4c1ad0d85b2d1b76089a2292dd21fd8312ea2f8ef0ef5e78 - 대응 원본 HWPX에는
U+F02B1~U+F02B6번호6종이 있다. - 최초 확인한 2·9쪽의 12곳을 포함해 23쪽 전체에서 6종×5개, 총30곳을 복원한다. 같은 번호의 별도 5쪽 보도자료는 다른 파일이며 변경0이다. 같은 쪽의 삼각 글머리표는 기존처럼 별도로 복원된다.
PDF ToUnicode는 서로 다른 번호 CID10·12·14·15·16·17을 모두 U+F000으로 내보낸다. 내장 원본 폰트에는 cmap/post가 없어 원래 사설 코드를 그대로 역산할 수 없다. PDF.js의 임시 fontChar 번호를 문자에 하드코딩해서는 안 된다.
4.22.5는 pdf/known-font-glyphs.ts에서 설치 원본 HBatang.TTF의 native cmap F02B16과 모든 윤곽 좌표·순서·oncurve·upm·advance가 정확히 일치한 경우를 식별한다. Haansoft Batang과 Haansoft-Batang 이름만 허용하고 HCRBatang은 구분한다. 기존 공용 PUA 정책에 따라 ①⑥를 출력하며 문서 ID·CID·임시 fontChar 번호를 식별 조건에 쓰지 않는다. 글꼴 원본은 배포하지 않고 수치 윤곽으로 회귀 검사한다. 실행 시 별도 원본 글꼴 설치는 필요 없으며 PDF에 포함된 글꼴 데이터와 내장 지문을 사용한다. 유니코드가 이미 있는 글자와 흐름 개수 불일치 보호는 유지한다.
범용 숫자 윤곽 인식이 추가된 것은 아니다. 미등록 글꼴·다른 버전의 다른 윤곽은 여전히 복원하지 못할 수 있다. 원본 대조·전수 결과·한계
숫자 텍스트와 셀 개수가 맞아도 선이 나타내는 적용 범위는 누락될 수 있다. 원본 HWP 레코드와 공식 PDF의 선을 함께 확인해야 한다. 모수·정답·평가기·제외 조건을 바꾸어 이 두 누락을 성공으로 계산하지 않는다. 실제 기관 문서는 저장소에 추가하지 않았고 합성 회귀 fixture만 포함한다.
최초 4.22.2 검증 기록은 다음과 같다. 최신 4.22.5 검증은 위 보고서를 따른다.
- 최종 통합 테스트: 4,031개 중 4,022개 통과, 9개 스킵. 타입 검사·빌드 통과.
- 모서리 보존·여백·넓고 높은 빈 병합틀·범위 전체가 빈 칸·조직도 배선 경계·숨겨진 누름틀 회귀 7/7 통과.
- 같은 정답·평가기·모수의 annex 게이트 통과: HWP 346/346·cell F1 1, PDF 342/346·cell F1 0.99697. 544개 채점행은 기준
b964335와 지표가 같다. - 원시
(28,7)과(374,7)셀은 같은 객체·변 정보를 유지한 채 visual(22,7)과(322,7)에 놓이며 rowspan은2→1이다. 표는 기준과 같은416×9이고, 살아남은2,840개 원시 셀의 점유 슬롯 충돌은 없다. 초기안의418행·HWP345/346 회귀는 빈 행 경계와 셀 보존을 분리하여 해결했다.