diff --git a/demo/demo11.js b/demo/demo11.js index 2c6305106e..f0597e0da4 100644 --- a/demo/demo11.js +++ b/demo/demo11.js @@ -1,4 +1,5 @@ const docx = require("../build"); +const fs = require('fs'); const doc = new docx.Document(undefined, { top: 700, @@ -80,7 +81,7 @@ doc.Styles.createParagraphStyle("ListParagraph", "List Paragraph") .quickFormat() .basedOn("Normal"); -doc.createImage("./demo/images/pizza.gif"); +doc.createImage(fs.readFileSync("./demo/images/pizza.gif")); doc .createParagraph("HEADING") .heading1() @@ -122,7 +123,7 @@ var arrboth = [{ arrboth.forEach(function(item) { const para = doc.createParagraph(); - para.createTextRun(doc.createImage(item.image)); + para.createTextRun(doc.createImage(fs.readFileSync(item.image))); para.properties.width = 60; para.properties.height = 90; doc.createParagraph(item.comment).style("normalPara2"); diff --git a/demo/demo12.js b/demo/demo12.js index 7fd5eb5ffc..87c7a405e0 100644 --- a/demo/demo12.js +++ b/demo/demo12.js @@ -1,14 +1,15 @@ const docx = require("../build"); +const fs = require('fs'); var doc = new docx.Document(); var paragraph = new docx.Paragraph("Hello World"); doc.addParagraph(paragraph); -const image = doc.createImage("./demo/images/pizza.gif"); -const image2 = doc.createImage("./demo/images/pizza.gif"); -const image3 = doc.createImage("./demo/images/pizza.gif"); -const image4 = doc.createImage("./demo/images/pizza.gif"); +const image = doc.createImage(fs.readFileSync("./demo/images/pizza.gif")); +const image2 = doc.createImage(fs.readFileSync("./demo/images/pizza.gif")); +const image3 = doc.createImage(fs.readFileSync("./demo/images/pizza.gif")); +const image4 = doc.createImage(fs.readFileSync("./demo/images/pizza.gif")); image.scale(0.5); image2.scale(1) diff --git a/demo/demo18.js b/demo/demo18.js index 9035d19e7a..73a778a6c3 100644 --- a/demo/demo18.js +++ b/demo/demo18.js @@ -6,8 +6,8 @@ var doc = new docx.Document(); const imageBase64Data = `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` -// doc.createImageFromBuffer(Buffer.from(imageBase64Data, 'base64')); -doc.createImageFromBuffer(Buffer.from(imageBase64Data, 'base64'), 100, 100); +// doc.createImage(Buffer.from(imageBase64Data, 'base64')); +doc.createImage(Buffer.from(imageBase64Data, 'base64'), 100, 100); var exporter = new docx.LocalPacker(doc); exporter.pack('My Document'); diff --git a/demo/demo5.js b/demo/demo5.js index 89638ad49b..fbb2cd0eaf 100644 --- a/demo/demo5.js +++ b/demo/demo5.js @@ -1,15 +1,16 @@ const docx = require("../build"); +const fs = require('fs'); var doc = new docx.Document(); var paragraph = new docx.Paragraph("Hello World"); doc.addParagraph(paragraph); -doc.createImage("./demo/images/image1.jpeg"); -doc.createImage("./demo/images/dog.png"); -doc.createImage("./demo/images/cat.jpg"); -doc.createImage("./demo/images/parrots.bmp"); -doc.createImage("./demo/images/pizza.gif"); +doc.createImage(fs.readFileSync("./demo/images/image1.jpeg")); +doc.createImage(fs.readFileSync("./demo/images/dog.png")); +doc.createImage(fs.readFileSync("./demo/images/cat.jpg")); +doc.createImage(fs.readFileSync("./demo/images/parrots.bmp")); +doc.createImage(fs.readFileSync("./demo/images/pizza.gif")); var exporter = new docx.LocalPacker(doc); exporter.pack("My Document"); diff --git a/demo/demo9.js b/demo/demo9.js index c93d8fa63c..c0a57cf8f6 100644 --- a/demo/demo9.js +++ b/demo/demo9.js @@ -1,11 +1,12 @@ const docx = require('../build'); +const fs = require('fs'); var doc = new docx.Document(); doc.createParagraph("Hello World"); -doc.Header.createImage("./demo/images/pizza.gif"); -doc.Footer.createImage("./demo/images/pizza.gif"); +doc.Header.createImage(fs.readFileSync("./demo/images/pizza.gif")); +doc.Footer.createImage(fs.readFileSync("./demo/images/pizza.gif")); var exporter = new docx.LocalPacker(doc); exporter.pack('My Document'); diff --git a/docs/usage/headers-and-footers.md b/docs/usage/headers-and-footers.md index bfe626a04c..1489576dda 100644 --- a/docs/usage/headers-and-footers.md +++ b/docs/usage/headers-and-footers.md @@ -19,8 +19,8 @@ doc.Footer.createParagraph("Footer text"); Even add images: ```js -doc.Header.createImage([PATH_TO_YOUR_IMAGE]); -doc.Footer.createImage([PATH_TO_YOUR_IMAGE]); +doc.Header.createImage([BUFFER_OF_YOUR_IMAGE]); +doc.Footer.createImage([BUFFER_OF_YOUR_IMAGE]); ``` Refer to `demo8.js` for more information diff --git a/docs/usage/images.md b/docs/usage/images.md index 2cc0339507..a89fa893cd 100644 --- a/docs/usage/images.md +++ b/docs/usage/images.md @@ -7,7 +7,7 @@ Adding images is very simple Simply call the `createImage` method: ```js -const image = doc.createImage([PATH_TO_YOUR_IMAGE]); +const image = doc.createImage([BUFFER_OF_YOUR_IMAGE]); ``` `docx` supports `jpeg`, `jpg`, `bmp`, `gif` and `png` @@ -43,7 +43,7 @@ interface DrawingOptions { can be passed when creating `PictureRun()` for example: ```js -const imageData = document.createImageData(filename, buffer, 903, 1149); +const imageData = document.createImage(buffer, 903, 1149); new docx.PictureRun(imageData, { position: docx.PlacementPosition.FLOATING, diff --git a/src/file/file.ts b/src/file/file.ts index d7ef02b520..becc713176 100644 --- a/src/file/file.ts +++ b/src/file/file.ts @@ -124,20 +124,13 @@ export class File { return this.document.createTable(rows, cols); } - public createImage(filePath: string): Image { - const image = Media.addImage(this, filePath); - this.document.addParagraph(image.Paragraph); - - return image; - } - public addImage(image: Image): File { this.document.addParagraph(image.Paragraph); return this; } - public createImageFromBuffer(buffer: Buffer, width?: number, height?: number): Image { - const image = Media.addImageFromBuffer(this, buffer, width, height); + public createImage(buffer: Buffer, width?: number, height?: number): Image { + const image = Media.addImage(this, buffer, width, height); this.document.addParagraph(image.Paragraph); return image; diff --git a/src/file/footer-wrapper.ts b/src/file/footer-wrapper.ts index c1080bbd4e..afd673c2b2 100644 --- a/src/file/footer-wrapper.ts +++ b/src/file/footer-wrapper.ts @@ -36,8 +36,8 @@ export class FooterWrapper { this.footer.addChildElement(childElement); } - public createImage(image: string): void { - const mediaData = this.media.addMedia(image, this.relationships.RelationshipCount); + public createImage(image: Buffer, width?: number, height?: number): void { + const mediaData = this.media.addMedia(image, this.relationships.RelationshipCount, width, height); this.relationships.createRelationship( mediaData.referenceId, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", diff --git a/src/file/header-wrapper.ts b/src/file/header-wrapper.ts index 1053bc2096..79a216610a 100644 --- a/src/file/header-wrapper.ts +++ b/src/file/header-wrapper.ts @@ -36,8 +36,8 @@ export class HeaderWrapper { this.header.addChildElement(childElement); } - public createImage(image: string): void { - const mediaData = this.media.addMedia(image, this.relationships.RelationshipCount); + public createImage(image: Buffer, width?: number, height?: number): void { + const mediaData = this.media.addMedia(image, this.relationships.RelationshipCount, width, height); this.relationships.createRelationship( mediaData.referenceId, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", diff --git a/src/file/media/data.ts b/src/file/media/data.ts index dfc7a664a0..9ac7ab5eee 100644 --- a/src/file/media/data.ts +++ b/src/file/media/data.ts @@ -1,5 +1,3 @@ -import * as fs from "fs"; - export interface IMediaDataDimensions { pixels: { x: number; @@ -13,7 +11,7 @@ export interface IMediaDataDimensions { export interface IMediaData { referenceId: number; - stream: fs.ReadStream | Buffer; + stream: Buffer; path?: string; fileName: string; dimensions: IMediaDataDimensions; diff --git a/src/file/media/media.ts b/src/file/media/media.ts index b0fb4019d8..f2cb71aa2f 100644 --- a/src/file/media/media.ts +++ b/src/file/media/media.ts @@ -1,6 +1,4 @@ -import * as fs from "fs"; import * as sizeOf from "image-size"; -import * as path from "path"; import { File } from "../file"; import { ImageParagraph } from "../paragraph"; @@ -12,28 +10,10 @@ interface IHackedFile { } export class Media { - public static addImage(file: File, filePath: string): Image { + public static addImage(file: File, buffer: Buffer, width?: number, height?: number): Image { // Workaround to expose id without exposing to API const exposedFile = (file as {}) as IHackedFile; - const mediaData = file.Media.addMedia(filePath, exposedFile.currentRelationshipId++); - file.DocumentRelationships.createRelationship( - mediaData.referenceId, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", - `media/${mediaData.fileName}`, - ); - return new Image(new ImageParagraph(mediaData)); - } - - public static addImageFromBuffer(file: File, buffer: Buffer, width?: number, height?: number): Image { - // Workaround to expose id without exposing to API - const exposedFile = (file as {}) as IHackedFile; - const mediaData = file.Media.addMediaFromBuffer( - `${Media.generateId()}.png`, - buffer, - exposedFile.currentRelationshipId++, - width, - height, - ); + const mediaData = file.Media.addMedia(buffer, exposedFile.currentRelationshipId++, width, height); file.DocumentRelationships.createRelationship( mediaData.referenceId, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", @@ -71,14 +51,8 @@ export class Media { return data; } - public addMedia(filePath: string, referenceId: number): IMediaData { - const key = path.basename(filePath); - const dimensions = sizeOf(filePath); - return this.createMedia(key, referenceId, dimensions, fs.createReadStream(filePath), filePath); - } - - public addMediaFromBuffer(fileName: string, buffer: Buffer, referenceId: number, width?: number, height?: number): IMediaData { - const key = fileName; + public addMedia(buffer: Buffer, referenceId: number, width?: number, height?: number): IMediaData { + const key = `${Media.generateId()}.png`; let dimensions; if (width && height) { dimensions = { @@ -96,7 +70,7 @@ export class Media { key: string, relationshipsCount: number, dimensions: { width: number; height: number }, - data: fs.ReadStream | Buffer, + data: Buffer, filePath?: string, ): IMediaData { const imageData = {