Skip to content

HWPX Serializer 구현 — Document IR → HWPX(ZIP+XML) 저장 #164

@seunghan91

Description

@seunghan91

배경

현재 src/serializer/HwpSerializer(HWP 5.0 CFB) 한 구현체만 있어 Document IR을 HWPX(XML 기반 ZIP 패키지)로 내보내는 기능이 없다. DocumentSerializer trait는 이미 추상화되어 있어 HwpxSerializer만 추가하면 파이프라인에 연결된다.

목표

parse_hwpx → (편집) → serialize_hwpx → 다시 parse_hwpx 시 IR이 동등하게 유지되도록 HWPX 직렬화 경로를 신규 구현한다.

범위 (MVP)

HWPX 파서가 현재 지원하는 범위에 맞춘다.

대상:

  • ZIP 컨테이너 + OPF 패키지 (Contents/content.hpf)
  • Contents/header.xml (fonts, charShapes, paraShapes, borderFills, styles, 기타 ID 맵)
  • Contents/section*.xml (문단·텍스트·charShape·paraShape·lineSegArray)
  • 표(<tbl> + <pos>/<sz>/<outMargin>/<tc hasMargin>)
  • 그림 + BinData/ 배치
  • 라운드트립 자동 검증

범위 외 (후속 이슈):

  • 각주/미주, 머리말/꼬리말, 도형, 필드/하이퍼링크 (HWPX 파서도 미구현)
  • HWP↔HWPX 교차 변환

단계 계획 (5단계, 하이퍼-워터폴)

  1. ZIP + content.hpf + 최소 header.xml + 빈 section0.xml → 빈 HWPX 생성, 한컴 오픈 검증
  2. 본문 문단/텍스트/charShape/paraShape/lineSegArray 직렬화 → 텍스트 라운드트립
  3. 표 직렬화 (attr↔common 역매핑은 `mydocs/tech/hwp_hwpx_ir_differences.md` 기준)
  4. 그림 + BinData 배치
  5. 라운드트립 테스트 (parse_hwpx → serialize_hwpx → parse_hwpx → IR diff 0)

참고 문서

  • mydocs/tech/hwp_save_guide.md — HWP 저장 구조 (참고)
  • mydocs/tech/hwp_hwpx_ir_differences.md — IR 차이점 (직접 영향)
  • src/parser/hwpx/ — 역방향 레퍼런스

아키텍처

```rust
pub struct HwpxSerializer;
impl DocumentSerializer for HwpxSerializer {
fn serialize(&self, doc: &Document) -> Result<Vec, SerializeError> { ... }
}
```

src/serializer/hwpx/ 신설 (reader 거울 구조):

  • mod.rs — 엔트리 (serialize_hwpx)
  • writer.rs — ZIP 쓰기
  • content.rs — content.hpf 생성
  • header.rs — header.xml 생성
  • section.rs — section*.xml 생성
  • utils.rs — 공용 XML 헬퍼

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions