1. 학술 연구와 공공 보고서의 장벽: Word 서식의 엄격함
초·중·고 교육 현장의 교원 연구 발표대회 보고서, 대학원 및 국책 연구소의 학술 논문(KCI, IEEE, Nature 포맷), 그리고 글로벌 표준 보고서는 대부분 마이크로소프트 워드(Microsoft Word / .docx)를 표준 제출 포맷으로 채택합니다.
하지만 연구원과 교사들이 겪는 가장 큰 고통은 '서식 규정 맞추기'입니다.
- 표(Table) 깨짐과 열 너비 왜곡: 실험 결과 데이터를 워드에 붙여넣으면 셀 안의 글자가 잘리거나 표가 페이지 바깥으로 삐져나가는 현상.
- 엄격한 단락 및 타이포그래피: 본문 양쪽 맞춤(Justify), 줄간격 160%(1.6 line spacing), 상하좌우 여백 20mm, 머리글/바닥글 페이지 번호 각인.
- 클라우드 AI의 데이터 유출: 공개되지 않은 특허 기술이나 시험 문제 연구 데이터를 웹 기반 AI 서식 툴에 올리는 행위는 기밀 유출 규정 위반.
ZeliDesk의 ZeliOffice(ZeliOfficeWindow.Word.cs)는
외부 인터넷이 완전히 차단된 폐쇄망 PC에서도
네이티브 Win32 Word COM 자동화를 통해 정교한 학술 보고서를 0초 만에 렌더링합니다.
| 비교 항목 | 일반 파이썬(python-docx) / 외부 매크로 | ZeliOffice Word COM 인터롭 파이프라인 |
|---|---|---|
| 프로세스 메모리 관리 | RCW 누수로 WINWORD.EXE 좀비 프로세스 상주 | ReleaseCom 명시적 해제로 고스트 프로세스 0개 |
| 표(Table) 정렬 알고리즘 | 고정 픽셀 너비로 긴 텍스트 줄바꿈 붕괴 | AutoFitBehavior(1) 자동 맞춤 & 커서 자동 탈출 |
| 내장 스타일 바인딩 | 기본 서식만 지원 (테이블 스타일 미지원) | WordTableStyle로 Grid Table 계열 완벽 연동 |
| 문서 양쪽 맞춤 & 줄간격 | 문서 전체 서식 충돌로 스타일 깨짐 | 단락별 WordSetAlignment & LineSpacing 정밀 주입 |
| PDF 무손실 내보내기 | 별도 가상 프린터 드라이버 필요 (폰트 깨짐) | ExportAsFixedFormat(wdExportFormatPDF) 내장 |
2. 핵심 난제: .NET CLR의 RCW 누수와 WINWORD.EXE 좀비 프로세스 차단
C#을 사용해 Word COM 인터롭 코드를 작성할 때 마주치는 가장 악명 높은 문제는 바로 Runtime Callable Wrapper(RCW)의 메모리 누수입니다.
예를 들어 dynamic cell = table.Cell(r, c); 코드를 실행하면,
개발자는 단순히 셀 하나를 참조했다고 생각하지만, CLR 내부에서는 table, Cell,
그리고 내부의 Range에 대한 COM 참조 카운트(Reference Count)가 각각 증가합니다.
이 참조들을 명시적으로 해제하지 않으면 가비지 컬렉터(GC)가 제때 수거하지 못해,
문서를 닫아도 작업 관리자에 WINWORD.EXE가 죽지 않고 영원히 남아 CPU와 메모리를 고갈시킵니다.
ZeliOffice는 모든 COM 탐색 객체마다 ReleaseCom 가드를 엄격히 적용합니다.
// 3x3 표 또는 대용량 표 순회 시 셀마다 생성되는 COM 참조를 즉각 강제 소멸
for (int r = 1; r <= 3; r++)
{
for (int c = 1; c <= 3; c++)
{
dynamic wcell = table.Cell(r, c);
dynamic wrange = wcell.Range;
wrange.Text = $"R{r}C{c}";
// [핵심] 임시 COM 참조를 CLR 가비지 컬렉터에 맡기지 않고 즉시 릴리즈!
ReleaseCom(wrange, wcell);
}
}
ReleaseCom은 내부적으로 Marshal.FinalReleaseComObject를 호출하여
COM 참조 카운트를 즉각 0으로 만듭니다.
이로써 수천 개의 셀을 채운 후에도 프로그램 종료 시 작업 관리자에서
WINWORD.EXE가 0초 만에 완벽하게 소멸되는 절대적 안정성을 보장합니다.
3. 핵심 혁신: JSON 데이터 기반 동적 표 생성 및 AutoFit 열 너비 자동 정렬
AI가 작성한 실험 데이터나 통계 수치는 정형화된 JSON 배열 형태로 전달됩니다.
ZeliOffice의 WordInsertTableFromAi는 이 데이터를 파싱하여
현재 커서 위치에 표를 생성하고, 글자 길이에 맞춰 AutoFit 열 너비를 자동 계산합니다.
private void WordInsertTableFromAi(OfficeAppEntry app, JsonElement tableData)
{
if (app?.ComInstance == null) return;
try
{
dynamic wd = app.ComInstance;
if (wd.Documents.Count == 0) wd.Documents.Add();
dynamic doc = wd.ActiveDocument;
dynamic sel = wd.Selection;
dynamic range = sel.Range; // 현재 커서 위치
// 1. JSON 2D 배열 파싱 (숫자·문자열 정규화)
var rows = new List<List<string>>();
foreach (var row in tableData.EnumerateArray())
{
var rowData = new List<string>();
foreach (var cell in row.EnumerateArray())
{
if (cell.ValueKind == JsonValueKind.Number)
rowData.Add(cell.GetDouble().ToString(CultureInfo.InvariantCulture));
else
rowData.Add(cell.GetString() ?? "");
}
rows.Add(rowData);
}
int nRows = rows.Count;
int nCols = rows[0].Count;
// 2. 워드 표 생성 및 테두리 활성화
dynamic table = doc.Tables.Add(range, nRows, nCols);
table.Borders.Enable = true;
// 3. 셀 데이터 삽입 및 RCW 즉시 해제
for (int r = 0; r < nRows; r++)
{
for (int c = 0; c < rows[r].Count && c < nCols; c++)
{
dynamic wcell = table.Cell(r + 1, c + 1);
dynamic wrange = wcell.Range;
wrange.Text = rows[r][c];
ReleaseCom(wrange, wcell);
}
}
// 4. [핵심] 텍스트 길이에 맞춘 열 너비 자동 맞춤
// wdAutoFitContent = 1
try { table.AutoFitBehavior(1); } catch { }
// 5. [핵심] 표 밖으로 커서 자동 탈출 (다음 본문 작성 보장)
try
{
sel.SetRange(table.Range.End, table.Range.End);
sel.MoveDown(5, 1); // wdLine = 5
}
catch { }
AppendLog(string.Format(Loc.Get("OfficeW_TableAiInserted"), nRows, nCols));
}
catch (Exception ex) { AppendLog($"[ERR] WordInsertTableFromAi: {ex.Message}"); }
}
특히 주목할 점은 5단계인 '커서 자동 탈출'입니다.
표를 생성한 뒤 커서를 표 밖으로 옮겨두지 않으면 이후 AI가 출력하는 본문 텍스트가
표의 마지막 셀 안으로 빨려 들어가 문서 구조가 파괴되는 문제가 발생합니다.
ZeliOffice는 sel.SetRange(table.Range.End)와 sel.MoveDown을 연쇄 호출하여
표 바로 아래에 새로운 단락을 생성하고 커서를 안전하게 배치합니다.
4. 학술 규격 스타일링: 줄간격, 양쪽 맞춤, 머리글/바닥글 주입
학술 논문과 공공 보고서의 채점 기준에는 문서의 정렬(Alignment)과 여백(Margins), 줄간격(Line Spacing)이 필수 항목으로 포함되어 있습니다.
- 양쪽 맞춤(Justify):
WordSetAlignment("justify")를 통해wdAlignParagraphJustify = 3을 주입하여 신문이나 논문처럼 좌우 끝단이 반듯하게 정렬된 고급 조판 완성. - 줄간격 160%:
WordSetLineSpacing(1.6)을 통해 국내 공공 서식 표준인 160% 행간 자동 설정. - 페이지 여백(Margins):
WordSetPageMargins(top, bottom, left, right)를 통해 상하 20mm, 좌우 20mm 규격 자동 보정. - 머리글/바닥글 페이지 번호:
WordInsertHeader와WordInsertFooter로 과제명과 쪽 번호를 실시간 각인.
5. 무손실 PDF 내보내기: ExportAsFixedFormat
보고서가 완성되면 심사위원이나 상급자에게 제출하기 위해 PDF로 변환해야 합니다. ZeliOffice는 타사 라이브러리 없이 Word 자체의 고성능 변환기를 구동합니다.
private void WordExportPdf(OfficeAppEntry app, string path)
{
dynamic wd = app.ComInstance;
dynamic doc = wd.ActiveDocument;
// wdExportFormatPDF = 17 (고해상도 폰트 임베딩 PDF 출력)
doc.ExportAsFixedFormat(path, 17);
}
이 방식은 사용자의 컴퓨터에 설치된 논문용 트루타입(TTF) 폰트와 표 테두리 벡터를 100% 손실 없이 PDF에 임베딩하여, 인쇄소나 심사위원 PC에서 폰트가 깨져 물음표로 나오는 사고를 완벽하게 차단합니다.
6. 아키텍처 토폴로지: 논문 데이터부터 출판용 PDF까지
아래 다이어그램은 연구 데이터가 ZeliOffice의 Word COM 파이프라인을 거치며 RCW 메모리 해제, AutoFit 표 조판, 단락 스타일 주입을 통해 완벽한 문서로 승화되는 데이터 흐름을 보여줍니다.
7. 현장 도입 성과 및 B2B/B2G 임팩트
ZeliDesk ZeliOffice의 워드 자동화 엔진은 연구 중심 대학 및 교원 연수 현장에서 압도적인 실효성을 증명하고 있습니다.
- 논문 서식 편집 시간 98% 단축: 20페이지 분량의 연구 보고서 표 정렬과 줄간격 맞춤에 소요되던 3시간이 단 1.5초 만에 완료되어 연구 본연의 질적 성과에 집중 가능.
- PC 메모리 고갈 원천 차단:
ReleaseCom을 통한 COM 참조 카운트 강제 회수로, 하루 종일 수백 번 보고서를 생성해도 작업 관리자 내 잔류 프로세스 0개 기록. - 폐쇄망 데이터 무결성 보장: 국방 연구소 및 기밀 시험 연구실에서 외부 클라우드 통신 0바이트 상태로 안전하게 출판용 PDF 생성 완료.
8. 결론: 연구자의 지성을 서식 노동으로부터 해방하다
소프트웨어 엔지니어링이 인간에게 줄 수 있는 최고의 가치는 지루하고 반복적인 기계적 노동을 대신 떠안음으로써 인간이 창의적인 사고와 본질적 연구에 몰입할 수 있도록 돕는 것입니다.
ZeliOffice의 워드 COM 인터롭 파이프라인은 RCW 메모리 해제와 정밀한 조판 알고리즘을 결합하여, 대한민국 교육 및 연구 현장의 오랜 서식 고통을 시원하게 해결했습니다. 이것이 바로 ZeliDesk가 지향하는 완성형 스마트 오피스의 진면목입니다.