Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 23 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Extract text content from a file.
- XLS
- XLSX
- JSON
- PPTX

### How to use

Expand All @@ -28,7 +29,7 @@ npm i -D any-text
var reader = require('any-text');

reader
.getText(`path-to-file`)
.getText({ filePath: `path-to-file` })
.then(function (data) {
console.log(data); // handle success
})
Expand All @@ -42,11 +43,23 @@ reader
```js
var reader = require('any-text');

const text = await reader.getText(`path-to-file`);
const text = await reader.getText({ filePath: `path-to-file` });

console.log(text);
```

- The `getText` method now also supports buffer input
```js
var reader = require('any-text');

const buffer = fs.readFileSync(`path-to-file`);
const text = await reader.getText({ fileData: buffer, fileExtension: '.pdf' });

console.log(text);

```


### Sample Test

```js
Expand All @@ -57,11 +70,18 @@ const expect = chai.expect;

describe('file reader checks', () => {
it('check docx file content', async () => {
expect(await reader.getText(`${process.cwd()}/test/files/dummy.docx`)).to.contains(
expect(await reader.getText({ filePath: `${process.cwd()}/test/files/dummy.docx` })).to.contains(
'Lorem ipsum'
);
});

it('check pptx file content', async () => {
expect(await reader.getText({ filePath: `${process.cwd()}/test/files/sample.pptx` })).to.contains(
'Sample text'
);
});
});

```

### Tell me your issues
Expand Down
75 changes: 69 additions & 6 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
const fs = require('fs');
const StreamZip = require('node-stream-zip');
const XLSX = require('xlsx');
const pdf = require('pdf-parse');
const pdf = require('pdf-parse/lib/pdf-parse');
const JSZip = require('jszip');
let WordExtractor = require('word-extractor');
const { DOMParser } = require('xmldom');


// extract text from office books as doc and docx
extract = (filePath) => {
Expand Down Expand Up @@ -50,6 +53,51 @@ open = (filePath) => {
});
};

getTextFromPPTX = async (buffer) => {
try {
const zip = new JSZip();
await zip.loadAsync(buffer);

const aNamespace =
"http://schemas.openxmlformats.org/drawingml/2006/main";
let text = [];

let slideIndex = 1;
while (true) {
const slideFile = zip.file(`ppt/slides/slide${slideIndex}.xml`);

if (!slideFile) break;

const slideXmlStr = await slideFile.async("text");

const parser = new DOMParser();
const xmlDoc = parser.parseFromString(
slideXmlStr,
"application/xml"
);

text.push(getTextFromNodes(xmlDoc, "t", aNamespace));
slideIndex++;
}

return text;
} catch (err) {
console.error("Error extracting text from PPTX:", err);
return "";
}
}

function getTextFromNodes(node, tagName, namespaceURI) {
let text = "";
const textNodes = node.getElementsByTagNameNS(namespaceURI, tagName);
for (let i = 0; i < textNodes.length; i++) {
text += textNodes[i].textContent + " ";
}
return text.trim();
}



// get the file extension based on the file path
getFileExtension = (filename) => {
if (filename.length == 0) return '';
Expand All @@ -60,12 +108,25 @@ getFileExtension = (filename) => {
};

// read the file and extract text
exports.getText = async (filePath) => {
exports.getText = async ({ filePath, fileData, fileExtension }) => {
let fileContent = '';

let data = fs.readFileSync(filePath);
const fileExtension = getFileExtension(filePath);
if (filePath) {
// Legge il file dal percorso specificato
fileData = fs.readFileSync(filePath);
fileExtension = getFileExtension(filePath);
} else if (!fileData || !fileExtension) {
throw new Error('you have to provide either file path or file data and extension!');
}

if(!fileExtension){
fileExtension = getFileExtension(filePath);
}
if(!fileData){
var data = fs.readFileSync(filePath);
}else{
var data = fileData;
}
switch (fileExtension) {
// read pdf
case '.pdf':
Expand All @@ -76,7 +137,7 @@ exports.getText = async (filePath) => {
case '.docx':
case '.doc':
var extractor = new WordExtractor();
var extracted = await extractor.extract(filePath);
var extracted = await extractor.extract(data);
fileContent = extracted.getBody();
break;

Expand All @@ -103,7 +164,9 @@ exports.getText = async (filePath) => {
case '.json':
fileContent = data.toString();
break;

case '.pptx':
fileContent = await getTextFromPPTX(data);
break;
// default case
default:
throw new Error('unknown extension found!');
Expand Down
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@
"author": "Abhinaba Ghosh <askabhinaba@gmail.com>",
"license": "MIT",
"dependencies": {
"jszip": "^3.10.1",
"node-stream-zip": "^1.11.2",
"pdf-parse": "^1.1.1",
"word-extractor": "^1.0.4",
"xlsx": "^0.18.0"
"xlsx": "^0.18.0",
"xmldom": "^0.6.0"
},
"devDependencies": {
"chai": "^4.2.0",
Expand Down
Binary file added test/files/dummy.pptx
Binary file not shown.
143 changes: 134 additions & 9 deletions test/spces/fileReader.spec.js
Original file line number Diff line number Diff line change
@@ -1,53 +1,178 @@
let fileReader = require('../..');

const fs = require('fs');
const chai = require('chai');
const expect = chai.expect;
chai.use(require('chai-as-promised'));

describe('file reader checks', () => {
it('check xls file content', async () => {
expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.xls`)).to.contains(
const filePath = `${process.cwd()}/test/files/dummy.xls`;
expect(await fileReader.getText({filePath: filePath})).to.contains(
'Kathleen'
);
});

it('check xlsx file content', async () => {
expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.xlsx`)).to.contains(
const filePath = `${process.cwd()}/test/files/dummy.xlsx`;
expect(await fileReader.getText({filePath: filePath})).to.contains(
'Kathleen'
);
});

it('check pdf file content', async () => {
expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.pdf`)).to.contains('Dummy');
const filePath = `${process.cwd()}/test/files/dummy.pdf`;
expect(await fileReader.getText({filePath: filePath})).to.contains('Dummy');
});

it('check docx file content', async () => {
expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.docx`)).to.contains(
const filePath = `${process.cwd()}/test/files/dummy.docx`;
expect(await fileReader.getText({filePath: filePath})).to.contains(
'Lorem ipsum'
);
});

it('check doc file content', async () => {
expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.doc`)).to.contains(
const filePath = `${process.cwd()}/test/files/dummy.doc`;
expect(await fileReader.getText({filePath: filePath})).to.contains(
'Welcome'
);
});

it('check csv file content', async () => {
expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.csv`)).to.contains(
const filePath = `${process.cwd()}/test/files/dummy.csv`;
expect(await fileReader.getText({filePath: filePath})).to.contains(
'First Name'
);
});

it('check json file content', async () => {
expect(await fileReader.getText(`${process.cwd()}/test/files/dummy.json`)).to.contains('Doe');
const filePath = `${process.cwd()}/test/files/dummy.json`;
expect(await fileReader.getText({filePath: filePath})).to.contains('Doe');
});

it('check pptx file content', async () => {
const filePath = `${process.cwd()}/test/files/dummy.pptx`;
expect((await fileReader.getText({filePath})).toString()).to.contains(
'Sample'
);
});

it('Throw error on unknown extension', async () => {
try {
await fileReader.getText(`${process.cwd()}/test/files/dummy.html`);
const filePath = `${process.cwd()}/test/files/dummy.html`;
await fileReader.getText({filePath: filePath});
} catch (err) {
expect(String(err)).to.contains('Error: unknown extension found!');
}
});

it('xls whit buffer reader', async () => {
const filePath = `${process.cwd()}/test/files/dummy.xls`;
const fileData = fs.readFileSync(filePath);
const fileExtension = '.xls';
const result = await fileReader.getText({ fileData, fileExtension });

expect(await fileReader.getText({ fileData, fileExtension })).to.contains(
'Kathleen'
);
});

it('xlsx whit buffer reader', async () => {
const filePath = `${process.cwd()}/test/files/dummy.xlsx`;
const fileData = fs.readFileSync(filePath);
const fileExtension = '.xlsx';
const result = await fileReader.getText({ fileData, fileExtension });

expect(await fileReader.getText({ fileData, fileExtension })).to.contains(
'Kathleen'
);
});

it('pdf whit buffer reader', async () => {
const filePath = `${process.cwd()}/test/files/dummy.pdf`;
const fileData = fs.readFileSync(filePath);
const fileExtension = '.pdf';
const result = await fileReader.getText({ fileData, fileExtension });

expect(await fileReader.getText({ fileData, fileExtension })).to.contains(
'Dummy'
);
});

it('docx whit buffer reader', async () => {
const filePath = `${process.cwd()}/test/files/dummy.docx`;
const fileData = fs.readFileSync(filePath);
const fileExtension = '.docx';
const result = await fileReader.getText({ fileData, fileExtension });

expect(await fileReader.getText({ fileData, fileExtension })).to.contains(
'Lorem ipsum'
);
});

it('doc whit buffer reader', async () => {
const filePath = `${process.cwd()}/test/files/dummy.doc`;
const fileData = fs.readFileSync(filePath);
const fileExtension = '.doc';
const result = await fileReader.getText({ fileData, fileExtension });

expect(await fileReader.getText({ fileData, fileExtension })).to.contains(
'Welcome'
);
});

it('csv whit buffer reader', async () => {
const filePath = `${process.cwd()}/test/files/dummy.csv`;
const fileData = fs.readFileSync(filePath);
const fileExtension = '.csv';
const result = await fileReader.getText({ fileData, fileExtension });

expect(await fileReader.getText({ fileData, fileExtension })).to.contains(
'First Name'
);
});

it('json whit buffer reader', async () => {
const filePath = `${process.cwd()}/test/files/dummy.json`;
const fileData = fs.readFileSync(filePath);
const fileExtension = '.json';
const result = await fileReader.getText({ fileData, fileExtension });

expect(await fileReader.getText({ fileData, fileExtension })).to.contains(
'Doe'
);
});

it('pptx whit buffer reader', async () => {
const filePath = `${process.cwd()}/test/files/dummy.pptx`;
const fileData = fs.readFileSync(filePath);
const fileExtension = '.pptx';
const result = await fileReader.getText({ fileData, fileExtension });

expect((await fileReader.getText({ fileData, fileExtension })).toString()).to.contains(
'Sample'
);
});
it('Throw error on unknown extension with buffer reader', async () => {
try {
const filePath = `${process.cwd()}/test/files/dummy.html`;
const fileData = fs.readFileSync(filePath);
const fileExtension = '.html';
await fileReader.getText({ fileData, fileExtension });
} catch (err) {
expect(String(err)).to.contains('Error: unknown extension found!');
}
});

it('Throw error on unknown extension with buffer reader', async () => {
try {
const filePath = `${process.cwd()}/test/files/dummy.html`;
const fileData = fs.readFileSync(filePath);
const fileExtension = '.html';
await fileReader.getText({ fileData, fileExtension });
} catch (err) {
expect(String(err)).to.contains('Error: unknown extension found!');
}
});

});