Files
html2pptx/PPTXGENJS_API.md
T

452 lines
8.8 KiB
Markdown

# PptxGenJS v4.0.1 完整 API 参考
> 从 TypeScript 类型定义生成
## 1. 初始化
```javascript
const pptxgen = require('pptxgenjs');
const pres = new pptxgen();
```
## 2. 布局设置
```javascript
// 自定义布局
pres.defineLayout({ name: 'CUSTOM', width: 10, height: 5.625 });
pres.layout = 'CUSTOM';
// 预设布局
// 'LAYOUT_16x9' (10x5.63)
// 'LAYOUT_4x3' (10x7.5)
// 'LAYOUT_16x10' (10x6.25)
// 'LAYOUT_WIDE' (13.33x7.5)
```
## 3. Slide 管理
```typescript
interface PresSlide {
addChart()
addImage()
addMedia()
addNotes()
addShape()
addTable()
addText()
}
```
## 4. addText — 核心方法
```javascript
slide.addText(text, options);
// text: string | number | Array<{text, options}>
// options: TextPropsOptions
```
### 位置 (继承自 PositionProps)
| 属性 | 类型 | 说明 | 默认值 |
|------|------|------|--------|
### 文本样式 (继承自 TextBaseProps)
| 属性 | 类型 | 说明 | 默认值 |
|------|------|------|--------|
### TextPropsOptions 特有属性
| 属性 | 类型 | 说明 | 默认值 |
|------|------|------|--------|
## 5. 图片
```javascript
slide.addImage({
path: '/path/to/image.png', // 本地路径或URL
data: 'image/png;base64,...', // 或 base64
x: 1, y: 1, w: 8, h: 4.5
});
```
## 6. 形状
```typescript
type SHAPE_NAME = | 'accentBorderCallout1'
| 'accentBorderCallout2'
| 'accentBorderCallout3'
| 'accentCallout1'
| 'accentCallout2'
| 'accentCallout3'
| 'actionButtonBackPrevious'
| 'actionButtonBeginning'
| 'actionButtonBlank'
| 'actionButtonDocument'
| 'actionButtonEnd'
| 'actionButtonForwardNext'
| 'actionButtonHelp'
| 'actionButtonHome'
| 'actionButtonInformation'
| 'actionButtonMovie'
| 'actionButtonReturn'
| 'actionButtonSound'
| 'arc'
| 'bentArrow'
| 'bentUpArrow'
| 'bevel'
| 'blockArc'
| 'borderCallout1'
| 'borderCallout2'
| 'borderCallout3'
| 'bracePair'
| 'bracketPair'
| 'callout1'
| 'callout2'
| 'callout3'
| 'can'
| 'chartPlus'
| 'chartStar'
| 'chartX'
| 'chevron'
| 'chord'
| 'circularArrow'
| 'cloud'
| 'cloudCallout'
| 'corner'
| 'cornerTabs'
| 'cube'
| 'curvedDownArrow'
| 'curvedLeftArrow'
| 'curvedRightArrow'
| 'curvedUpArrow'
| 'decagon'
| 'diagStripe'
| 'diamond'
| 'dodecagon'
| 'donut'
| 'doubleWave'
| 'downArrow'
| 'downArrowCallout'
| 'ellipse'
| 'ellipseRibbon'
| 'ellipseRibbon2'
| 'flowChartAlternateProcess'
| 'flowChartCollate'
| 'flowChartConnector'
| 'flowChartDecision'
| 'flowChartDelay'
| 'flowChartDisplay'
| 'flowChartDocument'
| 'flowChartExtract'
| 'flowChartInputOutput'
| 'flowChartInternalStorage'
| 'flowChartMagneticDisk'
| 'flowChartMagneticDrum'
| 'flowChartMagneticTape'
| 'flowChartManualInput'
| 'flowChartManualOperation'
| 'flowChartMerge'
| 'flowChartMultidocument'
| 'flowChartOfflineStorage'
| 'flowChartOffpageConnector'
| 'flowChartOnlineStorage'
| 'flowChartOr'
| 'flowChartPredefinedProcess'
| 'flowChartPreparation'
| 'flowChartProcess'
| 'flowChartPunchedCard'
| 'flowChartPunchedTape'
| 'flowChartSort'
| 'flowChartSummingJunction'
| 'flowChartTerminator'
| 'folderCorner'
| 'frame'
| 'funnel'
| 'gear6'
| 'gear9'
| 'halfFrame'
| 'heart'
| 'heptagon'
| 'hexagon'
| 'homePlate'
| 'horizontalScroll'
| 'irregularSeal1'
| 'irregularSeal2'
| 'leftArrow'
| 'leftArrowCallout'
| 'leftBrace'
| 'leftBracket'
| 'leftCircularArrow'
| 'leftRightArrow'
| 'leftRightArrowCallout'
| 'leftRightCircularArrow'
| 'leftRightRibbon'
| 'leftRightUpArrow'
| 'leftUpArrow'
| 'lightningBolt'
| 'line'
| 'lineInv'
| 'mathDivide'
| 'mathEqual'
| 'mathMinus'
| 'mathMultiply'
| 'mathNotEqual'
| 'mathPlus'
| 'moon'
| 'noSmoking'
| 'nonIsoscelesTrapezoid'
| 'notchedRightArrow'
| 'octagon'
| 'parallelogram'
| 'pentagon'
| 'pie'
| 'pieWedge'
| 'plaque'
| 'plaqueTabs'
| 'plus'
| 'quadArrow'
| 'quadArrowCallout'
| 'rect'
| 'ribbon'
| 'ribbon2'
| 'rightArrow'
| 'rightArrowCallout'
| 'rightBrace'
| 'rightBracket'
| 'round1Rect'
| 'round2DiagRect'
| 'round2SameRect'
| 'roundRect'
| 'rtTriangle'
| 'smileyFace'
| 'snip1Rect'
| 'snip2DiagRect'
| 'snip2SameRect'
| 'snipRoundRect'
| 'squareTabs'
| 'star10'
| 'star12'
| 'star16'
| 'star24'
| 'star32'
| 'star4'
| 'star5'
| 'star6'
| 'star7'
| 'star8'
| 'stripedRightArrow'
| 'sun'
| 'swooshArrow'
| 'teardrop'
| 'trapezoid'
| 'triangle'
| 'upArrow'
| 'upArrowCallout'
| 'upDownArrow'
| 'upDownArrowCallout'
| 'uturnArrow'
| 'verticalScroll'
| 'wave'
| 'wedgeEllipseCallout'
| 'wedgeRectCallout'
| 'wedgeRoundRectCallout'
export enum SLIDE_OBJECT_TYPES {
'chart' = 'chart',
'hyperlink' = 'hyperlink',
'image' = 'image',
'media' = 'media',
'online' = 'online',
'placeholder' = 'placeholder',
'table' = 'table',
'tablecell' = 'tablecell',
'text' = 'text',
'notes' = 'notes',
}
export enum TEXT_HALIGN {
'left' = 'left',
'center' = 'center',
'right' = 'right',
'justify' = 'justify',
}
export enum TEXT_VALIGN {
'b' = 'b',
'ctr' = 'ctr',
't' = 't',
}
// @source `core-interfaces.d.ts` (direct)
// Core Types
// ==========
/**
* Coordinate number - either:
* - Inches (0-n)
* - Percentage (0-100)
*
* @example 10.25 // coordinate in inches
* @example '75%' // coordinate as percentage of slide size
*/
export type Coord = number | `${number}%`
export interface PositionProps {
/**
* Horizontal position
* - inches or percentage
* @example 10.25 // position in inches
* @example '75%' // position as percentage of slide size
*/
x?: Coord
/**
* Vertical position
* - inches or percentage
* @example 10.25 // position in inches
* @example '75%' // position as percentage of slide size
*/
y?: Coord
/**
* Height
* - inches or percentage
* @example 10.25 // height in inches
* @example '75%' // height as percentage of slide size
*/
h?: Coord
/**
* Width
* - inches or percentage
* @example 10.25 // width in inches
* @example '75%' // width as percentage of slide size
*/
w?: Coord
}
/**
* Either `data` or `path` is required
*/
export interface DataOrPathProps {
/**
* URL or relative path
*
* @example 'https://onedrives.com/myimg.png` // retrieve image via URL
* @example '/home/gitbrent/images/myimg.png` // retrieve image via local path
*/
path?: string
/**
* base64-encoded string
* - Useful for avoiding potential path/server issues
*
* @example 'image/png;
```
```javascript
slide.addShape(pres.ShapeType.rect, {
x: 1, y: 1, w: 8, h: 4,
fill: { color: '0088CC' },
line: { color: '0055AA', width: 2 }
});
```
## 7. 表格
```javascript
slide.addTable([
[
{ text: 'Header 1', options: { bold: true, color: 'FFFFFF' } },
{ text: 'Header 2', options: { bold: true, color: 'FFFFFF' } }
],
[
{ text: 'Row 1 Col 1' },
{ text: 'Row 1 Col 2' }
]
], {
x: 1, y: 1, w: 8,
border: { type: 'solid', color: 'CCCCCC', pt: 1 },
colW: [4, 4]
});
```
## 8. 图表
```javascript
slide.addChart(pres.ChartType.bar, [
{
name: 'Sales',
labels: ['Q1', 'Q2', 'Q3', 'Q4'],
values: [100, 200, 150, 300]
}
], {
x: 1, y: 1, w: 8, h: 4
});
```
## 9. 输出
```javascript
// 保存到文件
pres.writeFile({ fileName: 'output.pptx' });
// 浏览器下载
pres.write({ outputType: 'blob' });
pres.write({ outputType: 'arraybuffer' });
pres.write({ outputType: 'dataUrl' });
// Node stream
pres.stream();
```
## 10. 坐标换算
PptxGenJS 使用英寸作为单位。
| 单位 | 换算 |
|------|------|
| 1 英寸 | 1.0 |
| 1 厘米 | 0.3937 英寸 |
| CSS px (96dpi) | px / 96 英寸 |
| PPT pt (72dpi) | pt / 72 英寸 |
常用:`pxToInches = px / 96`
## 11. 完整示例
```javascript
const pptxgen = require('pptxgenjs');
const pres = new pptxgen();
// 16:9 布局
pres.defineLayout({ name: 'CUSTOM', width: 10, height: 5.625 });
pres.layout = 'CUSTOM';
pres.author = 'LiJin';
pres.title = 'Presentation';
// 第一页
let slide = pres.addSlide();
slide.background = { fill: '1A1A2E' };
slide.addText('Title Slide', {
x: 1, y: 1.5, w: 8, h: 1,
fontSize: 44, color: 'FFFFFF', bold: true,
align: 'center', fontFace: 'Arial'
});
slide.addText('Subtitle', {
x: 1, y: 3, w: 8, h: 0.5,
fontSize: 18, color: 'AAAAAA',
align: 'center'
});
// 第二页
slide = pres.addSlide();
slide.background = { fill: 'FFFFFF' };
slide.addText('Content Page', {
x: 0.5, y: 0.3, w: 9, h: 0.6,
fontSize: 28, bold: true
});
slide.addText([
{ text: 'Bullet 1\n', options: { fontSize: 18, bullet: true } },
{ text: 'Bullet 2\n', options: { fontSize: 18, bullet: true } },
{ text: 'Bullet 3', options: { fontSize: 18, bullet: true } }
], {
x: 0.5, y: 1.5, w: 5, h: 2
});
pres.writeFile({ fileName: 'demo.pptx' });
```