โ† Back to list
window-ook

make-pptx

by window-ook

๐Ÿคผโ€โ™‚๏ธ ์ง€์›์ž์™€ ์ฑ„์šฉ ๊ณต๊ณ ์˜ ์ ํ•ฉ๋„๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ํ•์ฒด์ปค์ž…๋‹ˆ๋‹ค

โญ 0๐Ÿด 0๐Ÿ“… Jan 16, 2026

SKILL.md


name: make-pptx description: HTML ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ PPTX ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ PPTX ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ์Šคํ‚ฌ. Pretendard ํฐํŠธ ํ•„์ˆ˜ ์ ์šฉ. PptxGenJS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ. allowed-tools: Read, Write, Edit, Bash, Glob user-invocable: true

PPTX ์ƒ์„ฑ ์Šคํ‚ฌ

HTML ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ PPTX๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, PptxGenJS๋ฅผ ์ง์ ‘ ํ™œ์šฉํ•˜์—ฌ PowerPoint ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

Pretendard ํฐํŠธ

๋ชจ๋“  PPTX ํŒŒ์ผ์€ ๋ฐ˜๋“œ์‹œ Pretendard ํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ์— Pretendard๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ:

  1. https://github.com/orioncactus/pretendard ์—์„œ ๋‹ค์šด๋กœ๋“œ
  2. ์‹œ์Šคํ…œ์— ํฐํŠธ ์„ค์น˜

์˜์กด์„ฑ

npm install pptxgenjs sharp

์›Œํฌํ”Œ๋กœ์šฐ

์˜ต์…˜ 1: PptxGenJS ์ง์ ‘ ์‚ฌ์šฉ (๊ถŒ์žฅ)

PptxGenJS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑํ•˜๊ฒŒ PPTX๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ตฌ์กฐ

const PptxGenJS = require('pptxgenjs');

// ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์ƒ์„ฑ
const pptx = new PptxGenJS();

// ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„ค์ •
pptx.author = 'Fit Checker';
pptx.title = '์ ํ•ฉ์„ฑ ๋ถ„์„ ๋ฆฌํฌํŠธ';
pptx.subject = '[ํšŒ์‚ฌ๋ช…] x [์ง€์›์ž๋ช…]';

// ๋ ˆ์ด์•„์›ƒ ์„ค์ • (16:9)
pptx.defineLayout({ name: 'CUSTOM', width: 13.33, height: 7.5 });
pptx.layout = 'CUSTOM';

์Šฌ๋ผ์ด๋“œ 1: ํƒ€์ดํ‹€ & ๋งค์น˜์œจ

const slide1 = pptx.addSlide();

// ๋ฐฐ๊ฒฝ์ƒ‰
slide1.background = { color: 'F9FAFB' };

// ํƒ€์ดํ‹€
slide1.addText('[ํšŒ์‚ฌ๋ช…] x [์ง€์›์ž๋ช…]', {
  x: 0.5,
  y: 0.5,
  w: '90%',
  h: 1,
  fontSize: 40,
  fontFace: 'Pretendard',
  bold: true,
  color: '111827',
  align: 'center',
});

// ์„œ๋ธŒํƒ€์ดํ‹€
slide1.addText('์ ํ•ฉ์„ฑ ๋ถ„์„ ๋ฆฌํฌํŠธ', {
  x: 0.5,
  y: 1.3,
  w: '90%',
  h: 0.5,
  fontSize: 24,
  fontFace: 'Pretendard',
  color: '6B7280',
  align: 'center',
});

// ๋งค์น˜์œจ ์›ํ˜• (๋„๋„› ์ฐจํŠธ)
slide1.addChart(
  pptx.ChartType.doughnut,
  [
    {
      name: 'Match',
      labels: ['๋งค์น˜', '๋‚˜๋จธ์ง€'],
      values: [78, 22], // ๋งค์น˜์œจ์— ๋”ฐ๋ผ ์กฐ์ •
    },
  ],
  {
    x: 4.5,
    y: 2,
    w: 4,
    h: 4,
    chartColors: ['10B981', 'E5E7EB'],
    showLegend: false,
    showTitle: false,
    holeSize: 70,
  }
);

// ๋งค์น˜์œจ ํ…์ŠคํŠธ (์ฐจํŠธ ์ค‘์•™)
slide1.addText('78%', {
  x: 5.5,
  y: 3.5,
  w: 2,
  h: 1,
  fontSize: 48,
  fontFace: 'Pretendard',
  bold: true,
  color: '10B981',
  align: 'center',
});

์Šฌ๋ผ์ด๋“œ 2: ์ž˜ ๋งž๋Š” ์ 

const slide2 = pptx.addSlide();

slide2.addText('โœ… ์ž˜ ๋งž๋Š” ์ ', {
  x: 0.5,
  y: 0.3,
  w: '90%',
  fontSize: 32,
  fontFace: 'Pretendard',
  bold: true,
  color: '111827',
});

// ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ
const tableData = [
  [
    { text: 'ํ•ญ๋ชฉ', options: { bold: true, fill: '2563EB', color: 'FFFFFF' } },
    {
      text: 'ํšŒ์‚ฌ ์š”๊ตฌ์‚ฌํ•ญ',
      options: { bold: true, fill: '2563EB', color: 'FFFFFF' },
    },
    {
      text: '์ง€์›์ž ๋ณด์œ  ์—ญ๋Ÿ‰',
      options: { bold: true, fill: '2563EB', color: 'FFFFFF' },
    },
    {
      text: '์ ํ•ฉ๋„',
      options: { bold: true, fill: '2563EB', color: 'FFFFFF' },
    },
  ],
  [
    { text: '๊ธฐ์ˆ  ์Šคํƒ' },
    { text: 'React, TypeScript' },
    { text: 'Next.js, React, TypeScript' },
    { text: 'โœ… ์™„๋ฒฝ ์ผ์น˜', options: { color: '10B981' } },
  ],
  // ์ถ”๊ฐ€ ํ–‰...
];

slide2.addTable(tableData, {
  x: 0.5,
  y: 1,
  w: 12,
  fontFace: 'Pretendard',
  fontSize: 14,
  border: { type: 'solid', pt: 1, color: 'E5E7EB' },
  align: 'left',
  valign: 'middle',
});

์Šฌ๋ผ์ด๋“œ 3: ๋งž์ง€ ์•Š๋Š” ์ 

const slide3 = pptx.addSlide();

slide3.addText('โš ๏ธ ๋งž์ง€ ์•Š๋Š” ์ ', {
  x: 0.5,
  y: 0.3,
  w: '90%',
  fontSize: 32,
  fontFace: 'Pretendard',
  bold: true,
  color: '111827',
});

// ์นด๋“œ ์Šคํƒ€์ผ ๋ฐ•์Šค
slide3.addShape(pptx.ShapeType.rect, {
  x: 0.5,
  y: 1,
  w: 5.5,
  h: 2.5,
  fill: 'FEF2F2',
  line: { color: 'EF4444', pt: 2, dashType: 'solid' },
});

slide3.addText('โŒ ๊ฒฝ๋ ฅ ์š”๊ฑด', {
  x: 0.7,
  y: 1.2,
  w: 5,
  fontSize: 20,
  fontFace: 'Pretendard',
  bold: true,
  color: 'EF4444',
});

slide3.addText('์š”๊ตฌ: 3๋…„ ์ด์ƒ\n๋ณด์œ : ์‹ ์ž…', {
  x: 0.7,
  y: 1.8,
  w: 5,
  fontSize: 16,
  fontFace: 'Pretendard',
  color: '111827',
});

์Šฌ๋ผ์ด๋“œ 4: ๋ณด์™„ ํฌ์ธํŠธ

const slide4 = pptx.addSlide();

slide4.addText('๐Ÿ’ก ๋ณด์™„ ํฌ์ธํŠธ', {
  x: 0.5,
  y: 0.3,
  w: '90%',
  fontSize: 32,
  fontFace: 'Pretendard',
  bold: true,
  color: '111827',
});

// ์šฐ์„ ์ˆœ์œ„ ๋ฐฐ์ง€
slide4.addShape(pptx.ShapeType.roundRect, {
  x: 0.5,
  y: 1,
  w: 1.2,
  h: 0.4,
  fill: 'FEE2E2',
});

slide4.addText('๋†’์Œ', {
  x: 0.5,
  y: 1,
  w: 1.2,
  h: 0.4,
  fontSize: 12,
  fontFace: 'Pretendard',
  bold: true,
  color: '991B1B',
  align: 'center',
  valign: 'middle',
});

// ๋ณด์™„ ํ•ญ๋ชฉ ๋‚ด์šฉ
slide4.addText('[๋ณด์™„ ํ•ญ๋ชฉ๋ช…]', {
  x: 2,
  y: 1,
  w: 10,
  fontSize: 18,
  fontFace: 'Pretendard',
  bold: true,
  color: '111827',
});

slide4.addText('๐Ÿ“Œ ๊ทผ๊ฑฐ: [์ฑ„์šฉ ๊ณต๊ณ ์—์„œ ๋ฐœ์ทŒํ•œ ๊ทผ๊ฑฐ]', {
  x: 2,
  y: 1.6,
  w: 10,
  fontSize: 14,
  fontFace: 'Pretendard',
  color: '6B7280',
});

ํŒŒ์ผ ์ €์žฅ

// ํŒŒ์ผ๋กœ ์ €์žฅ (Node.js)
pptx
  .writeFile({ fileName: 'output/fit-result.pptx' })
  .then((fileName) => console.log(`Created: ${fileName}`));

// ๋˜๋Š” Buffer๋กœ ๋ฐ˜ํ™˜
const buffer = await pptx.write({ outputType: 'nodebuffer' });

์˜ต์…˜ 2: HTML to PPTX ๋ณ€ํ™˜

HTML ํŒŒ์ผ์„ PPTX๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, html2pptx.md ์ฐธ์กฐ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

์ค‘์š” ์ฃผ์˜์‚ฌํ•ญ

1. ์ƒ‰์ƒ ์ฝ”๋“œ

PptxGenJS์—์„œ # ์—†์ด ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// โœ… ์˜ฌ๋ฐ”๋ฆ„
{
  color: '10B981';
}
{
  fill: 'F9FAFB';
}

// โŒ ์ž˜๋ชป๋จ (ํŒŒ์ผ ์†์ƒ ๊ฐ€๋Šฅ)
{
  color: '#10B981';
}
{
  fill: '#F9FAFB';
}

2. ํฐํŠธ ์ง€์ •

๋ชจ๋“  ํ…์ŠคํŠธ ์š”์†Œ์— Pretendard ํฐํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •:

{
  fontFace: 'Pretendard',
  // ...
}

3. ํ•œ๊ธ€ ํ…์ŠคํŠธ

ํ•œ๊ธ€ ํ…์ŠคํŠธ๋Š” ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€๋งŒ, ์ค„๋ฐ”๊ฟˆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ \n ์‚ฌ์šฉ:

slide.addText('์ฒซ ๋ฒˆ์งธ ์ค„\n๋‘ ๋ฒˆ์งธ ์ค„', { ... });

4. ์ด๋ชจ์ง€ ์‚ฌ์šฉ

์ด๋ชจ์ง€๋Š” ์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ •๋ณด๋Š” ์ด๋ชจ์ง€ ์™ธ์— ํ…์ŠคํŠธ๋กœ๋„ ํ‘œํ˜„ํ•˜์„ธ์š”.

์ถœ๋ ฅ ํŒŒ์ผ

๊ฒฐ๊ณผ๋ฌผ์€ output/ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅ:

output/
โ”œโ”€โ”€ fit-check-result-YYYY-MM-DD.pptx
โ””โ”€โ”€ fit-check-result-YYYY-MM-DD.html  (๋ฐฑ์—…์šฉ)

์ปฌ๋Ÿฌ ํŒ”๋ ˆํŠธ ์ฐธ์กฐ

์šฉ๋„์ƒ‰์ƒ ์ฝ”๋“œ์„ค๋ช…
Primary2563EB์ฃผ์š” ๊ฐ•์กฐ์ƒ‰
Success10B981๊ธ์ •์ /์™„๋ฃŒ
WarningF59E0B์ฃผ์˜/์„ ํ˜ธ
DangerEF4444๋ถ€์ •์ /ํ•„์ˆ˜ ๋ฏธ์ถฉ์กฑ
Neutral6B7280์ค‘๋ฆฝ/๋ณด์กฐ ํ…์ŠคํŠธ
BackgroundF9FAFB๋ฐฐ๊ฒฝ์ƒ‰
Text Primary111827์ฃผ์š” ํ…์ŠคํŠธ
Text Secondary6B7280๋ณด์กฐ ํ…์ŠคํŠธ
BorderE5E7EBํ…Œ๋‘๋ฆฌ/๊ตฌ๋ถ„์„ 

์ถ”๊ฐ€ ์ฐธ์กฐ ๋ฌธ์„œ

์ƒ์„ธํ•œ ๊ธฐ์ˆ  ์ •๋ณด๋Š” ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”:

  • html2pptx.md - HTML to PPTX ๋ณ€ํ™˜ ์ƒ์„ธ ๊ฐ€์ด๋“œ
  • ooxml.md - OOXML ์ง์ ‘ ์กฐ์ž‘ ๊ธฐ์ˆ  ์ฐธ์กฐ

Score

Total Score

50/100

Based on repository quality metrics

โœ“SKILL.md

SKILL.mdใƒ•ใ‚กใ‚คใƒซใŒๅซใพใ‚Œใฆใ„ใ‚‹

+20
โ—‹LICENSE

ใƒฉใ‚คใ‚ปใƒณใ‚นใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใ‚‹

0/10
โ—‹่ชฌๆ˜Žๆ–‡

100ๆ–‡ๅญ—ไปฅไธŠใฎ่ชฌๆ˜ŽใŒใ‚ใ‚‹

0/10
โ—‹ไบบๆฐ—

GitHub Stars 100ไปฅไธŠ

0/15
โ—‹ๆœ€่ฟ‘ใฎๆดปๅ‹•

3ใƒถๆœˆไปฅๅ†…ใซๆ›ดๆ–ฐใŒใ‚ใ‚‹

0/10
โ—‹ใƒ•ใ‚ฉใƒผใ‚ฏ

10ๅ›žไปฅไธŠใƒ•ใ‚ฉใƒผใ‚ฏใ•ใ‚Œใฆใ„ใ‚‹

0/5
โœ“Issue็ฎก็†

ใ‚ชใƒผใƒ—ใƒณIssueใŒ50ๆœชๆบ€

+5
โœ“่จ€่ชž

ใƒ—ใƒญใ‚ฐใƒฉใƒŸใƒณใ‚ฐ่จ€่ชžใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใ‚‹

+5
โ—‹ใ‚ฟใ‚ฐ

1ใคไปฅไธŠใฎใ‚ฟใ‚ฐใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใ‚‹

0/5

Reviews

๐Ÿ’ฌ

Reviews coming soon