MINOR release. parse 한 Document 를 다시 HWPX 로 저장하는 첫 역방향 표면을 추가한다 — v0.2.0 ~ v0.6.0 의 모든 산출물 (IR / SVG / PDF / PNG) 이 read-only 였던 것에 writeback 을 연다. 직렬화는 상류 serialize_hwpx 에 위임한다. 추가만 있고 기존 IR / 렌더 / MCP 표면은 모두 보존 (additive only) — IR schema ("1.1") 변경 0.
Added
Document.to_hwpx_bytes() -> bytes— 문서를 HWPX (ZIP+XML) 바이트로 직렬화. 출력은 ZIP magicb"PK\x03\x04"으로 시작하고 첫 엔트리가 STOREDmimetype=application/hwp+zip.DocumentIR 이 포맷 독립이라 HWP5 로 parse 한 문서도 HWPX 로 출력된다 (HWP5 → HWPX 포맷 변환). 직렬화 실패 (참조 무결성 위반 — BinData 누락 등) 는ValueError.Document.export_hwpx(path) -> int— 문서를 HWPX 파일로 저장하고 작성 바이트 수 (> 0) 를 반환. 파일 쓰기 실패 (부모 디렉토리 부재 등) 는OSError.render_pdf/export_pdf의 메모리 / 파일 분리 패턴과 대칭.- README § "HWPX 저장 (writeback)" 신설 —
to_hwpx_bytes/export_hwpx사용 예 + HWP5 → HWPX 변환 + 보존 범위 / 에러 계약.
보존 범위: 텍스트·문단은 round-trip 의미를 보존한다 (parse → 저장 → 재파싱 시 섹션 수 / 문단 수 / 문단 텍스트 동등). 표·그림·수식은 상류 serializer 의 현 보존 범위에 위임 — 의미 보존 미보장 (예외 없는 직렬화만 보장). round-trip 은 의미적 동등성 기준이며 byte 단위 동일은 보장하지 않는다. 표·그림 round-trip 의미 보존은 v0.8.0, HWP5 binary 출력 (export_hwp) 은 별도 minor.
Build
external/rhwpsubmodule pin1899ef9b(v0.7.12) →ce45231c(v0.7.12 + 394 commit, 2026-05-27 상류). spec·feat 는1899ef9b기준 작성됐고 (2026-05-20) GA 직전 재동기화 후 그 위에서 회귀를 재검증했다. 본 binding 관점 회귀 0 —serialize_hwpx시그니처 불변,maturin develop --releaseclean,pytest -m "not slow"599 passed / 2 skipped (IR baseline byte-equal 포함). 흡수한 상류 변경: serializer +2092 (16 commit 거의 전부 HWP5 binary writebackserialize_hwp한컴 호환), model +1267, rendering +1320 — 모두 직렬화·렌더 내부라 binding 이 소비하는 IR schema ("1.1") / IR·렌더 출력은 불변.Cargo.toml의version0.6.1→0.7.0.pyproject.toml은dynamic = ["version"]으로 자동 추종.
Full Changelog: v0.6.1...v0.7.0