PPTX 변환기가 피치 덱의 절반을 조용히 누락시킨 문제: SmartArt 텍스트는 다른 XML 파트에 존재함
요약
PPTX 파일에서 SmartArt와 같은 다이어그램 요소의 텍스트가 일반적인 XML 파서에 의해 누락되는 문제를 분석했습니다. 실제 텍스트는 슬라이드 본체가 아닌 별도의 다이어그램 네임스페이스(예: /ppt/diagrams/data1.xml) 내부에 존재하며, 이를 올바르게 추출하는 방법을 제시합니다.
핵심 포인트
- SmartArt의 텍스트는 일반 텍스트 상자가 아닌 별도 XML 파트에 저장됨.
- 파서는 `<p:graphicFrame>`과 `dgm:relIds`를 참조하여 실제 데이터를 찾아야 함.
- 추출된 텍스트는 읽기 순서를 유지하며 글머리 기호 목록으로 재구성해야 함.
한 사용자가 자신의 투자자 발표 자료(investor deck)를 제 PPTX-to-Markdown 컨버터로 돌렸는데, 내용 일부가 사라져 버렸다. 오류 메시지는 없었다. 제목, 글머리 기호 목록, 표 등은 모두 괜찮았지만, 전체 시장 성장 섹션이 거의 비어 있는 상태로 돌아왔다.
나는 .pptx 파일을 압축 해제했다(단순히 XML 파트들의 ZIP 파일이다). 그리고 문제가 생긴 슬라이드와 정상 작동하는 슬라이드를 비교해 보았다. 예상했던 텍스트 상자들은 그 자리에 있었지만, 누락된 내용은 다이어그램 네임스페이스를 참조하는 <p:graphicFrame> 요소 안에 자리 잡고 있었다. PowerPoint SmartArt는 슬라이드 자체에 저장되어 있는 것이 아니라 — 모양(shape)은 단지 관계 ID를 담는 플레이스홀더일 뿐이다. 실제 텍스트는 /ppt/diagrams/data1.xml에, 자체적인 문단 실행(paragraph runs)을 가진 노드의 계층 구조로 존재한다.
내 파서는 <p:sp> 모양 요소만 탐색했다. SmartArt는 dgm:relIds 참조를 가진 graphicFrame이며 — 완전히 다른 종류의 문제였다. 내가 테스트했던 모든 덱은 일반적인 텍스트 상자로 구성되어 있었기 때문에, 내 테스트는 성공적이었지만 실제 덱의 거대한 클래스는 내용을 조용히 누락시키고 있었다.
해결책: 각 graphicFrame의 관계를 해결하고, 다이어그램 데이터 파트를 구문 분석하며, dgm:pt 노드를 탐색하여 각각 안에 있는 <a:t> 실행을 추출한 다음, 이들을 슬라이드에서 프레임이 위치했던 자리에 글머리 기호 목록으로 출력한다. 이렇게 하면 이전과 이후의 모양들과 함께 읽기 순서(reading order)가 유지된다. 참고로 그룹화된 모양들도 같은 버그를 가지고 있었다 — 텍스트는 그룹의 하위 모양에 존재하며, 최상위 레벨에는 있지 않다.
내가 얻은 교훈:
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기