n8n-nodes-doc-to-text
Version:
Custom n8n node to convert .doc files to text using mammoth
70 lines (60 loc) • 2.49 kB
text/typescript
import { INodeType, INodeTypeDescription, IExecuteFunctions, INodeInputConfiguration, INodeOutputConfiguration, NodeConnectionType } from 'n8n-workflow';
import * as mammoth from 'mammoth';
// Расширим интерфейс для поддержки бинарных данных
declare module 'n8n-workflow' {
interface IExecuteItem {
binary?: {
[key: string]: {
data: string;
mimeType?: string;
fileName?: string;
};
};
}
}
export class DocToText implements INodeType {
description: INodeTypeDescription = {
displayName: 'DOC to Text',
name: 'docToText',
group: ['transform'],
version: 1,
description: 'Convert DOC files to text using mammoth',
defaults: {
name: 'DOC to Text',
color: '#772244',
},
inputs: [NodeConnectionType.Main],
outputs: [NodeConnectionType.Main],
properties: [
{
displayName: 'Binary Field Name',
name: 'binaryFieldName',
type: 'string',
default: 'file',
placeholder: 'file',
required: true,
description: 'Name of the binary field containing the DOC file (e.g., "file").',
},
],
};
async execute(this: IExecuteFunctions) {
const items = this.getInputData();
const returnData = [];
for (let i = 0; i < items.length; i++) {
const binaryFieldName = this.getNodeParameter('binaryFieldName', i) as string;
const item = items[i];
if (!item.binary || !item.binary[binaryFieldName]) {
throw new Error(`No binary data found for field "${binaryFieldName}". Please ensure a file is passed to this node.`);
}
const binaryData = item.binary[binaryFieldName];
console.log('Binary data received:', binaryData);
const buffer = Buffer.from(binaryData.data, 'base64');
const result = await mammoth.extractRawText({ buffer });
if (result.messages && result.messages.length > 0) {
console.warn('Mammoth warnings:', result.messages);
}
returnData.push({ json: { text: result.value } });
}
return this.prepareOutputData(returnData);
}
}