증상
samples/2025년 기부·답례품 실적 지자체 보고서_양식.hwpx 1쪽 하단에 다음 표(pi=22, 3×3, "<2025년 기부·답례품 실적 분석보고서 요약>")의 첫 행이 잘려 들어가고 제목 텍스트가 본문 영역 끝에 겹쳐서 그려진다. PDF 원본은 표 전체를 2쪽으로 미룬다.
원인
src/renderer/pagination/engine.rs::split_table_rows 가 페이지에 들어갈 첫 행 높이를 mt.row_heights[0] (rs=1 셀만 집계, 17.27px)로 판정.
- 행 0의 rowspan=2 셀(35.4px, 제목 셀)이 분할 단위 산정에서 누락.
- 19px 잔여 공간 ≥ 17.27px → 행 0을 페이지 1에 배치 → rowspan 셀이 19px 안에 들어가지 못해 시각적으로 잘려 그려짐.
src/renderer/height_measurer.rs:
row_heights 산출(line 466 등): cell.row_span == 1 필터.
is_row_splittable(line 1144), min_first_line_height_for_row(line 1156): 모두 동일 필터.
기대 동작
PDF/한글과 동일하게 rowspan 묶음 단위로 분할 가능 여부를 판정하여 첫 블록(행 0+1, 35.4px)이 잔여 공간에 들어가지 않으면 표 전체를 다음 페이지로 넘겨야 한다.
수정 방향
분할 가능 단위를 "행" → "rowspan 묶음 블록"으로 확장:
MeasuredTable::row_block_for(row) 추가: 주어진 행에서 시작하는 rowspan>1 셀의 종료 행까지를 한 블록으로 반환 ((start_row, end_row, block_height)).
split_table_rows의 first_row_h를 블록 높이로 교체 (행 0이 rowspan=2 셀 시작점이면 행 0+1 합산 높이 35.4px).
find_break_row도 블록 경계만 허용 (rowspan 중간에서 잘리지 않도록 결과를 다음 블록 경계로 스냅).
- 회귀 테스트: 본 샘플 + 기존 표 분할 테스트(
tests/, pagination/tests.rs::test_typeset_page_break) 모두 통과.
재현
./target/debug/rhwp export-svg "samples/2025년 기부·답례품 실적 지자체 보고서_양식.hwpx"
# output/2025년 기부·답례품 실적 지자체 보고서_양식_001.svg 1쪽 하단에
# "<2025년 기부·답례품 실적 분석보고서 요약>" 텍스트가 그려짐
증상
samples/2025년 기부·답례품 실적 지자체 보고서_양식.hwpx1쪽 하단에 다음 표(pi=22, 3×3, "<2025년 기부·답례품 실적 분석보고서 요약>")의 첫 행이 잘려 들어가고 제목 텍스트가 본문 영역 끝에 겹쳐서 그려진다. PDF 원본은 표 전체를 2쪽으로 미룬다.원인
src/renderer/pagination/engine.rs::split_table_rows가 페이지에 들어갈 첫 행 높이를mt.row_heights[0](rs=1 셀만 집계, 17.27px)로 판정.src/renderer/height_measurer.rs:row_heights산출(line 466 등):cell.row_span == 1필터.is_row_splittable(line 1144),min_first_line_height_for_row(line 1156): 모두 동일 필터.기대 동작
PDF/한글과 동일하게 rowspan 묶음 단위로 분할 가능 여부를 판정하여 첫 블록(행 0+1, 35.4px)이 잔여 공간에 들어가지 않으면 표 전체를 다음 페이지로 넘겨야 한다.
수정 방향
분할 가능 단위를 "행" → "rowspan 묶음 블록"으로 확장:
MeasuredTable::row_block_for(row)추가: 주어진 행에서 시작하는 rowspan>1 셀의 종료 행까지를 한 블록으로 반환 ((start_row, end_row, block_height)).split_table_rows의first_row_h를 블록 높이로 교체 (행 0이 rowspan=2 셀 시작점이면 행 0+1 합산 높이 35.4px).find_break_row도 블록 경계만 허용 (rowspan 중간에서 잘리지 않도록 결과를 다음 블록 경계로 스냅).tests/,pagination/tests.rs::test_typeset_page_break) 모두 통과.재현