From 79882d03af7bb435bf6b9df9e113f995ca9b608d Mon Sep 17 00:00:00 2001 From: Sergey Konovalov Date: Thu, 15 Jul 2021 20:05:54 +0300 Subject: [PATCH] [x2t] Add AVS_OFFICESTUDIO_FILE_OTHER_ODF to convert to any odf format; Split AVS_OFFICESTUDIO_FILE_DOCUMENT_PACKAGE format into parts; Add macro param to changeForm --- Common/OfficeFileFormatChecker2.cpp | 19 +++++++-- Common/OfficeFileFormats.h | 5 ++- X2tConverter/src/ASCConverters.cpp | 18 +++++++-- X2tConverter/src/cextracttools.cpp | 4 +- X2tConverter/src/cextracttools.h | 60 ++++++++++++++++++++++++----- 5 files changed, 88 insertions(+), 18 deletions(-) diff --git a/Common/OfficeFileFormatChecker2.cpp b/Common/OfficeFileFormatChecker2.cpp index fd01191fc1..69e432cf66 100644 --- a/Common/OfficeFileFormatChecker2.cpp +++ b/Common/OfficeFileFormatChecker2.cpp @@ -804,6 +804,9 @@ bool COfficeFileFormatChecker::isOOXFlatFormatFile(unsigned char* pBuffer,int dw const char *docxFormatLine = "xmlns:w=\"http://schemas.microsoft.com/office/word/2003/wordml\""; const char *xlsxFormatLine = "xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\""; + const char *docxPackage = "progid=\"Word.Document\""; + const char *xlsxPackage = "progid=\"Excel.Sheet\""; + const char *pptxPackage = "progid=\"PowerPoint.Show\""; const char *packageFormatLine = "xmlns:pkg=\"http://schemas.microsoft.com/office/2006/xmlPackage\""; if (std::string::npos != xml_string.find(docxFormatLine)) @@ -816,11 +819,21 @@ bool COfficeFileFormatChecker::isOOXFlatFormatFile(unsigned char* pBuffer,int dw } else if (std::string::npos != xml_string.find(packageFormatLine)) { - nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_PACKAGE; + if (std::string::npos != xml_string.find(docxPackage)) + { + nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_PACKAGE; + } + else if (std::string::npos != xml_string.find(xlsxPackage)) + { + nFileType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_PACKAGE; + } + else if (std::string::npos != xml_string.find(pptxPackage)) + { + nFileType = AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX_PACKAGE; + } } - if (nFileType != AVS_OFFICESTUDIO_FILE_UNKNOWN) return true; - return false; + return nFileType != AVS_OFFICESTUDIO_FILE_UNKNOWN; } std::wstring COfficeFileFormatChecker::GetExtensionByType(int type) { diff --git a/Common/OfficeFileFormats.h b/Common/OfficeFileFormats.h index 8847e85cac..ce7581c839 100644 --- a/Common/OfficeFileFormats.h +++ b/Common/OfficeFileFormats.h @@ -52,7 +52,7 @@ #define AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC_FLAT AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0010 #define AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_FLAT AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0011 #define AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML_IN_CONTAINER AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0012 -#define AVS_OFFICESTUDIO_FILE_DOCUMENT_PACKAGE AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0013 +#define AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_PACKAGE AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0014 #define AVS_OFFICESTUDIO_FILE_PRESENTATION 0x0080 #define AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX AVS_OFFICESTUDIO_FILE_PRESENTATION + 0x0001 @@ -65,6 +65,7 @@ #define AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM AVS_OFFICESTUDIO_FILE_PRESENTATION + 0x0008 #define AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP_FLAT AVS_OFFICESTUDIO_FILE_PRESENTATION + 0x0009 #define AVS_OFFICESTUDIO_FILE_PRESENTATION_OTP AVS_OFFICESTUDIO_FILE_PRESENTATION + 0x000a +#define AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX_PACKAGE AVS_OFFICESTUDIO_FILE_PRESENTATION + 0x000b #define AVS_OFFICESTUDIO_FILE_SPREADSHEET 0x0100 #define AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX AVS_OFFICESTUDIO_FILE_SPREADSHEET + 0x0001 @@ -77,6 +78,7 @@ #define AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS_FLAT AVS_OFFICESTUDIO_FILE_SPREADSHEET + 0x0008 #define AVS_OFFICESTUDIO_FILE_SPREADSHEET_OTS AVS_OFFICESTUDIO_FILE_SPREADSHEET + 0x0009 #define AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_FLAT AVS_OFFICESTUDIO_FILE_SPREADSHEET + 0x000a +#define AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_PACKAGE AVS_OFFICESTUDIO_FILE_SPREADSHEET + 0x000b #define AVS_OFFICESTUDIO_FILE_CROSSPLATFORM 0x0200 #define AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF AVS_OFFICESTUDIO_FILE_CROSSPLATFORM + 0x0001 @@ -114,6 +116,7 @@ #define AVS_OFFICESTUDIO_FILE_OTHER_TEAMLAB_INNER AVS_OFFICESTUDIO_FILE_OTHER + 0x0007 #define AVS_OFFICESTUDIO_FILE_OTHER_JSON AVS_OFFICESTUDIO_FILE_OTHER + 0x0008 // Для mail-merge #define AVS_OFFICESTUDIO_FILE_OTHER_ZIP AVS_OFFICESTUDIO_FILE_OTHER + 0x0009 +#define AVS_OFFICESTUDIO_FILE_OTHER_ODF AVS_OFFICESTUDIO_FILE_OTHER + 0x000a #define AVS_OFFICESTUDIO_FILE_TEAMLAB 0x1000 #define AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY AVS_OFFICESTUDIO_FILE_TEAMLAB + 0x0001 diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index cb108f5c4e..198c0d3e21 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -2933,7 +2933,9 @@ namespace NExtractTools const std::wstring & sXmlOptions = params.getXmlOptions(); return xlsxflat2xlst_bin(sResultDecryptFile, sTo, sTemp, params); }break; - case AVS_OFFICESTUDIO_FILE_DOCUMENT_PACKAGE: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_PACKAGE: + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_PACKAGE: + case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX_PACKAGE: { return package2bin(sResultDecryptFile, sTo, sTemp, params); }break; @@ -2979,7 +2981,7 @@ namespace NExtractTools if (OfficeFileFormatChecker.isOfficeFile(sResultDecryptFile)) { - params.changeFormatFrom(OfficeFileFormatChecker.nFileType); + params.changeFormatFrom(OfficeFileFormatChecker.nFileType, OfficeFileFormatChecker.bMacroEnabled); switch (OfficeFileFormatChecker.nFileType) { case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX: @@ -3673,7 +3675,7 @@ namespace NExtractTools { nRes = html_zip2docx_dir(sFrom, sDocxDir, sTemp, params); } - else if(AVS_OFFICESTUDIO_FILE_DOCUMENT_PACKAGE == nFormatFrom) + else if(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_PACKAGE == nFormatFrom) { nRes = package2ooxml_dir(sFrom, sDocxDir, sTemp, params); } @@ -3920,7 +3922,11 @@ namespace NExtractTools { nRes = odf_flat2oox_dir(sFrom, sXlsxDir, sTemp, params); } - else + else if(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_PACKAGE == nFormatFrom) + { + nRes = package2ooxml_dir(sFrom, sXlsxDir, sTemp, params); + } + else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; if(SUCCEEDED_X2T(nRes)) { @@ -4099,6 +4105,10 @@ namespace NExtractTools { nRes = potm2pptm_dir(sFrom, sPptxDir, params); } + } + else if(AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX_PACKAGE == nFormatFrom) + { + nRes = package2ooxml_dir(sFrom, sPptxDir, sTemp, params); } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; diff --git a/X2tConverter/src/cextracttools.cpp b/X2tConverter/src/cextracttools.cpp index fecd893168..d3083eb81b 100644 --- a/X2tConverter/src/cextracttools.cpp +++ b/X2tConverter/src/cextracttools.cpp @@ -130,7 +130,9 @@ namespace NExtractTools else if (0 == sExt2.compare(_T(".docm"))) res = TCD_DOTM2DOCM; else if (0 == sExt2.compare(_T(".txt"))) res = TCD_DOCX2TXT; }break; - case AVS_OFFICESTUDIO_FILE_DOCUMENT_PACKAGE: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_PACKAGE: + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_PACKAGE: + case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX_PACKAGE: { if (0 == sExt2.compare(_T(".doct"))) res = TCD_PKG2BIN_T; else if (0 == sExt2.compare(_T(".pptt"))) res = TCD_PKG2BIN_T; diff --git a/X2tConverter/src/cextracttools.h b/X2tConverter/src/cextracttools.h index efbe3e8017..cbff88ad6a 100644 --- a/X2tConverter/src/cextracttools.h +++ b/X2tConverter/src/cextracttools.h @@ -803,7 +803,7 @@ namespace NExtractTools FileFormatChecker.nFileType != AVS_OFFICESTUDIO_FILE_UNKNOWN) { nFormatFrom = FileFormatChecker.nFileType; - changeFormatFrom(nFormatFrom); + changeFormatFrom(nFormatFrom, FileFormatChecker.bMacroEnabled); } } eRes = processDownloadFile(); @@ -987,7 +987,7 @@ namespace NExtractTools } return nRes; } - void changeFormatFrom(int formatFrom) + void changeFormatFrom(int formatFrom, bool bMacroEnabled) { *m_nFormatFrom = formatFrom; int toFormat = *m_nFormatTo; @@ -1010,26 +1010,68 @@ namespace NExtractTools toFormat = AVS_OFFICESTUDIO_FILE_CANVAS_WORD; } } - else if ( AVS_OFFICESTUDIO_FILE_OTHER_TEAMLAB_INNER == toFormat) + else if ( AVS_OFFICESTUDIO_FILE_OTHER_TEAMLAB_INNER == toFormat || AVS_OFFICESTUDIO_FILE_OTHER_ODF == toFormat) { if ( AVS_OFFICESTUDIO_FILE_CANVAS_SPREADSHEET == formatFrom || AVS_OFFICESTUDIO_FILE_TEAMLAB_XLSY == formatFrom || 0 != ( AVS_OFFICESTUDIO_FILE_SPREADSHEET & formatFrom)) { - toFormat = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX; - } + if (AVS_OFFICESTUDIO_FILE_OTHER_ODF == toFormat) + { + toFormat = AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS; + } + else + { + if (bMacroEnabled) + { + toFormat = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM; + } + else + { + toFormat = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX; + } + } + } else if ( AVS_OFFICESTUDIO_FILE_CANVAS_PRESENTATION == formatFrom || AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY == formatFrom || 0 != ( AVS_OFFICESTUDIO_FILE_PRESENTATION & formatFrom)) { - toFormat = AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX; - } + if (AVS_OFFICESTUDIO_FILE_OTHER_ODF == toFormat) + { + toFormat = AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP; + } + else + { + if (bMacroEnabled) + { + toFormat = AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM; + } + else + { + toFormat = AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX; + } + } + } else if ( AVS_OFFICESTUDIO_FILE_CANVAS_WORD == formatFrom || AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY == formatFrom || 0 != ( AVS_OFFICESTUDIO_FILE_DOCUMENT & formatFrom)) { - toFormat = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX; - } + if (AVS_OFFICESTUDIO_FILE_OTHER_ODF == toFormat) + { + toFormat = AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT; + } + else + { + if (bMacroEnabled) + { + toFormat = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM; + } + else + { + toFormat = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX; + } + } + } size_t nIndex = m_sFileTo->rfind('.'); COfficeFileFormatChecker FileFormatChecker; if(-1 != nIndex)