diff --git a/Apple/IWork.h b/Apple/IWork.h index d51e8aca53..092fc1ea1e 100644 --- a/Apple/IWork.h +++ b/Apple/IWork.h @@ -1,5 +1,5 @@ -#ifndef _FB2FILE_FB2FILE_H -#define _FB2FILE_FB2FILE_H +#ifndef _IWORKFILE_IWORKFILE_H +#define _IWORKFILE_IWORKFILE_H #include @@ -33,4 +33,4 @@ public: void SetTmpDirectory(const std::wstring& sFolder); }; -#endif // _FB2FILE_FB2FILE_H +#endif // _IWORKFILE_IWORKFILE_H diff --git a/Common/OfficeFileFormatChecker2.cpp b/Common/OfficeFileFormatChecker2.cpp index ec8a16a627..2b49c48ddf 100644 --- a/Common/OfficeFileFormatChecker2.cpp +++ b/Common/OfficeFileFormatChecker2.cpp @@ -879,6 +879,12 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring &_fileName) nFileType = AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY; else if (0 == sExt.compare(L".txt") || 0 == sExt.compare(L".xml") || 0 == sExt.compare(L".rtf") || 0 == sExt.compare(L".doc") || 0 == sExt.compare(L".docx") || 0 == sExt.compare(L".md")) nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT; + else if (0 == sExt.compare(L".pages")) + nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_PAGES; + else if (0 == sExt.compare(L".numbers")) + nFileType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_NUMBERS; + else if (0 == sExt.compare(L".key")) + nFileType = AVS_OFFICESTUDIO_FILE_PRESENTATION_KEY; if (nFileType != AVS_OFFICESTUDIO_FILE_UNKNOWN) return true; diff --git a/Common/OfficeFileFormats.h b/Common/OfficeFileFormats.h index 2221abef9a..c2c3ca6aec 100644 --- a/Common/OfficeFileFormats.h +++ b/Common/OfficeFileFormats.h @@ -56,6 +56,7 @@ #define AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0015 #define AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0016 #define AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM_PDF AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0017 +#define AVS_OFFICESTUDIO_FILE_DOCUMENT_PAGES AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0018 #define AVS_OFFICESTUDIO_FILE_DOCUMENT_XML AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0030 @@ -72,6 +73,7 @@ #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_PRESENTATION_ODG AVS_OFFICESTUDIO_FILE_PRESENTATION + 0x000c +#define AVS_OFFICESTUDIO_FILE_PRESENTATION_KEY AVS_OFFICESTUDIO_FILE_PRESENTATION + 0x000d #define AVS_OFFICESTUDIO_FILE_SPREADSHEET 0x0100 #define AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX AVS_OFFICESTUDIO_FILE_SPREADSHEET + 0x0001 @@ -87,6 +89,7 @@ #define AVS_OFFICESTUDIO_FILE_SPREADSHEET_OTS AVS_OFFICESTUDIO_FILE_SPREADSHEET + 0x000a #define AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_FLAT AVS_OFFICESTUDIO_FILE_SPREADSHEET + 0x000b #define AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_PACKAGE AVS_OFFICESTUDIO_FILE_SPREADSHEET + 0x000c +#define AVS_OFFICESTUDIO_FILE_SPREADSHEET_NUMBERS AVS_OFFICESTUDIO_FILE_SPREADSHEET + 0x000d #define AVS_OFFICESTUDIO_FILE_CROSSPLATFORM 0x0200 #define AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF AVS_OFFICESTUDIO_FILE_CROSSPLATFORM + 0x0001 diff --git a/X2tConverter/build/Qt/X2tConverter.pri b/X2tConverter/build/Qt/X2tConverter.pri index 687618b55d..7f901c2871 100755 --- a/X2tConverter/build/Qt/X2tConverter.pri +++ b/X2tConverter/build/Qt/X2tConverter.pri @@ -95,7 +95,9 @@ HEADERS += \ ../../src/lib/odf.h \ \ ../../src/lib/pdf_image.h \ - ../../src/lib/pdf_oform.h + ../../src/lib/pdf_oform.h \ + \ + ../../src/lib/iwork.h #vbaformat LIBS += -L$$CORE_BUILDS_LIBRARIES_PATH -lVbaFormatLib @@ -127,7 +129,7 @@ LIBS += -L$$CORE_BUILDS_LIBRARIES_PATH -lCryptoPPLib #All dynamic libs -ADD_DEPENDENCY(graphics, kernel, UnicodeConverter, kernel_network, Fb2File, PdfFile, HtmlFile2, EpubFile, XpsFile, DjVuFile, HtmlRenderer, doctrenderer, DocxRenderer) +ADD_DEPENDENCY(graphics, kernel, UnicodeConverter, kernel_network, Fb2File, PdfFile, HtmlFile2, EpubFile, XpsFile, DjVuFile, HtmlRenderer, doctrenderer, DocxRenderer, IWorkFile) ##################################################### diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index 53f1872143..15ef802260 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -52,6 +52,8 @@ #include "lib/pdf_image.h" #include "lib/pdf_oform.h" +#include "lib/iwork.h" + #include "../../DesktopEditor/doctrenderer/docbuilder.h" #include "../../MsBinaryFile/Common/Vba/VbaReader.h" @@ -544,6 +546,17 @@ namespace NExtractTools } } } + else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_PAGES == nFormatFrom) + { + std::wstring wsTempFile = combinePath(convertParams.m_sTempDir, L"IntermediateFile.odf"); + + int nIntermediateResult = pages2odf(sFrom, wsTempFile, params, convertParams); + + if (S_OK != nIntermediateResult) + return nIntermediateResult; + + nRes = fromDocument(wsTempFile, AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT_FLAT, params, convertParams); + } else { std::wstring sDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); @@ -1015,6 +1028,17 @@ namespace NExtractTools { nRes = xml2xlsx_dir(sFrom, sXlsxDir, params, convertParams); } + else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_NUMBERS == nFormatFrom) + { + std::wstring wsTempFile = combinePath(convertParams.m_sTempDir, L"IntermediateFile.odf"); + + int nIntermediateResult = numbers2odf(sFrom, wsTempFile, params, convertParams); + + if (S_OK != nIntermediateResult) + return nIntermediateResult; + + nRes = fromSpreadsheet(wsTempFile, AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS_FLAT, params, convertParams); + } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; @@ -1301,6 +1325,17 @@ namespace NExtractTools { nRes = package2ooxml_dir(sFrom, sPptxDir, params, convertParams); } + else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_KEY == nFormatFrom) + { + std::wstring wsTempFile = combinePath(convertParams.m_sTempDir, L"IntermediateFile.odf"); + + int nIntermediateResult = key2odf(sFrom, wsTempFile, params, convertParams); + + if (S_OK != nIntermediateResult) + return nIntermediateResult; + + nRes = fromPresentation(wsTempFile, AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP_FLAT, params, convertParams); + } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; diff --git a/X2tConverter/src/ASCConverters.h b/X2tConverter/src/ASCConverters.h index 1d2b66e6af..a7007612a2 100644 --- a/X2tConverter/src/ASCConverters.h +++ b/X2tConverter/src/ASCConverters.h @@ -269,6 +269,11 @@ namespace NExtractTools DECLARE_CONVERT_FUNC(pdfoform2doct); DECLARE_CONVERT_FUNC(doct2pdfoform); + // iWork + DECLARE_CONVERT_FUNC(pages2odf); + DECLARE_CONVERT_FUNC(numbers2odf); + DECLARE_CONVERT_FUNC(key2odf); + //------------------------------------------------------------------------------------------------------------------------------------------------- _UINT32 convertmailmerge(const InputParamsMailMerge& oMailMergeSend, const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams); diff --git a/X2tConverter/src/lib/iwork.h b/X2tConverter/src/lib/iwork.h new file mode 100644 index 0000000000..529c672a41 --- /dev/null +++ b/X2tConverter/src/lib/iwork.h @@ -0,0 +1,63 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * 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 + * + */ +#pragma once + +#include "../../../Apple/IWork.h" +#include "common.h" + +namespace NExtractTools +{ + _UINT32 iworkformat2odf(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams, IWorkFileType eVerificationType) + { + CIWorkFile oFile; + oFile.SetTmpDirectory(convertParams.m_sTempDir); + + if (eVerificationType != oFile.GetType(sFrom)) + return AVS_FILEUTILS_ERROR_CONVERT; + + return (S_OK == oFile.Convert2Odf(sFrom, sTo)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 pages2odf(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + return iworkformat2odf(sFrom, sTo, params, convertParams, IWorkFileType::Pages); + } + + _UINT32 numbers2odf(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + return iworkformat2odf(sFrom, sTo, params, convertParams, IWorkFileType::Numbers); + } + + _UINT32 key2odf(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + return iworkformat2odf(sFrom, sTo, params, convertParams, IWorkFileType::Keynote); + } +}