Files
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

762 lines
26 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
'use strict';
const constants = require('./constants');
const {open} = require('node:fs/promises');
function getImageFormatBySignature(buffer) {
const length = buffer.length;
//1000 for svg(xml header and creator comment)
const startText = buffer.toString('ascii', 0, 1000);
//jpeg
// Hex: FF D8 FF
if (3 <= length && 0xff == buffer[0] && 0xd8 == buffer[1] && 0xff == buffer[2]) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_JPG;
}
//bmp ( http://ru.wikipedia.org/wiki/BMP )
//Hex: 42 4D
//ASCII: BM
//Hex (position 6) : 00 00
//Hex (position 26): 01 00
//Hex (position 28): 00 || 01 || 04 || 08 || 10 || 18 || 20
//Hex (position 29): 00
//Hex (position 30): 00 || 01 || 02 || 03 || 04 || 05
//Hex (position 31): 00 00 00
if (
34 <= length &&
0x42 == buffer[0] &&
0x4d == buffer[1] &&
0x00 == buffer[6] &&
0x00 == buffer[7] &&
0x01 == buffer[26] &&
0x00 == buffer[27] &&
(0x00 == buffer[28] ||
0x01 == buffer[28] ||
0x04 == buffer[28] ||
0x08 == buffer[28] ||
0x10 == buffer[28] ||
0x18 == buffer[28] ||
0x20 == buffer[28]) &&
0x00 == buffer[29] &&
(0x00 == buffer[30] || 0x01 == buffer[30] || 0x02 == buffer[30] || 0x03 == buffer[30] || 0x04 == buffer[30] || 0x05 == buffer[30]) &&
0x00 == buffer[31] &&
0x00 == buffer[32] &&
0x00 == buffer[33]
) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_BMP;
}
//gif
//Hex: 47 49 46 38
//ASCII: GIF8
//or for GIF87a...
//Hex: 47 49 46 38 37 61
//ASCII: GIF87a
//or for GIF89a...
//Hex: 47 49 46 38 39 61
//ASCII: GIF89a
if (0 == startText.indexOf('GIF8')) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_GIF;
}
if (0 == startText.indexOf('GIF87a') || 0 == startText.indexOf('GIF89a')) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_GIF;
}
//png
//Hex: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
//ASCII: .PNG........IHDR
if (
16 <= length &&
0x89 == buffer[0] &&
0x50 == buffer[1] &&
0x4e == buffer[2] &&
0x47 == buffer[3] &&
0x0d == buffer[4] &&
0x0a == buffer[5] &&
0x1a == buffer[6] &&
0x0a == buffer[7] &&
0x00 == buffer[8] &&
0x00 == buffer[9] &&
0x00 == buffer[10] &&
0x0d == buffer[11] &&
0x49 == buffer[12] &&
0x48 == buffer[13] &&
0x44 == buffer[14] &&
0x52 == buffer[15]
) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_PNG;
}
//CR2
//Hex: 49 49 2A 00 10 00 00 00 43 52
//ASCII: II*.....CR
if (
10 <= length &&
0x49 == buffer[0] &&
0x49 == buffer[1] &&
0x2a == buffer[2] &&
0x00 == buffer[3] &&
0x10 == buffer[4] &&
0x00 == buffer[5] &&
0x00 == buffer[6] &&
0x00 == buffer[7] &&
0x43 == buffer[8] &&
0x52 == buffer[9]
) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_CR2;
}
//tiff
//Hex: 49 49 2A 00
//ASCII:
//or for big endian
//Hex: 4D 4D 00 2A
//ASCII: MM.*
//or for little endian
//Hex: 49 49 2A 00
//ASCII: II*
if (4 <= length) {
if (
(0x49 == buffer[0] && 0x49 == buffer[1] && 0x2a == buffer[2] && 0x00 == buffer[3]) ||
(0x4d == buffer[0] && 0x4d == buffer[1] && 0x00 == buffer[2] && 0x2a == buffer[3]) ||
(0x49 == buffer[0] && 0x49 == buffer[1] && 0x2a == buffer[2] && 0x00 == buffer[3])
) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_TIFF;
}
}
//wmf
//Hex: D7 CD C6 9A 00 00
//or for Windows 3.x
//Hex: 01 00 09 00 00 03
if (6 <= length) {
if (
(0xd7 == buffer[0] && 0xcd == buffer[1] && 0xc6 == buffer[2] && 0x9a == buffer[3] && 0x00 == buffer[4] && 0x00 == buffer[5]) ||
(0x01 == buffer[0] && 0x00 == buffer[1] && 0x09 == buffer[2] && 0x00 == buffer[3] && 0x00 == buffer[4] && 0x03 == buffer[5])
) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_WMF;
}
}
//emf ( http://wvware.sourceforge.net/caolan/ora-wmf.html )
//Hex: 01 00 00 00
//Hex (position 40): 20 45 4D 46
if (
44 <= length &&
0x01 == buffer[0] &&
0x00 == buffer[1] &&
0x00 == buffer[2] &&
0x00 == buffer[3] &&
0x20 == buffer[40] &&
0x45 == buffer[41] &&
0x4d == buffer[42] &&
0x46 == buffer[43]
) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_EMF;
}
//pcx ( http://www.fileformat.info/format/pcx/corion.htm )
//Hex (position 0): 0A
//Hex (position 1): 00 || 01 || 02 || 03 || 04 || 05
//Hex (position 3): 01 || 02 || 04 || 08 ( Bytes per pixel )
if (
4 <= length &&
0x0a == buffer[0] &&
(0x00 == buffer[1] || 0x01 == buffer[1] || 0x02 == buffer[1] || 0x03 == buffer[1] || 0x04 == buffer[1] || 0x05 == buffer[1]) &&
(0x01 == buffer[3] || 0x02 == buffer[3] || 0x04 == buffer[3] || 0x08 == buffer[3])
) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_PCX;
}
//tga ( http://www.fileformat.info/format/tga/corion.htm )
//DATA TYPE 1-COLOR-MAPPED IMAGES : Hex (position 1) : 01 01
//DATA TYPE 2-TRUE-COLOR IMAGES : Hex (position 1) : 00 02
//DATA TYPE 3-BLACK AND WHITE(UNMAPPED) IMAGES : Hex (position 1) : 00 03
//DATA TYPE 9-RUN-LENGTH ENCODED(RLE),COLOR-MAPPED IMAGES : Hex (position 1) : 01 09
//DATA TYPE 10-RUN-LENGTH ENCODED(RLE),TRUE-COLOR IMAGES : Hex (position 1) : 00 0A
//DATA TYPE 11-RUN-LENGTH ENCODED(RLE),BLACK AND WHITE IMAGES : Hex (position 1) : 00 0B
// + Bytes per pixel : Hex (position 16): 0x08 || 0x10 || 0x18 || 0x20
if (
17 <= length &&
((0x01 == buffer[1] && 0x01 == buffer[2]) ||
(0x00 == buffer[1] && 0x02 == buffer[2]) ||
(0x00 == buffer[1] && 0x03 == buffer[2]) ||
(0x01 == buffer[1] && 0x09 == buffer[2]) ||
(0x00 == buffer[1] && 0x0a == buffer[2]) ||
(0x00 == buffer[1] && 0x0b == buffer[2])) &&
(0x08 == buffer[16] || 0x10 == buffer[16] || 0x18 == buffer[16] || 0x20 == buffer[16])
) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_TGA;
}
//ras
//Hex: 59 A6 6A 95
//ASCII: Y
if (4 <= length && 0x59 == buffer[0] && 0xa6 == buffer[1] && 0x6a == buffer[2] && 0x95 == buffer[3]) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_RAS;
}
//ipod
//(None or Unknown)
//psd
//Hex: 38 42 50 53 00 01 00 00 00 00 00 00 00
//ASCII: 8BPS
if (
13 <= length &&
0x38 == buffer[0] &&
0x42 == buffer[1] &&
0x50 == buffer[2] &&
0x53 == buffer[3] &&
0x00 == buffer[4] &&
0x01 == buffer[5] &&
0x00 == buffer[6] &&
0x00 == buffer[7] &&
0x00 == buffer[8] &&
0x00 == buffer[9] &&
0x00 == buffer[10] &&
0x00 == buffer[11] &&
0x00 == buffer[12]
) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_PSD;
}
//ico
//Hex: 00 00 01 00
if (4 <= length && 0x00 == buffer[0] && 0x00 == buffer[1] && 0x01 == buffer[2] && 0x00 == buffer[3]) {
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_ICO;
}
//svg
//todo sax parser
if (-1 !== startText.indexOf('<svg')) {
return constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SVG;
}
return constants.AVS_OFFICESTUDIO_FILE_UNKNOWN;
}
exports.getFormatFromString = function (ext) {
if (!ext) {
return constants.AVS_OFFICESTUDIO_FILE_UNKNOWN;
}
switch (ext.toLowerCase()) {
case 'docx':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX;
case 'doc':
case 'wps':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC;
case 'odt':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT;
case 'rtf':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF;
case 'txt':
case 'xml':
case 'xslt':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT;
case 'htm':
case 'html':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML;
case 'mht':
case 'mhtml':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_MHT;
case 'epub':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB;
case 'fb2':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2;
case 'mobi':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_MOBI;
case 'docm':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM;
case 'dotx':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX;
case 'dotm':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM;
case 'fodt':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT_FLAT;
case 'ott':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_OTT;
case 'oform':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM;
case 'docxf':
return constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF;
case 'pptx':
return constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX;
case 'ppt':
case 'dps':
return constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT;
case 'odp':
return constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP;
case 'ppsx':
return constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX;
case 'pptm':
return constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM;
case 'ppsm':
return constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM;
case 'potx':
return constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX;
case 'potm':
return constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM;
case 'fodp':
return constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP_FLAT;
case 'otp':
return constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_OTP;
case 'odg':
return constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_ODG;
case 'xlsx':
return constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX;
case 'xls':
case 'et':
return constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS;
case 'ods':
return constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS;
case 'csv':
return constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV;
case 'xlsm':
return constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM;
case 'xltx':
return constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX;
case 'xltm':
return constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM;
case 'xlsb':
return constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB;
case 'fods':
return constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS_FLAT;
case 'ots':
return constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_OTS;
case 'jpeg':
case 'jpe':
case 'jpg':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_JPG;
case 'tif':
case 'tiff':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_TIFF;
case 'tga':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_TGA;
case 'gif':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_GIF;
case 'png':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_PNG;
case 'emf':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_EMF;
case 'wmf':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_WMF;
case 'bmp':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_BMP;
case 'cr2':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_CR2;
case 'pcx':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_PCX;
case 'ras':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_RAS;
case 'psd':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_PSD;
case 'ico':
return constants.AVS_OFFICESTUDIO_FILE_IMAGE_ICO;
case 'pdf':
return constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF;
case 'pdfa':
return constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDFA;
case 'swf':
return constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF;
case 'djvu':
return constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU;
case 'xps':
return constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS;
case 'svg':
return constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SVG;
case 'htmlr':
return constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLR;
case 'doct':
return constants.AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY;
case 'xlst':
return constants.AVS_OFFICESTUDIO_FILE_TEAMLAB_XLSY;
case 'pptt':
return constants.AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY;
case 'ooxml':
return constants.AVS_OFFICESTUDIO_FILE_OTHER_OOXML;
case 'odf':
return constants.AVS_OFFICESTUDIO_FILE_OTHER_ODF;
case 'vsdx':
return constants.AVS_OFFICESTUDIO_FILE_DRAW_VSDX;
case 'vssx':
return constants.AVS_OFFICESTUDIO_FILE_DRAW_VSSX;
case 'vstx':
return constants.AVS_OFFICESTUDIO_FILE_DRAW_VSTX;
case 'vsdm':
return constants.AVS_OFFICESTUDIO_FILE_DRAW_VSDM;
case 'vssm':
return constants.AVS_OFFICESTUDIO_FILE_DRAW_VSSM;
case 'vstm':
return constants.AVS_OFFICESTUDIO_FILE_DRAW_VSTM;
default:
return constants.AVS_OFFICESTUDIO_FILE_UNKNOWN;
}
};
exports.getStringFromFormat = function (format) {
switch (format) {
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX:
return 'docx';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC:
return 'doc';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT:
return 'odt';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF:
return 'rtf';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT:
return 'txt';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML:
return 'html';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_MHT:
return 'mht';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB:
return 'epub';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2:
return 'fb2';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_MOBI:
return 'mobi';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM:
return 'docm';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX:
return 'dotx';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM:
return 'dotm';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT_FLAT:
return 'fodt';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_OTT:
return 'ott';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC_FLAT:
return 'doc';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_FLAT:
return 'docx';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML_IN_CONTAINER:
return 'doc';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_PACKAGE:
return 'xml';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM:
return 'oform';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF:
return 'docxf';
case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM_PDF:
return 'pdf';
case constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX:
return 'pptx';
case constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT:
return 'ppt';
case constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP:
return 'odp';
case constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX:
return 'ppsx';
case constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM:
return 'pptm';
case constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM:
return 'ppsm';
case constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX:
return 'potx';
case constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM:
return 'potm';
case constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP_FLAT:
return 'fodp';
case constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_OTP:
return 'otp';
case constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX_PACKAGE:
return 'xml';
case constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_ODG:
return 'odg';
case constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX:
return 'xlsx';
case constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS:
return 'xls';
case constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS:
return 'ods';
case constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV:
return 'csv';
case constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM:
return 'xlsm';
case constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX:
return 'xltx';
case constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM:
return 'xltm';
case constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB:
return 'xlsb';
case constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS_FLAT:
return 'fods';
case constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_OTS:
return 'ots';
case constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_FLAT:
return 'xlsx';
case constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_PACKAGE:
return 'xml';
case constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF:
case constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDFA:
return 'pdf';
case constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF:
return 'swf';
case constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU:
return 'djvu';
case constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS:
return 'xps';
case constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SVG:
return 'svg';
case constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLR:
return 'htmlr';
case constants.AVS_OFFICESTUDIO_FILE_OTHER_HTMLZIP:
return 'zip';
case constants.AVS_OFFICESTUDIO_FILE_OTHER_JSON:
return 'json';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE:
return 'zip';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_JPG:
return 'jpg';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_TIFF:
return 'tiff';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_TGA:
return 'tga';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_GIF:
return 'gif';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_PNG:
return 'png';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_EMF:
return 'emf';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_WMF:
return 'wmf';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_BMP:
return 'bmp';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_CR2:
return 'cr2';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_PCX:
return 'pcx';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_RAS:
return 'ras';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_PSD:
return 'psd';
case constants.AVS_OFFICESTUDIO_FILE_IMAGE_ICO:
return 'ico';
case constants.AVS_OFFICESTUDIO_FILE_CANVAS_WORD:
case constants.AVS_OFFICESTUDIO_FILE_CANVAS_SPREADSHEET:
case constants.AVS_OFFICESTUDIO_FILE_CANVAS_PRESENTATION:
case constants.AVS_OFFICESTUDIO_FILE_CANVAS_PDF:
return 'bin';
case constants.AVS_OFFICESTUDIO_FILE_OTHER_OLD_DOCUMENT:
case constants.AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY:
return 'doct';
case constants.AVS_OFFICESTUDIO_FILE_TEAMLAB_XLSY:
return 'xlst';
case constants.AVS_OFFICESTUDIO_FILE_OTHER_OLD_PRESENTATION:
case constants.AVS_OFFICESTUDIO_FILE_OTHER_OLD_DRAWING:
case constants.AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY:
return 'pptt';
case constants.AVS_OFFICESTUDIO_FILE_OTHER_OOXML:
return 'ooxml';
case constants.AVS_OFFICESTUDIO_FILE_OTHER_ODF:
return 'odf';
case constants.AVS_OFFICESTUDIO_FILE_DRAW_VSDX:
return 'vsdx';
case constants.AVS_OFFICESTUDIO_FILE_DRAW_VSSX:
return 'vssx';
case constants.AVS_OFFICESTUDIO_FILE_DRAW_VSTX:
return 'vstx';
case constants.AVS_OFFICESTUDIO_FILE_DRAW_VSDM:
return 'vsdm';
case constants.AVS_OFFICESTUDIO_FILE_DRAW_VSSM:
return 'vssm';
case constants.AVS_OFFICESTUDIO_FILE_DRAW_VSTM:
return 'vstm';
default:
return '';
}
};
exports.getImageFormat = function (ctx, buffer) {
let format = constants.AVS_OFFICESTUDIO_FILE_UNKNOWN;
try {
//signature
format = getImageFormatBySignature(buffer);
} catch (e) {
ctx.logger.error('error getImageFormat: %s', e.stack);
}
return format;
};
exports.isDocumentFormat = function (format) {
return (
0 !== (format & constants.AVS_OFFICESTUDIO_FILE_DOCUMENT) ||
format === constants.AVS_OFFICESTUDIO_FILE_CANVAS_WORD ||
format === constants.AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY
);
};
exports.isSpreadsheetFormat = function (format) {
return (
0 !== (format & constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET) ||
format === constants.AVS_OFFICESTUDIO_FILE_CANVAS_SPREADSHEET ||
format === constants.AVS_OFFICESTUDIO_FILE_TEAMLAB_XLSY
);
};
exports.isPresentationFormat = function (format) {
return (
0 !== (format & constants.AVS_OFFICESTUDIO_FILE_PRESENTATION) ||
format === constants.AVS_OFFICESTUDIO_FILE_CANVAS_PRESENTATION ||
format === constants.AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY
);
};
exports.isOOXFormat = function (format) {
return (
constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX === format ||
constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM === format ||
constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX === format ||
constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM === format ||
constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM === format ||
constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF === format ||
constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM_PDF === format ||
constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX === format ||
constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX === format ||
constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM === format ||
constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM === format ||
constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX === format ||
constants.AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM === format ||
constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX === format ||
constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM === format ||
constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX === format ||
constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM === format
);
};
exports.isBrowserEditorFormat = function (format) {
return (
constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF === format ||
constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDFA === format ||
constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU === format ||
constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS === format
);
};
function getDocumentFormatBySignature(buffer) {
if (!buffer) {
return constants.AVS_OFFICESTUDIO_FILE_UNKNOWN;
}
const text = buffer.toString('latin1');
// Check for binary DOCT format.
if (4 <= text.length && text[0] === 'D' && text[1] === 'O' && text[2] === 'C' && text[3] === 'Y') {
return constants.AVS_OFFICESTUDIO_FILE_CANVAS_WORD;
}
// Check for binary XLST format
if (4 <= text.length && text[0] === 'X' && text[1] === 'L' && text[2] === 'S' && text[3] === 'Y') {
return constants.AVS_OFFICESTUDIO_FILE_CANVAS_SPREADSHEET;
}
// Check for binary PPTT format
if (4 <= text.length && text[0] === 'P' && text[1] === 'P' && text[2] === 'T' && text[3] === 'Y') {
return constants.AVS_OFFICESTUDIO_FILE_CANVAS_PRESENTATION;
}
// Unknown format
return constants.AVS_OFFICESTUDIO_FILE_UNKNOWN;
}
/**
* Определяет формат Office документов по ZIP сигнатуре
* @param {Buffer} buffer - Буфер с данными файла
* @returns {number} Константа формата или AVS_OFFICESTUDIO_FILE_UNKNOWN
*/
function getOfficeZipFormatBySignature(buffer) {
const length = buffer.length;
// Check ZIP signature (PK header)
if (
4 <= length &&
0x50 == buffer[0] &&
0x4b == buffer[1] &&
(0x03 == buffer[2] || 0x05 == buffer[2] || 0x07 == buffer[2]) && // ZIP version markers
0x04 == buffer[3]
) {
const searchFromEnd = 8192; // Search last 8KB where central directory located
const startPos = Math.max(0, length - searchFromEnd);
// Helper function for direct byte search in ZIP central directory
const searchOfficeFile = filename => {
const searchBytes = Buffer.from(filename, 'utf8');
const searchLen = searchBytes.length;
const endPos = Math.max(0, length - searchLen);
for (let i = endPos; i >= startPos; i--) {
let match = true;
for (let j = 0; j < searchLen; j++) {
if (buffer[i + j] !== searchBytes[j]) {
match = false;
break;
}
}
if (match) return true;
}
return false;
};
// Check for Excel files
if (searchOfficeFile('xl/workbook.xml')) {
return constants.AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX;
}
}
return constants.AVS_OFFICESTUDIO_FILE_UNKNOWN;
}
async function getDocumentFormatByFile(file) {
const firstBytesLen = 100;
let buffer;
let fd;
try {
fd = await open(file, 'r');
const stream = fd.createReadStream({start: 0, end: firstBytesLen});
const chunks = [];
for await (const chunk of stream) {
chunks.push(Buffer.from(chunk));
}
buffer = Buffer.concat(chunks);
} finally {
await fd?.close();
}
return getDocumentFormatBySignature(buffer);
}
exports.getDocumentFormatBySignature = getDocumentFormatBySignature;
exports.getDocumentFormatByFile = getDocumentFormatByFile;
exports.getOfficeZipFormatBySignature = getOfficeZipFormatBySignature;