Task #356 페이지 분기 오버플로 수정 (vpos 권위값/spacing 누적 오차)#360
Conversation
- 페이지 3 (pi=39 vpos_end=68681 → pi=40 vpos=500), 페이지 29 (pi=572 → pi=573 vpos=500) 두 지점에서 인접 문단 vpos 리셋 확인 - 현재 SVG 35페이지 vs PDF 37페이지, LAYOUT_OVERFLOW 5+건 발생 - 수행계획서/구현계획서/단계 1 보고서 작성
- detect_inter_paragraph_vpos_reset(prev, cur) 함수 추가 - 조건: 두 문단 모두 line_segs 보유, 같은 column_start, cur.vpos < prev.vpos_end - 단위 테스트 6개 통과 (회귀 0)
- detect_inter_paragraph_vpos_reset 헬퍼 pub 으로 공개 - pagination::engine 메인 루프에 헬퍼 호출 추가 (process_page_break 직후) - typeset.rs Task edwardkim#321 위치에 보조 트리거로 통합 (다단 회귀 방지) - 헬퍼 정의 정제: prev.last.vpos_end → prev.first.vpos 비교 - 본 샘플 LAYOUT_OVERFLOW 5+건 → 0건 - exam_eng 다단 샘플 회귀 0 - aift.hwp overflow 30 → 16 (47% 감소, 12p 추가) - cargo test --release 1014+14+25+6+1+1 PASS, 0 FAIL
- 본 샘플 SVG diff: 4개 파일만 변경 (page 3/4, 29/30) - vpos 리셋 지점과 정확 일치 - 골든 SVG 6/6 PASS, 픽셀 회귀 0 - 다중 샘플 비교: 본 샘플 100% 해결, exam_eng/math 회귀 없음 - aift 잔여 16건 overflow 분석: 12건 표분할 관련(별개 경로), 4건 page 35 별도 패턴
- 명시 증상 100% 해결, 회귀 0, 골든 SVG 0건 변경 - aift.hwp 부수 효과: +12 페이지 / overflow 47% 감소 - 잔여 과제: aift PartialTable 분할 (별도 이슈), PDF 페이지수 일치 (별도 추적)
- TypesetState 에 page_vpos_base, suppress_next_inter_para_advance 필드 추가 - typeset_paragraph 에 HWP authoritative overflow 검증 (last_seg.vpos+lh+ls > body) → 강제 advance - vpos 권위값 기반 current_height drift 보정 (TAC 표 누적 drift 해소) - prev_was_partial / suppress 플래그 가드로 분할 후 / force_advance 후 인접 문단 inter-para 검사 회귀 방지 - 본 샘플 페이지 수 35 → 37 (PDF 일치), pi=39 page 3 → page 4 이동 - aift overflow 16 → 4 (87% 감소) - 골든 SVG / 다단 / 전체 회귀 0
- 본 fix 의 vpos 보정/force_advance 로 마지막 빈 문단(예: 본 샘플 pi=629 \\r 만 포함)이 단독으로 새 페이지를 차지하는 현상 발생. - typeset_section 종료 직전 cleanup: 마지막 페이지가 (단=1, 항목=1, FullParagraph, text 모두 공백/CR/LF, 컨트롤 없음) 이면 페이지 삭제. - PartialParagraph 는 분할된 다행 문단 일부이므로 trim 대상 제외 (synthetic 테스트 보존). - 본 샘플: 37 → 36 페이지 (마지막 빈 페이지 제거). - cargo test 1014+14+25+6+1+1 PASS, 0 FAIL.
current_items 의 첫 항목에서 para_index 추출하는 .and_then(|item| match { ... Some(...) })
를 .map(|item| match { ... }) 로 단순화. 동작 동일.
…ape_item 이중 emit 제거 증상: 2025년 기부·답례품 실적 보고서_최종형태 확정.hwpx p7 의 pi=51 차트가 동일 좌표·동일 base64 데이터로 SVG 에 두 번 emit 되어 겹쳐 보임. 원인: - paragraph_layout.rs:2008-2049 (빈 문단 + TAC offsets 분기) 가 인라인 Picture 를 emit 하지만 set_inline_shape_position 미호출. - layout.rs:2552-2596 의 Task edwardkim#347 분기가 같은 Picture 를 또 emit. - 두 분기 모두 빈 문단·TAC Picture 케이스에서 동시에 발동. 수정 (A안): - paragraph_layout 의 빈 문단 + TAC Picture 분기에서 emit 직후 set_inline_shape_position 호출. - layout_shape_item 의 Task edwardkim#347 분기에서 inline_shape_position 이 이미 등록된 경우 ImageNode push 를 스킵하고 result_y 만 갱신. 검증: - 기부 보고서 p7 차트 emit 1회 (pi=51 + pi=57 ci=1, 각 1회) - cargo test --release: 1008+ passed, 0 failed - form-002, k-water-rfp, exam_eng, exam_math, kps-ai 핵심 5종 LAYOUT_OVERFLOW 신규 0건 (kps-ai 4건은 사전 존재) closes edwardkim#376
증상: "2025년 기부·답례품 실적 지자체 보고서_최종형태 확정.hwpx" p7 에 PDF 정답상 p8 의 원형 차트(pi=57 ci=1, bin_id=6) 가 (5)금액별 기부건수 표 바로 아래에 잘못 emit 되어 페이지 분리가 어긋남. 원인: pi=57 은 빈 문단 안에 TAC Table(ctrl[0], ls[0]) + TAC Picture(ctrl[1], ls[1]) 두 컨트롤. typeset.rs:994-1001 의 Shape/Picture/Equation 분기는 fit 체크 없이 무조건 PageItem::Shape 를 push 했다. 문단 시작부의 height_for_fit 가드도 composed.lines (빈 텍스트 → 1 line) 만 반영해 ls[1] (차트) 높이를 누락. 수정: - TAC 컨트롤에 한해 자체 line_seg 의 line_height 를 산출 (line_seg 인덱스 = 이전 TAC 컨트롤 수) - current_height + ctrl_h > available_height 이면 advance + ensure_page - ctrl_h 만큼 current_height 누적해 후속 항목의 fit 판단 보정 검증: - 보고서 p7 차트 1개 (막대만, pi=51), p8 차트 1개 (원형, pi=57 ci=1) - 보고서 LAYOUT_OVERFLOW 40 → 30 (개선) - form-002, k-water-rfp, exam_eng, exam_math, kps-ai 회귀 0 - cargo test --release: 1008+ passed, 0 failed closes edwardkim#378
증상: 2025년 기부·답례품 실적 보고서_최종형태 확정.hwpx p1 하단에 pi=22 (3x3, 헤더 셀 row_span=2 "<요약>") 의 헤더만 잘못 split 되어 표시. PDF 정답은 표 전체를 p2 에 배치. 원인: typeset_block_table 의 첫 행 fit 가드(line 1289) 가 row_heights[0] (첫 행 단독 높이) 만 비교. row 0 에 row_span>1 셀이 있으면 그 셀의 실제 차지 높이는 row 0..rs 의 합인데, 이 점이 가드에 미반영 → 헤더만 fit 으로 판단 → split 진입 → rs 셀이 두 페이지에 걸쳐 깨짐. 수정: - row 0 에서 출발하는 row_span>1 셀의 atomic 높이 (row_heights[0..rs].sum + cell_spacing*(rs-1)) 를 계산해 first_row_atomic_h 로 사용. - 가드 비교를 atomic 기준으로 전환. - 인트라-로우 분할도 row_span>1 이 있으면 비활성화 (atomic push 강제). 검증: - 보고서 p1: pi=22 미배치, p2: pi=22 전체 표시 ✓ - 보고서 LAYOUT_OVERFLOW 30 (Task edwardkim#378 후 수치 유지) - form-002, k-water-rfp, exam_eng, exam_math, kps-ai 회귀 0 - cargo test --release: 1008+ passed, 0 failed closes edwardkim#379
…nt_height 에 반영 증상: "2025년 기부·답례품 실적 보고서_최종형태 확정.hwpx" p21 의 (4) 연령대별 섹션(pi=191/192) 이 PDF 정답상 p22 에 배치되어야 하는데 rhwp 가 p21 에 잘못 배치 → 페이지 경계를 초과해 LAYOUT_OVERFLOW. 원인: pi=172 의 비-TAC TopAndBottom 도형(차트, h=31470 HU = 419.6 px) 의 높이가 paragraph line_segs 에 미반영. typeset.rs:451 의 inline 컨트롤 처리는 PageItem::Shape 를 push 만 하고 current_height 누적 안 함 → typeset 이 후속 항목 fit 을 과대평가하여 잘못된 페이지에 배치. `compute_body_wide_top_reserve_for_para` 가 동일 계산을 하지만 multi-col col 1+ advance 한정(line 441 가드). 수정: typeset_paragraph 직후, body-wide TopAndBottom non-TAC 도형 의 reserve 높이를 single-col 에서도 current_height 에 반영. 후속 항목의 fit/페이지 분배가 layout 의 실제 vpos-based 위치와 정합. 검증: - 보고서 (4) 연령대별 섹션이 p21 → p22 로 이동 - LAYOUT_OVERFLOW 30 → 25 (pi=190..193 4건 해소) - form-002, k-water-rfp, exam_eng, exam_math, kps-ai 회귀 0 - cargo test --release: 1008+ passed, 0 failed 비고: AI 인사이트(pi=174) 의 시각 위치(p21 페이지 하단에 붙음) 는 layout 의 별도 결함 (Para-relative TopAndBottom 도형 의 y_offset 누적 이중 적용 가능성). 본 task 와 별개로 추후 분석 필요. closes edwardkim#380
…hape/Picture 까지 확장 증상: "2025년 기부·답례품 실적 보고서_최종형태 확정.hwpx" p21 의 AI 인사이트 (pi=174 table) 가 chart 바로 아래(y≈540) 가 아닌 페이지 하단 (y=937) 에 잘못 위치. LAYOUT_OVERFLOW 다수 발생 (pi=174..183). 원인: layout.rs:1471 의 vpos_page_base 리셋 가드 가 Table 의 Para-rel TopAndBottom non-TAC 만 예외 처리(is_para_float_table) 하고 Shape/Picture 는 누락. pi=172 의 chart(Para-rel TopAndBottom non-TAC Picture) 처리 후 vpos_page_base 가 리셋되어 후속 lazy_base 가 chart 의 물리 높이(419.6 px) 를 vpos 공간으로 오역 → 후속 문단들이 chart 높이만큼 추가로 밀려남. 수정: PageItem::Shape 분기에서도 동일한 가드 적용: - Control::Shape: TopAndBottom + vert_rel_to=Para + !treat_as_char - Control::Picture: 위 조건 + !treat_as_char (TAC 는 line_seg 가 처리) 해당 조건이면 vpos_page_base 를 유지해 후속 항목의 vpos 보정 기준점이 정상 유지된다. 검증: - 보고서 p21 AI 인사이트: y=937 → y=541 (chart 바로 아래) ✅ - 보고서 LAYOUT_OVERFLOW: 25 → **1** (대폭 개선) - form-002, k-water-rfp, exam_eng, exam_math, kps-ai 회귀 0 - cargo test --release: 1008+ passed, 0 failed closes edwardkim#380 (전체 회귀 해소)
|
@planet6897 안녕하세요. 본 PR 의 검증 PDF (`samples/2022년 국립국어원 업무계획.pdf`, 3쪽) 의 생성 경위를 확인하고자 합니다. 배경: 같은 HWP 파일을 작업지시자의 한컴 프로그램에서 PDF 로 출력했을 때 본 PDF (3쪽) 와 페이지네이션이 다른 것이 발견되었습니다. 이는 한컴 자체의 환경 의존성 가능성을 시사하며, rhwp 의 페이지네이션 검증 기준에 영향을 줄 수 있어 정확한 정황 파악이 필요합니다. 다음 정보 부탁드립니다:
본 PR 의 처리는 위 정보 확인 후 결정합니다. 회신 부탁드립니다. 감사합니다. |
PR #360 (Task #356) 의 검증용 PDF (컨트리뷰터 환경, 37쪽) 와 작업지시자의 한컴 프로그램 출력 PDF (35쪽) 의 페이지네이션 차이 발견. 한컴 자체의 환경 의존성 가능성을 시사하는 발견으로 검증 자료 보존: - saved/pr360-edward.hwp: 동일 HWP 파일 (md5 일치) - saved/pr360-edward.pdf: 작업지시자 한컴 출력 (35쪽) PR #360 의 PDF (samples/2022년 국립국어원 업무계획.pdf, 37쪽) 와 비교 가능. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PDF 와 함께 한컴 입력 HWP 도 검증 자료로 보존. .gitignore 의 /saved/*.hwp 패턴에 예외 추가. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
참고 자료를 추가합니다. 작업지시자가 본인의 한컴 프로그램으로 동일 HWP 를 PDF 출력한 결과는 3쪽 입니다 (PR 의 검증 PDF 는 37쪽). 페이지네이션이 다릅니다. 저장소에 검증 자료를 보존했습니다:
raw 다운로드 (브라우저 열림 방지):
두 PDF 의 페이지네이션 차이는 한컴 자체의 환경 의존성 가능성을 시사하므로, 이전 댓글의 5가지 항목 (도구+버전, OS, 출력 방법, 한컴 설정, 폰트) 회신과 함께 두 환경 비교를 진행하고자 합니다. 본 PR 처리 방향은 위 정보 확인 + 두 PDF 비교 후 결정합니다. |
PR #374 (Task #362): kps-ai p56 외부 표 안 콘텐츠 클립 회귀 정정 PR. 본 결함은 메인테이너 Task #362 (8 항목 누적: vpos 가드, PartialTable nested 분할, Square wrap 어울림, hide_empty_line 등) 로 v0.7.7 에 정정 완료. 이슈 #362 도 CLOSED. PR #374 의 vpos clamp 접근 (`vpos.min(remaining_room)`) 은 측정 의존 일반화 시멘틱으로 메인테이너의 nested 가드 (`has_nested_table` 분기) 보다 회귀 위험. 흡수 가치 없음 → close. PR #360 검토 문서도 함께 commit (회신 대기 중). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PDF 생성 환경 정보PDF 생성 도구 + 버전
OS 환경
출력 방법
한글뷰어 설정
사용 폰트
윈도우에서 한글2022로 PDF로 출력해서 다시 확인해 보겠습니다. |
PR #360 정황에서 발견: 동일 HWP 의 한컴 PDF 페이지 수가 환경별로 다름 (컨트리뷰터 37쪽 vs 작업지시자 35쪽). 페이지 분할 자체가 환경 의존적. 결정: PDF 가 정답지로서 신뢰성이 입증되기 전까지 검증 기준으로 수용 불가. 변경: - CONTRIBUTING.md: PR 검증의 PDF 한계 + 신뢰 기준 명시 - mydocs/troubleshootings/hancom_pdf_environment_dependency.md: 트러블슈팅 - mydocs/feedback/issue_253_environment_dependency_review.md: 영향 분석 연계 조치: - 이슈 #253 (한컴 PDF Visual Diff 파이프라인) close - 메모리 등록: feedback_pdf_not_authoritative.md Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
회신 감사합니다. 정보 정리합니다. 검증 환경 차이
작업지시자 정답지 정책작업지시자는 한컴 2010 + 한컴 2022 (편집기) 의 PDF 출력을 페이지네이션 정답지로 사용합니다. 다음은 정답지 아닙니다:
다음 단계말씀하신 윈도우 + 한글2022 재검증 결과를 기다립니다. 그 결과가 작업지시자의 35쪽과 같으면:
다르면:
본 PR 의 처리는 재검증 결과 + 작업지시자의 정답지 환경 (한컴 2010/2022) 에서 메인테이너 누적 작업 (Task #359, #361, #362) 의 효과 측정 후 결정합니다. 참고:
|
|
2022년 국립국어원 업무계획.pdf |
PR #360 (close) 처리 과정에서 수집한 한컴 PDF 환경 의존성 검증 자료. samples/: - 2022년 국립국어원 업무계획.hwp: PR #360 의 핵심 결함 재현 샘플 (md5 일치 확인) - 2022년 국립국어원 업무계획.pdf: 컨트리뷰터 macOS 한글 Viewer 출력 (37쪽) - 2022년 국립국어원 업무계획.txt: 보조 자료 saved/: - pr360-planet-win-hancom2022.pdf: 컨트리뷰터 윈도우 한컴2022 편집기 출력 (35쪽) - 작업지시자 출력 (saved/pr360-edward.pdf, 35쪽) 과 페이지 수 일치 - Windows 한컴 편집기의 일관성 입증 자료 PR #360 의 검증 정황은 Wiki 페이지 "한컴 PDF 환경 의존성" 에 정리됨. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
요약
samples/2022년 국립국어원 업무계획.hwp페이지 3 에서 본문이 페이지 박스(933.5 px)를 초과하여 푸터- 1 -가 SVG 영역 밖으로 밀려나는 버그를 수정.근본 원인은 두 가지 누적된 문제:
LINE_SEG.vertical_pos)으로 새 페이지에 보낸 문단(예: pi=40 vpos=500, prev pi=39 vpos=66281)의 신호를 px 누적 평가가 무시.변경 사항
1.
detect_inter_paragraph_vpos_reset헬퍼 신설src/renderer/pagination/engine.rs:단위 테스트 6개 추가.
2. 페이지네이션 엔진 통합
pagination::engine메인 루프 (paginate_with_measured_opts):process_page_break직후 헬퍼 호출, 트리거 시advance_column_or_new_page()typeset.rsTask 페이지네이션: LINE_SEG vpos-reset / page-break 플래그 무시로 하단 오버플로우 #321 위치: 기존cv==0 && pv>5000strict 트리거를 유지하고 헬퍼를 보조 트리거로 추가 (다단 column 변경 회귀 방지)3. TypesetState 확장 + HWP 권위값 검증
src/renderer/typeset.rs:page_vpos_base: Option<i32>— 페이지 첫 항목의 first_vpossuppress_next_inter_para_advance: bool— force_advance 후 다음 문단 inter-para 검사 한 번 스킵current_items[0]으로부터page_vpos_base유도 (표 처리 도중 reset 으로 사라져도 복구)prev_was_partial(PartialParagraph 직후) /suppress_next_inter_para_advance시 inter-para 검사 스킵typeset_paragraph에 두 가지 보정 추가:last_seg.vpos+lh+ls > body이고 px-fits 이며 fresh-fits 인 경우(first_vpos - base)의 px 환산값이 누적current_height보다 크면 끌어올림결과
본 샘플 (
2022년 국립국어원 업무계획.hwp)LAYOUT_OVERFLOW경고다중 샘플 회귀
2022년 국립국어원 업무계획.hwpaift.hwpexam_eng.hwp(다단)exam_math.hwp2010-01-06.hwp테스트
cargo test --release(lib 1014 + integration 14 + 25 + 6 + 1 + 1)inter_para_vpos_reset_tests(6개)tests/golden_svg/) — form-002, issue-147/157/267, table-text, 결정성변경 파일
src/renderer/pagination/engine.rs— 헬퍼 함수 + 단위 테스트 + 페이지네이션 통합src/renderer/pagination.rs—pub use detect_inter_paragraph_vpos_reset재내보내기src/renderer/typeset.rs— TypesetState 확장 + HWP 권위값 검증 + drift 보정 + 가드문서
mydocs/plans/task_m05x_356.md— 수행계획서mydocs/plans/task_m05x_356_impl.md— 구현계획서mydocs/working/task_m05x_356_stage1.md— 재현·정량 진단mydocs/working/task_m05x_356_stage2.md— 헬퍼 + 단위 테스트mydocs/working/task_m05x_356_stage3.md— 페이지네이션 통합mydocs/working/task_m05x_356_stage4.md— 통합 검증mydocs/working/task_m05x_356_stage6.md— HWP 권위값 overflow 검증 추가mydocs/report/task_m05x_356_report.md— 최종 보고서커밋
잔여 과제 (별도 이슈로 추적 권장)
PartialTable/Table표 분할 케이스로 본 PR 의 paragraph-level vpos 보정과 별개의 코드 경로(split_table_rows).2010-01-06.hwp페이지 분배 미세 변화 (6p → 7p): overflow 0 유지, 시각적 회귀 없으나 페이지 경계 이동. 추적 검토.검증 체크리스트