Skip to content

Commit d6f40b4

Browse files
committed
fix(image): handle svg images properly
1 parent f4ec662 commit d6f40b4

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

__tests__/add-svg-images.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import Automizer from '../src/automizer';
2+
3+
test('create presentation and append slides with images', async () => {
4+
const automizer = new Automizer({
5+
templateDir: `${__dirname}/pptx-templates`,
6+
outputDir: `${__dirname}/pptx-output`,
7+
});
8+
9+
const pres = automizer
10+
.loadRoot(`RootTemplate.pptx`)
11+
.load(`EmptySlide.pptx`, 'empty')
12+
.load(`SVGImages.pptx`, 'images');
13+
14+
pres.addSlide('empty', 1, (slide) => {
15+
slide.addElement('images', 1, 'Heart');
16+
slide.addElement('images', 1, 'Leaf');
17+
});
18+
19+
const result = await pres.write(`add-svg-images.test.pptx`);
20+
21+
expect(result.images).toBe(4);
22+
});
68.1 KB
Binary file not shown.

src/shapes/image.ts

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export class Image extends Shape implements IImage {
5959
targetSlideNumber: number,
6060
): Promise<Image> {
6161
await this.prepare(targetTemplate, targetSlideNumber);
62+
6263
await this.setTargetElement();
6364
await this.updateTargetElementRelId();
6465

@@ -69,6 +70,19 @@ export class Image extends Shape implements IImage {
6970
return this;
7071
}
7172

73+
async modifySvgRelation(
74+
targetTemplate: RootPresTemplate,
75+
targetSlideNumber: number,
76+
targetElement: XmlElement,
77+
): Promise<Image> {
78+
await this.prepare(targetTemplate, targetSlideNumber);
79+
80+
this.targetElement = targetElement;
81+
await this.updateTargetElementRelId();
82+
83+
return this;
84+
}
85+
7286
async append(
7387
targetTemplate: RootPresTemplate,
7488
targetSlideNumber: number,
@@ -81,7 +95,10 @@ export class Image extends Shape implements IImage {
8195

8296
this.applyImageCallbacks();
8397

84-
if (this.hasSvgRelation()) {
98+
/*
99+
* SVG images require a corresponding PNG image.
100+
*/
101+
if (this.hasSvgBlipRelation()) {
85102
const relsPath = `ppt/slides/_rels/slide${this.sourceSlideNumber}.xml.rels`;
86103
const target = await XmlHelper.getTargetByRelId(
87104
this.sourceArchive,
@@ -98,7 +115,11 @@ export class Image extends Shape implements IImage {
98115
type: ElementType.Image,
99116
},
100117
this.targetType,
101-
).modify(targetTemplate, targetSlideNumber);
118+
).modifySvgRelation(
119+
targetTemplate,
120+
targetSlideNumber,
121+
this.targetElement,
122+
);
102123
}
103124

104125
return this;
@@ -182,7 +203,7 @@ export class Image extends Shape implements IImage {
182203
);
183204
}
184205

185-
hasSvgRelation(): boolean {
206+
hasSvgBlipRelation(): boolean {
186207
return this.targetElement.getElementsByTagName('asvg:svgBlip').length > 0;
187208
}
188209

0 commit comments

Comments
 (0)