# pptx-skill
> HTML 슬라이드를 PowerPoint(PPTX) 파일로 변환. PPTX 생성, 편집, 썸네일 생성이 필요할 때 사용.
- Author: Inyoung Cho
- Repository: Mephisto405/seminar-slides-cc-skill
- Version: 20260202101202
- Stars: 0
- Forks: 0
- Last Updated: 2026-02-06
- Source: https://github.com/Mephisto405/seminar-slides-cc-skill
- Web: https://mule.run/skillshub/@@Mephisto405/seminar-slides-cc-skill~pptx-skill:20260202101202
---
---
name: pptx-skill
description: HTML 슬라이드를 PowerPoint(PPTX) 파일로 변환. PPTX 생성, 편집, 썸네일 생성이 필요할 때 사용.
---
# PPTX Skill - PowerPoint 변환 스킬
HTML 슬라이드를 PowerPoint 프레젠테이션 파일로 변환하는 스킬입니다.
## 기능 개요
### 1. 새 프레젠테이션 생성 (HTML → PPTX)
HTML 슬라이드 파일들을 PowerPoint로 변환
### 2. 기존 프레젠테이션 편집
PPTX 파일의 내용 수정
### 3. 썸네일 생성
프레젠테이션의 미리보기 이미지 생성
## 핵심 워크플로우
### HTML → PPTX 변환
1. **HTML 슬라이드 준비**
- `slides/` 디렉토리에 HTML 파일들 확인
- 각 파일이 720pt × 405pt (16:9) 규격인지 검증
2. **html2pptx.js 실행**
```bash
node .claude/skills/pptx-skill/scripts/html2pptx.js
```
3. **결과 검증**
- 생성된 PPTX 파일 확인
- 썸네일로 시각적 검증
## 스크립트 사용법
### html2pptx.js
HTML 파일들을 PPTX로 변환
```javascript
import { html2pptx } from './.claude/skills/pptx-skill/scripts/html2pptx.js';
import PptxGenJS from 'pptxgenjs';
const pres = new PptxGenJS();
pres.layout = 'LAYOUT_WIDE'; // 16:9
// 각 슬라이드 변환
await html2pptx('slides/slide-01.html', pres);
await html2pptx('slides/slide-02.html', pres);
// 저장
await pres.writeFile({ fileName: 'presentation.pptx' });
```
### thumbnail.py
프레젠테이션 썸네일 그리드 생성
```bash
python .claude/skills/pptx-skill/scripts/thumbnail.py presentation.pptx output-thumbnail
```
옵션:
- `--cols N`: 열 수 (기본 5, 범위 3-6)
- `--outline-placeholders`: 플레이스홀더 영역 표시
### pack.py / unpack.py
PPTX 파일 패키징/언패키징
```bash
# 언패킹
python .claude/skills/pptx-skill/ooxml/scripts/unpack.py presentation.pptx output_dir
# 패킹
python .claude/skills/pptx-skill/ooxml/scripts/pack.py input_dir presentation.pptx
```
### validate.py
PPTX 구조 검증
```bash
python .claude/skills/pptx-skill/ooxml/scripts/validate.py unpacked_dir --original presentation.pptx
```
## 상세 문서
- [html2pptx.md](html2pptx.md) - HTML to PPTX 변환 상세 가이드
- [ooxml.md](ooxml.md) - Office Open XML 기술 참조
- [python-pptx-academic.md](python-pptx-academic.md) - **학술 발표용 python-pptx 가이드** (권장)
## 방법 선택 가이드
| 상황 | 권장 방법 |
|------|----------|
| 간단한 텍스트 슬라이드 | HTML → PPTX (html2pptx.js) |
| 표, 차트가 포함된 슬라이드 | **python-pptx** |
| 논문 Figure가 포함된 학술 발표 | **python-pptx** |
| 복잡한 레이아웃 | **python-pptx** |
> **주의**: HTML → PPTX 변환은 표, 이미지, 복잡한 레이아웃에서 문제가 발생할 수 있습니다.
> 학술 발표나 정밀한 레이아웃이 필요한 경우 python-pptx를 직접 사용하세요.
---
## ⚠️ 핵심 교훈: 진정한 시각화란?
> **"텍스트를 도형으로 바꾸는 것은 시각화가 아니다"**
### 잘못된 접근 vs 올바른 접근
| 상황 | ❌ 잘못된 접근 | ✅ 올바른 접근 |
|------|---------------|---------------|
| 아키텍처 설명 | `add_shape()`로 박스+화살표 그리기 | **논문 원본 Figure** 사용 |
| 결과 비교 | 숫자 텍스트 ("FID: 44→34") | **실제 결과 이미지** 비교 |
| 방법 비교 | O/X 텍스트 테이블 | **결과물 이미지** + 😢/😀 |
| 플로우 설명 | 도형 플로우차트 | **논문 Figure** + 주석 |
### 왜 논문 Figure를 써야 하는가?
```
1. 저자가 이미 잘 만들어놓음 - 재발명할 필요 없음
2. 정확한 정보 전달 - 직접 그리면 오류 가능성
3. 시간 절약 - 도형 배치에 시간 낭비 방지
4. 청중 이해도 - 눈으로 보는 것이 가장 효과적
```
### Figure 우선순위
```
1순위: 논문 원본 Figure (arxiv.org/html/[ID]/x[N].png)
2순위: 프로젝트 페이지 이미지
3순위: 논문 PDF에서 추출
4순위: 직접 그리기 (최후의 수단만!)
```
### 권장 레이아웃
```
┌─────────────────┬─────────────────┐
│ 텍스트 설명 │ 논문 Figure │
│ (간결한 bullet) │ (원본 이미지) │
└─────────────────┴─────────────────┘
```
> 📖 자세한 내용: [python-pptx-academic.md](python-pptx-academic.md)
## PptxGenJS 핵심 규칙
### 색상 코드
```javascript
// 올바른 사용 - # 없이
{ color: 'FF0000' }
// 잘못된 사용 - 파일 손상 유발
{ color: '#FF0000' }
```
### 슬라이드 추가
```javascript
const slide = pres.addSlide();
// 텍스트 추가
slide.addText('제목', {
x: 0.5,
y: 0.5,
w: 9,
h: 1,
fontSize: 36,
color: '1a1a2e',
bold: true
});
// 이미지 추가
slide.addImage({
path: 'image.png',
x: 1,
y: 2,
w: 4,
h: 3
});
// 도형 추가
slide.addShape(pres.ShapeType.rect, {
x: 0.5,
y: 1,
w: 3,
h: 2,
fill: { color: '1e3a5f' }
});
```
### 차트 추가
```javascript
// 막대 차트
slide.addChart(pres.ChartType.bar, [
{
name: '시리즈 1',
labels: ['A', 'B', 'C'],
values: [10, 20, 30]
}
], {
x: 1,
y: 2,
w: 8,
h: 4
});
// 원형 차트
slide.addChart(pres.ChartType.pie, [...], {...});
// 선형 차트
slide.addChart(pres.ChartType.line, [...], {...});
```
## 전체 변환 프로세스
```
┌─────────────────┐
│ HTML 슬라이드 │
│ slides/*.html │
└────────┬────────┘
│
▼
┌─────────────────┐
│ html2pptx.js │
│ (Playwright + │
│ PptxGenJS) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ PPTX 파일 │
│ presentation. │
│ pptx │
└────────┬────────┘
│
▼
┌─────────────────┐
│ thumbnail.py │
│ (미리보기) │
└─────────────────┘
```
## 의존성
### Node.js
- pptxgenjs: PowerPoint 생성
- playwright: 브라우저 렌더링
- sharp: 이미지 처리
### Python
- markitdown: 마크다운 변환
- defusedxml: XML 파싱
- pillow: 이미지 처리
### 시스템
- LibreOffice: PDF/이미지 변환 (soffice)
- Poppler: PDF 이미지화 (pdftoppm)
## 주의사항
1. **색상 코드**: PptxGenJS에서 # 접두사 사용 금지
2. **폰트**: 웹 안전 폰트만 사용
3. **텍스트**: p, h1-h6, ul, ol 태그만 변환됨
4. **그라데이션**: CSS 그라데이션은 이미지로 대체
5. **검증**: 변환 후 반드시 썸네일로 확인
---
## 학술 발표 체크리스트
### 생성 전 확인 (필수!)
- [ ] 정확한 저자명 (arXiv/논문에서 복사)
- [ ] 이벤트 유형 확인 (Weekly Paper Review, PhD Seminar 등)
- [ ] **논문 Figure 수집 완료** (가장 중요!)
- [ ] **결과 비교 이미지 수집** (Baseline vs Ours)
- [ ] 청중 수준 파악 (전문가/비전문가)
### 필수 이미지 목록 (학술 발표)
```
images/
├── teaser.png # 타이틀 슬라이드용
├── architecture.png # Method 설명용 (논문 Figure 1-2)
├── baseline_result.png # 비교용 (기존 방법 결과)
├── ours_result.png # 비교용 (제안 방법 결과)
├── scaling_graph.png # 정량적 결과 그래프
└── comparison.png # 정성적 비교 Figure
```
### 이미지 소스
```
https://arxiv.org/html/[PAPER_ID]/x[N].png # arXiv Figure (고화질)
https://[method].github.io/statics/images/ # 프로젝트 페이지
```
### 슬라이드 검증 체크리스트
- [ ] **모든 Method 슬라이드에 논문 Figure가 있는가?**
- [ ] **결과 슬라이드에 실제 이미지 비교가 있는가?**
- [ ] 도형만으로 구성된 슬라이드가 없는가?
- [ ] 텍스트 위주 슬라이드가 3장 연속으로 없는가?
### 검증 필수
```python
# PowerPoint COM으로 PNG 내보내기
import win32com.client
ppt = win32com.client.Dispatch('PowerPoint.Application')
# slide.Export(output_path, 'PNG', 960, 540)
```
### 흔한 실수
- **도형으로 시각화 시도**: 논문 Figure를 쓰세요!
- **숫자로만 결과 설명**: 실제 이미지를 보여주세요!
- 이미지 크기: `height` 제한으로 겹침 방지
- PowerPoint 인덱싱: 1-based (`Slides(1)`, not `Slides[0]`)
- Windows 인코딩: ✓, ✗ 대신 [OK], [X] 사용