현상
HWPX 기반 문서를 SVG/PDF로 내보낼 때 일부 표의 내부 배경이 전부 검은색으로 렌더링됩니다. 두 샘플 모두 표의 선과 텍스트는 남아 있지만, 투명하거나 채우기 없음으로 처리되어야 할 셀 배경이 #000000 사각형으로 출력됩니다.
upstream devel 최신 커밋(0fcb372c069bf044b2439b15d8c7fd37589628d6) 기준으로도 아직 재현됩니다.
재현 방법
- HWPX 구조를 가진 HWP 샘플 문서를 준비합니다.
devel 브랜치에서 CLI로 SVG/PDF를 내보냅니다.
cargo build --release --bin rhwp
target/release/rhwp export-svg 123kb.hwp -o /tmp/rhwp-devel-render/svg-123 -p 1
target/release/rhwp export-svg 74kb.hwp -o /tmp/rhwp-devel-render/svg-74 -p 0
target/release/rhwp export-pdf 123kb.hwp -o /tmp/rhwp-devel-render/pdf/123kb-devel.pdf
target/release/rhwp export-pdf 74kb.hwp -o /tmp/rhwp-devel-render/pdf/74kb-devel.pdf
- 문제가 발생하는 페이지를 확인합니다.
123kb.hwp: 2페이지
74kb.hwp: 1페이지
기대 결과
표 내부의 faceColor="#FF000000" / alpha="0" 조합은 검정 채우기가 아니라 투명 또는 채우기 없음으로 보여야 합니다. 표 내부 텍스트와 선이 흰 배경 위에서 보여야 합니다.
실제 결과
devel 기준 SVG에서 검정 사각형이 아래처럼 출력됩니다.
123kb.hwp 2페이지: rect fill="#000000" 65개
74kb.hwp 1페이지: rect fill="#000000" 31개
123kb.hwp 2페이지 비교

74kb.hwp 1페이지 비교

확인한 원인
HWPX faceColor의 #AARRGGBB 값을 파싱할 때 상위 바이트를 버리고 0x00BBGGRR로 변환하고 있습니다. 그래서 #FF000000이 0x00000000이 되고, 뒤쪽 렌더링 단계에서는 일반 검정색 채우기로 취급됩니다.
반면 style_resolver 쪽에는 ColorRef의 상위 바이트가 0이 아닌 경우 특수값 또는 확장값으로 보고 채우기 없음으로 처리하는 로직이 이미 있습니다. 따라서 #AARRGGBB를 0xAABBGGRR 형태로 보존하면 기존 로직이 의도대로 동작합니다.
수정 후보 검증 결과
별도 브랜치에서 #AARRGGBB의 상위 바이트를 보존하도록 바꿨을 때 두 샘플 모두 검정 배경이 사라졌습니다.
123kb.hwp 2페이지: rect fill="#000000" 65개 → 0개
74kb.hwp 1페이지: rect fill="#000000" 31개 → 0개
실행한 검증:
cargo test
cargo test --lib
cargo test --test svg_snapshot
cargo clippy -- -D warnings
- 위 두 샘플의 SVG/PDF 내보내기 비교
환경
- rhwp 버전: upstream
devel 0fcb372c069bf044b2439b15d8c7fd37589628d6
- 확인 경로: CLI
export-svg, export-pdf
- OS: macOS
현상
HWPX 기반 문서를 SVG/PDF로 내보낼 때 일부 표의 내부 배경이 전부 검은색으로 렌더링됩니다. 두 샘플 모두 표의 선과 텍스트는 남아 있지만, 투명하거나 채우기 없음으로 처리되어야 할 셀 배경이
#000000사각형으로 출력됩니다.upstream
devel최신 커밋(0fcb372c069bf044b2439b15d8c7fd37589628d6) 기준으로도 아직 재현됩니다.재현 방법
devel브랜치에서 CLI로 SVG/PDF를 내보냅니다.cargo build --release --bin rhwptarget/release/rhwp export-svg 123kb.hwp -o /tmp/rhwp-devel-render/svg-123 -p 1target/release/rhwp export-svg 74kb.hwp -o /tmp/rhwp-devel-render/svg-74 -p 0target/release/rhwp export-pdf 123kb.hwp -o /tmp/rhwp-devel-render/pdf/123kb-devel.pdftarget/release/rhwp export-pdf 74kb.hwp -o /tmp/rhwp-devel-render/pdf/74kb-devel.pdf123kb.hwp: 2페이지74kb.hwp: 1페이지기대 결과
표 내부의
faceColor="#FF000000"/alpha="0"조합은 검정 채우기가 아니라 투명 또는 채우기 없음으로 보여야 합니다. 표 내부 텍스트와 선이 흰 배경 위에서 보여야 합니다.실제 결과
devel기준 SVG에서 검정 사각형이 아래처럼 출력됩니다.123kb.hwp2페이지:rect fill="#000000"65개74kb.hwp1페이지:rect fill="#000000"31개123kb.hwp 2페이지 비교
74kb.hwp 1페이지 비교
확인한 원인
HWPX
faceColor의#AARRGGBB값을 파싱할 때 상위 바이트를 버리고0x00BBGGRR로 변환하고 있습니다. 그래서#FF000000이0x00000000이 되고, 뒤쪽 렌더링 단계에서는 일반 검정색 채우기로 취급됩니다.반면
style_resolver쪽에는ColorRef의 상위 바이트가 0이 아닌 경우 특수값 또는 확장값으로 보고 채우기 없음으로 처리하는 로직이 이미 있습니다. 따라서#AARRGGBB를0xAABBGGRR형태로 보존하면 기존 로직이 의도대로 동작합니다.수정 후보 검증 결과
별도 브랜치에서
#AARRGGBB의 상위 바이트를 보존하도록 바꿨을 때 두 샘플 모두 검정 배경이 사라졌습니다.123kb.hwp2페이지:rect fill="#000000"65개 → 0개74kb.hwp1페이지:rect fill="#000000"31개 → 0개실행한 검증:
cargo testcargo test --libcargo test --test svg_snapshotcargo clippy -- -D warnings환경
devel0fcb372c069bf044b2439b15d8c7fd37589628d6export-svg,export-pdf