DocPilot 은 HWP·HWPX·DOCX·PPTX·XLSX 등 업무 문서를 열어 편집하고, 오른쪽 패널의 AI 에이전트에 수정을 요청하는 Windows 데스크톱 앱입니다. 1.4.0 은 영어 화면, 엑셀 시트 탭, 프레젠테이션 발표자 도구, 설치하지 않은 글꼴 불러오기를 더하고 DOCX·PPTX·한글 문서의 표시를 원래 프로그램의 출력에 맞춘 판입니다. 이 글은 항목별 구현 방식과 확인한 범위, 남은 한계를 정리합니다.

영어 화면: 사전 기반 번역과 남은 한글 점검
언어 설정은 자동, 한국어, English 세 가지입니다. 자동은 브라우저 언어(navigator.language)가 ko 로 시작하면 한국어, 그 밖에는 영어로 정합니다. 번역은 화면 문자열의 한국어 원문을 키로 하는 사전 하나(web/i18n.js)에서 처리하고, 영어 값이 없는 문자열은 한국어 그대로 보입니다. 언어를 바꾸면 새로고침 없이 화면이 바뀌고 설정은 저장됩니다.
문서 본문, 파일 이름, 대화 본문, 시트 이름처럼 문서와 사용자가 만든 내용은 번역하지 않습니다. 데스크톱 쪽(Rust)에서는 네이티브 대화상자의 제목과 필터, 창 제목을 같은 설정에 맞춰 바꿉니다.
누락을 찾기 위해 Playwright 로 영어 화면에서 홈, 문서 열기, 알림, PDF, 에이전트 대화, 비교 화면, 열기 오류 등을 순회하며 화면에 남은 한글을 세는 점검 스크립트를 두고, 0건이 될 때까지 사전을 채웠습니다. 이 점검에서 홈과 최근 작업의 대체 문구, 빈 노트 안내가 번역되지 않은 결함 2건이 나와 고쳤습니다.
알려진 한계. 엔진 내부의 기술적인 오류 메시지 일부는 영어 화면에서도 한국어로 나옵니다. 에이전트에 보내는 프롬프트는 한국어를 유지하며, 영어 화면의 첫 화면 표시 때 한국어가 잠깐 보일 수 있습니다. 언어를 바꿔도 홈 목록의 상대 시각은 다시 만들지 않습니다.
엑셀 시트 탭: 시트를 구역 단위로 보이고 숨기기
엑셀 문서의 시트는 시트마다 구역 하나로 렌더링됩니다. 이전에는 모든 시트가 세로로 나열되기만 했고, 1.4.0 은 화면 아래에 시트 탭 줄을 추가했습니다. 탭을 누르면 그 시트만 보이고(시트별 보기), 전체 보기를 켜면 모든 시트가 이어서 나열됩니다. 시트별 보기에서는 시트마다 스크롤 위치를 기억하며 배율은 그대로 유지합니다. 같은 문서를 다시 열어도 보기 상태가 유지됩니다.
구현의 핵심은 시트를 화면에서 빼는 방식입니다. 보이지 않는 시트는 삭제하지 않고 data-off 속성을 붙여 흐름 밖의 보이지 않는 상자로 둡니다. 구역 번호와 내용이 그대로 남으므로 편집, 저장, 되돌리기, 측정 동작이 시트 보기 상태에 영향을 받지 않습니다. 숨김 시트는 엔진이 시트 이름 끝에 (숨김) 을 붙여 전달하고, 화면은 이 표기로 판별합니다. 숨김 시트 보기를 켜면 숨김 시트가 흐린 탭으로 목록에 들어가며 Ctrl+PgUp, Ctrl+PgDn 으로 시트를 옮길 수 있습니다.
확인 범위. 인쇄 배치, 편집, 되돌리기 동작을 확인했습니다.
프레젠테이션: 노트, 발표자 보기, 레이저 포인터와 펜
- 슬라이드 노트: PPTX 와 ODP 에서 노트를 추출해 구역 정보로 보관합니다. 노트 창은 접기·펼치기와 높이 조절을 지원하고 보고 있는 슬라이드를 따라갑니다. 노트 편집은 구현하지 않았고 읽기 전용입니다.
- 발표자 보기: 현재·다음 슬라이드, 노트, 경과 시간, 슬라이드 번호, 이동 단추를 보여 줍니다. V 키, Alt+F5, 리본 단추로 엽니다.
- 레이저 포인터와 펜: L 키나 Ctrl 을 누르는 동안 레이저 포인터가 나타나고, 펜·형광펜·지우개와 색 선택을 지원합니다. 잉크는 슬라이드별로 보관하며 쇼를 끝내면 폐기합니다.
- 전환음: PPTX 의 전환음을 엔진에서 추출해 재생합니다.
- 예전 형식 PPT: 이진 형식 PPT 의 슬라이드 전환과 문단별 애니메이션을 재생합니다. 문단별 단계 애니메이션의 대상 선택자를 고쳤고, 방향이 없는 분할 전환에는 OOXML 기본값(바깥쪽)을 적용합니다.
확인 범위와 한계. 발표자 도구는 Edge 헤드리스 환경에서만 확인했고 Tauri 데스크톱 앱에서는 확인하지 않았습니다. ODP 와 이진 PPT 의 전환음은 지원하지 않으며, 발표자 보기는 단일 창 위에 겹쳐 그리는 방식이라 청중용 별도 화면이 없습니다. 이진 PPT 에서는 PowerPoint 97 방식의 애니메이션 정보, 2010 이후 전용 전환, p14:dur, 상호작용 시퀀스를 아직 구현하지 않았습니다.
설치하지 않은 글꼴을 이 PC 의 파일에서 직접 불러오기
문서가 지정한 글꼴이 Windows 에 설치되어 있지 않아도 이 PC 의 다른 위치에 파일이 있으면 그 파일을 그대로 씁니다. 후보는 시스템과 사용자 설치 글꼴, 한컴오피스의 공유 글꼴 폴더(자동 탐색), 파일 탭의 글꼴 폴더에서 사용자가 추가한 폴더입니다. 설치되지 않은 글꼴은 local() 조회를 하지 않고 파일 바이트를 읽어 적재합니다. 폴더 탐색은 폴더당 3000개 파일과 사용자 폴더 20개로 제한하며 드라이브 루트, 네트워크 경로(UNC), 없는 경로는 거절합니다. 글꼴을 Windows 에 설치하거나 복사하지 않습니다.
없는 글꼴을 비슷한 글꼴로 바꿔 그리는 대체 규칙(KoPub돋움체 대신 KoPubWorld돋움체, 라틴 글꼴 Calibri 대체 등)은 제거했습니다. 1.3.0 글에서 이후 변경으로 밝힌 내용입니다. 글꼴이 이 PC 어디에도 없으면 엔진이 지정한 CSS 폴백으로만 그립니다.
글꼴 파일을 실제로 읽으면서 확인한 문제는 다음과 같습니다.
| 글꼴 | 증상 | 처리 |
|---|---|---|
| 한컴바탕·한컴돋움 | cmap 형식 4 의 마지막 구간 idDelta 가 0 이라 Chromium 의 글꼴 검증기(OTS)가 Range glyph reference too high 로 거절 | 읽을 때 idDelta 를 1 로 고치고 체크섬을 다시 계산(repair_cmap) |
| 나눔고딕(.ttf) | 비어 있는 TSI0~TSI3 표 때문에 OTS 가 TSI3: zero-length table 로 거절 | 빈 표를 제거(drop_empty_tables) |
| 나눔고딕 굵은 글 | Bold 의 OS/2 굵기가 600, ExtraBold 가 700 이라 굵게(700)에 ExtraBold 가 선택됨 | 가족 면을 직접 등록해 굵기를 바로잡음(boldPlan) |
| KoPub돋움체 Medium 등 굵기가 이름에 든 가족 | 면이 하나뿐이라 굵게가 합성 굵게로 그려짐 | 같은 타이포 가족의 Bold 면을 그 이름의 굵은 면으로 추가 |
굵은 글이 실제 굵은 면 파일로 그려지는지는 면별 파일 바이트를 대조하는 측정 도구로 판정했고, 측정한 시료 전체에서 굵은 파일이 있는데 합성 굵게로 그려진 글꼴은 0건이었습니다. 돋움, 돋움체, HY신명조, HY헤드라인M 처럼 굵은 면 파일이 없는 글꼴은 합성 굵게가 남습니다.
문서에 내장된 글꼴 복원
PPTX 의 ppt/fonts/*.fntdata 는 MTX 로 압축한 EOT 이고, DOCX 의 word/fonts/*.odttf 는 GUID 로 난독화(XOR)한 글꼴입니다. 1.4.0 은 둘을 일반 글꼴 파일(sfnt)로 복원해 문서의 글꼴 이름으로 등록합니다. MTX 복원기는 W3C MTX 명세를 따라 LZCOMP 와 적응형 허프만 부호를 풀고 CTF 형식의 glyf, cvt, loca 표를 다시 구성합니다. 시험한 PPTX 의 내장 글꼴 14면은 전부 복원되었고 윤곽 좌표가 원본 글꼴과 100% 일치했습니다.
알려진 한계. 문서에 쓰인 글자만 담은 부분 집합 글꼴은 누락된 글자를 다른 글꼴로 보충하지 않습니다. 문서를 바꿔 열 때 이전 문서의 내장 글꼴이 남아 새 문서의 글꼴 판정에 영향을 주던 문제는 열기 전에 해제하도록 고쳤습니다.
DOCX: 수식, 자동 하이픈, 부유 표, 줄 단위 쪽 나눔
- 수식: OMML 수식(
m:oMath,m:oMathPara)을 MathML 로 변환해 표시합니다. 이전에는 수식이 통째로 사라졌습니다. 분수, 첨자, 루트, n항 연산자, 괄호, 행렬, 연립식, 악센트, 막대, 테두리 상자를 지원하며 저장할 때는 원본 OMML 을 그대로 유지합니다. - 자동 하이픈:
settings.xml의autoHyphenation,hyphenationZone,doNotHyphenateCaps와 문단의suppressAutoHyphens를 읽습니다. 하이픈 구역을 넘는 빈 폭이 남은 줄의 첫 낱말에 Liang 패턴(en-us)으로 소프트 하이픈을 넣어 끊습니다. 한 시료의 8쪽은 기준 출력과의 쪽 상관값(아래 측정 절 참고)이 0.624 에서 0.941 로 올랐습니다. - 글자 단위 들여쓰기:
w:ind의leftChars,firstLineChars,hangingChars등을 문단 글자 크기 기준으로 환산합니다(100 이 1글자). Word 는 글자 단위 값이 있으면 twip 값을 무시하므로 스타일을 병합할 때 하위 수준의 글자 단위 값을 지웁니다. - 쪽 경계 줄 단위 나눔: 쪽 아래의 본문 문단을 통째로 넘기지 않고 줄 단위로 나눕니다.
widowControl은 기본으로 켜진 것으로 보아 앞뒤 쪽에 2줄 이상을 남기고,keepLines, 그림, 표 칸 문단은 통째로 넘깁니다. - 쪽 기준 부유 표:
tblpPr의vertAnchor=page로 쪽에 고정된 표가 앞 표 아래에 이어 붙어 머리말과 겹치던 문제를 고쳤습니다. 표의 쪽 위 끝 거리를 읽어 새 쪽 본문이 시작된 뒤 그 위치에 놓습니다.
PowerPoint·한글 문서의 글자 위치를 쪽 단위 측정으로 보정
측정 방법은 원래 프로그램(PowerPoint, 한컴 한글)이 내보낸 PDF 를 96dpi 이미지로 바꾼 기준과 화면 렌더를 쪽마다 비교해 밝기 상관값을 구하는 것입니다. 0.95 미만인 쪽을 미달로 세었고, 원인은 기준 PDF 의 낱말 좌표와 화면 DOM 의 위치를 대조해 글줄 단위 오차로 확정했습니다. 원인 한 가지를 고칠 때마다 PPTX 7건과 DOCX 6건의 평균이 0.004 넘게 내려가지 않는지, 쪽 수가 바뀌지 않는지, cargo test 가 통과하는지를 함께 확인하고 어느 하나라도 어기면 되돌렸습니다.
PPTX 에서 고친 것은 다음과 같습니다.
- 줄 간격 100% 초과 문단의 첫 줄 기준선: CSS 는 글자 상자를 줄 상자 가운데에 두어 기준선이 줄 높이의 절반에 글꼴 올림·내림 차의 절반을 더한 위치에 놓이지만, PowerPoint 는 기준선을 줄 높이의 75% 에 둡니다. 이 차이만큼 첫 줄을 내려 보정했고 한 시료의 미달이 13쪽에서 9쪽으로 줄었습니다.
- 글 크기가 섞인 줄: 모든 조각을 위쪽에 맞추면 작은 조각이 줄 위로 붙으므로, 크기 차가 0.375pt 이상이면 한 기준선에 맞춥니다.
- 줄 바꿈 폭: 정렬 반대쪽으로 1px 넓혀, 상자 폭을 0.86px 넘던 마지막 글자가 다음 줄로 넘어가던 문제를 해소했습니다(3쪽 0.914 에서 0.963).
- 도형 글 영역과 표: 프리셋 도형의 글 영역 안쪽 여백을 반영하고, 표 바깥 테두리의 중심선이 도형 경계보다 1~2px 아래·오른쪽에 그려지던 문제를 고쳤습니다.
- 자간과 가운데 맞춤: 자간(
spc, 1/100pt)을 정수 퍼센트로 자르지 않고 pt 값으로 보존하고, 고정 줄 간격 마지막 문단의 가운데 맞춤 묶음 높이를 PowerPoint 규칙으로 바로잡아 제목 글의 세로 위치 약 8px 오차를 없앴습니다.
한글 문서에서 고친 것은 다음과 같습니다.
- 표: 왼쪽 바깥 여백 누락, 겹친 테두리를 절반 안쪽에 배치하는 규칙, 1px 미만 선의 농도 보정과 정수 두께 통일을 한컴 규칙에 맞췄습니다.
- 굵은 글: 번호와 글머리표 라벨이 문단의 굵게를 상속해 폭이 늘던 문제를 고치고, 굵은 면이 없는 글꼴의 굵게는 합성 굵게 대신 한컴식 글자 윤곽선(0.02em)으로 그립니다.
- 맞춤 문단: 가운데·오른쪽 정렬 문단에서 줄 끝 공백이 정렬 폭에 들어가 글이 왼쪽으로 밀리던 문제를 고쳤습니다.
- 글줄 기준선: 본문 글줄이 한컴 기준선보다 평균 0.5~1px 위에 놓이던 잔여 오차를 0.5px 보정으로 줄였습니다.
대상 4건의 측정 결과는 다음과 같습니다.
| 시료 | 미달 쪽(전 → 후) | 쪽 상관 평균(전 → 후) |
|---|---|---|
| PowerPoint 행사 자료 18쪽 | 13 → 4 | 0.9288 → 0.958 |
| PowerPoint 자료 14쪽 | 2 → 0 | 0.9801 → 0.984 |
| 한글 연차 보고서 46쪽 | 39 → 38 | 0.8776 → 0.9203 |
| 한글 확인서 16쪽 | 15 → 13 | 0.8024 → 0.9201 |
| 합계 | 69 → 55 |
알려진 한계. 한글 문서는 평균이 크게 올랐지만 미달 쪽이 많이 남았습니다. 남은 55쪽 가운데 글줄이 모두 짝을 이루고 세로 오차가 0.6px 이하여서 글자 래스터(안티앨리어싱) 차이로 상한에 걸렸을 가능성이 큰 쪽은 18쪽입니다. 나머지는 글줄 짝이 어긋나거나 위치 오차가 커서 배치 오차가 남아 있을 수 있습니다. 효과가 없었던 시도(잠긴 문단을 일반 문단으로 그리기, 쪽 나눔 간격에 위 여백 더하기)는 되돌렸습니다.
평가에서 제외한 쪽. DOCX 시료 6건은 Word 가 만든 기준 PDF 가 KoPub돋움체를 맑은 고딕으로 대체해 출력해 글꼴이 달라, 화면이 올바른 글꼴을 써도 점수가 내려갑니다. 이런 기준 출력 결함 쪽과 목차 필드 오류 문구가 찍힌 쪽 168쪽은 미달 집계에서 제외했습니다. 글꼴을 흉내 내지 않는 원칙에 따라 대체 글꼴로 다시 재는 방법은 택하지 않았습니다.
제목 표시줄과 작업 표시줄 아이콘
제목 표시줄과 창 제목에 버전(DocPilot 1.4.0)을 표시하고, 열린 문서의 형식(12개 형식군)에 맞춰 제목 표시줄과 브라우저 탭 아이콘, 창의 작업 표시줄 아이콘을 바꿉니다. MSIX 패키지에는 resources.pri 를 만들어 크기별 로고가 쓰이게 해서, 작업 표시줄 아이콘 배경이 강조색으로 칠해지던 문제를 고쳤습니다.
정리
1.4.0 은 영어 화면, 엑셀 시트 탭, 프레젠테이션 발표자 도구, 글꼴 파일 직접 적재와 내장 글꼴 복원을 더하고 DOCX·PPTX·한글 문서의 표시를 쪽 단위 측정으로 보정한 판입니다. 발표자 도구는 데스크톱 앱에서 확인하지 않았고, 한글 문서의 미달 쪽은 연차 보고서 38쪽과 확인서 13쪽이 남았습니다. 이후 작업은 남은 배치 오차의 원인을 같은 방식으로 좁히는 것입니다.