증상
samples/hwpx/form-002.hwpx SVG 출력에서 page 2 상단에 와야 할 "연구개발계획서 제출시…" 부분이 page 1 하단에 표출됨.
재현
cargo build --release
./target/release/rhwp export-svg samples/hwpx/form-002.hwpx -o output/svg/form-002/
# page 1: \"연구개발계획서…\" inner table 이 하단에 보임 (HWP/PDF 기준 page 2)
# page 2: \"산소탑재효율…\" 등 inner table 본문만 표시됨
비교: samples/hwpx/form-002.pdf page 1/2 (정답).
분석
대상 문서 구조 (외부 표 26x27, 셀[73] r=19, c=0, rs=1, cs=27):
- 셀 높이 63539 HWPUNIT (≈847px), 29 paragraphs
- p[28] = 1x1 inner 표 ("연구개발계획서 제출시…"), vpos=25376
- page 1 PartialTable rows=0..20 (cont=false), page 2 rows=19..26 (cont=true) — row 19 이 페이지 분할됨
- HWP 가용량 ≈ 946.8px, rhwp 사용량 925.6px (diff -21.2px)
근본 원인: src/renderer/layout/table_layout.rs::compute_cell_line_ranges() 의 has_table_in_para 분기.
// 2071-2079행
if offset_remaining > 0.0 { /* offset 소비 */ }
else if limit_remaining > 0.0 {
if para_h <= limit_remaining { limit_remaining -= para_h; }
// limit 초과 시 무처리
}
// 2081-2085행
if offset_remaining > 0.0 || (… content_offset 관련) {
result.push((line_count, line_count)); // 스킵
} else {
result.push((0, line_count)); // ❗ 항상 표시
}
가시성 결정 시 limit_remaining 검사가 누락되어, 셀 분할 시 limit 초과 후 등장하는 중첩 표 문단이 무조건 첫 페이지에 표시됨. 일반 문단은 line 루프 내 if limit_remaining <= 0.0 { break; } 로 정상 차단됨.
수정 방향
has_table_in_para 분기에서 content_limit > 0.0 && para_h > limit_remaining 인 경우 atomic 단위로 다음 페이지로 미루기:
} else {
result.push((line_count, line_count)); // 다음 페이지로
limit_remaining = 0.0;
}
영향 범위
- 셀 안에 중첩 표가 있고 셀이 페이지 분할되는 모든 문서
- form 류 / 템플릿 문서에서 빈번할 수 있음
증상
samples/hwpx/form-002.hwpxSVG 출력에서 page 2 상단에 와야 할 "연구개발계획서 제출시…" 부분이 page 1 하단에 표출됨.재현
비교:
samples/hwpx/form-002.pdfpage 1/2 (정답).분석
대상 문서 구조 (외부 표 26x27, 셀[73] r=19, c=0, rs=1, cs=27):
근본 원인:
src/renderer/layout/table_layout.rs::compute_cell_line_ranges()의has_table_in_para분기.가시성 결정 시
limit_remaining검사가 누락되어, 셀 분할 시 limit 초과 후 등장하는 중첩 표 문단이 무조건 첫 페이지에 표시됨. 일반 문단은 line 루프 내if limit_remaining <= 0.0 { break; }로 정상 차단됨.수정 방향
has_table_in_para분기에서content_limit > 0.0 && para_h > limit_remaining인 경우 atomic 단위로 다음 페이지로 미루기:영향 범위