From 4988c1853e7556f75a59392a0ae9a8010699b6cc Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 22 Nov 2023 21:49:13 +0300 Subject: [PATCH] Refactoring --- Common/OfficeFileFormatChecker.h | 1 + Common/OfficeFileFormatChecker2.cpp | 86 +- Common/OfficeFileFormats.h | 1 + X2tConverter/src/ASCConverters.cpp | 6654 +++++++++++++-------------- X2tConverter/src/ASCConverters.h | 400 +- X2tConverter/src/cextracttools.cpp | 9 +- X2tConverter/src/cextracttools.h | 30 +- 7 files changed, 3600 insertions(+), 3581 deletions(-) diff --git a/Common/OfficeFileFormatChecker.h b/Common/OfficeFileFormatChecker.h index a147b799cd..d8a9fe0755 100644 --- a/Common/OfficeFileFormatChecker.h +++ b/Common/OfficeFileFormatChecker.h @@ -95,6 +95,7 @@ public: bool isHtmlFormatFile(unsigned char* pBuffer, int dwBytes, bool testCloseTag); bool isMultiPartsHtmlFormatFile(unsigned char* pBuffer, int dwBytes); bool isPdfFormatFile(unsigned char* pBuffer, int dwBytes, std::wstring& documentID); + bool isPdfOformFormatFile(unsigned char* pBuffer, int dwBytes); bool isOpenOfficeFlatFormatFile(unsigned char* pBuffer, int dwBytes); bool isBinaryDoctFormatFile(unsigned char* pBuffer, int dwBytes); diff --git a/Common/OfficeFileFormatChecker2.cpp b/Common/OfficeFileFormatChecker2.cpp index 7efe01ee4f..a5d1c1a985 100644 --- a/Common/OfficeFileFormatChecker2.cpp +++ b/Common/OfficeFileFormatChecker2.cpp @@ -42,6 +42,8 @@ #include "3dParty/pole/pole.h" #include +#include "OfficeFileFormatDefines.h" + #define MIN_SIZE_BUFFER 4096 #define MAX_SIZE_BUFFER 102400 @@ -249,6 +251,39 @@ bool COfficeFileFormatChecker::isPdfFormatFile(unsigned char *pBuffer, int dwByt return false; } +bool COfficeFileFormatChecker::isPdfOformFormatFile(unsigned char *pBuffer, int dwBytes) +{ + pBuffer[dwBytes - 1] = 0; + char* pFirst = strstr((char*)pBuffer, "%\315\312\322\251\015"); + + if (!pFirst || pFirst - (char*)pBuffer + 6 >= dwBytes) + return false; + + pFirst += 6; + + if (strncmp(pFirst, "1 0 obj\012<<\012", 11) != 0 || pFirst - (char*)pBuffer + 11 >= dwBytes) + return false; + + pFirst += 11; + + char* pStream = strstr(pFirst, "stream\015\012"); + char* pMeta = strstr(pFirst, g_format_oform_pdf_meta_tag); + if (!pStream || !pMeta || pStream < pMeta) + return false; + + pMeta += strlen(g_format_oform_pdf_meta_tag) + 3; + + char* pMetaLast = strstr(pMeta, " "); + if (!pMetaLast) + return false; + + pMeta = pMetaLast + 1; + pMetaLast = strstr(pMeta, " "); + if (!pMetaLast) + return false; + + return true; +} bool COfficeFileFormatChecker::isOleObjectFile(POLE::Storage *storage) { if (storage == NULL) @@ -715,6 +750,9 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring &_fileName) else if (isPdfFormatFile(bufferDetect, sizeRead, sDocumentID)) // min size - 5 { nFileType = AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF; + + if (isPdfOformFormatFile(bufferDetect, sizeRead)) + nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM_PDF; } else if (isDjvuFormatFile(bufferDetect, sizeRead)) // min size - 8 { @@ -756,7 +794,6 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring &_fileName) } //------------------------------------------------------------------------------------------------ file.CloseFile(); - } if (bufferDetect) delete[] bufferDetect; @@ -868,7 +905,7 @@ bool COfficeFileFormatChecker::isOOXFormatFile(const std::wstring &fileName, boo const char *vssmFormatLine = "application/vnd.ms-powerpoint.slideshow.macroEnabled.main+xml"; const char *vstmFormatLine = "application/vnd.ms-powerpoint.template.macroEnabled.main+xml"; - std::string strContentTypes((char*)pBuffer, nBufferSize); + std::string strContentTypes((char*)pBuffer, nBufferSize); if (std::string::npos != strContentTypes.find(oformFormatLine)) { @@ -1337,6 +1374,7 @@ std::wstring COfficeFileFormatChecker::GetExtensionByType(int type) return L".ots"; case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM_PDF: return L".pdf"; case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF: return L".swf"; @@ -1383,23 +1421,33 @@ std::wstring COfficeFileFormatChecker::GetExtensionByType(int type) return L".ico"; case AVS_OFFICESTUDIO_FILE_CANVAS_WORD: - case AVS_OFFICESTUDIO_FILE_CANVAS_SPREADSHEET: - case AVS_OFFICESTUDIO_FILE_CANVAS_PRESENTATION: return L".bin"; - case AVS_OFFICESTUDIO_FILE_OTHER_OLD_DOCUMENT: - case AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY: return L".doct"; - case AVS_OFFICESTUDIO_FILE_TEAMLAB_XLSY: return L".xlst"; - case AVS_OFFICESTUDIO_FILE_OTHER_OLD_PRESENTATION: - case AVS_OFFICESTUDIO_FILE_OTHER_OLD_DRAWING: - case AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY: return L".pptt"; + case AVS_OFFICESTUDIO_FILE_CANVAS_SPREADSHEET: + case AVS_OFFICESTUDIO_FILE_CANVAS_PRESENTATION: + return L".bin"; + case AVS_OFFICESTUDIO_FILE_OTHER_OLD_DOCUMENT: + case AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY: + return L".doct"; + case AVS_OFFICESTUDIO_FILE_TEAMLAB_XLSY: + return L".xlst"; + case AVS_OFFICESTUDIO_FILE_OTHER_OLD_PRESENTATION: + case AVS_OFFICESTUDIO_FILE_OTHER_OLD_DRAWING: + case AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY: + return L".pptt"; - case AVS_OFFICESTUDIO_FILE_DRAW_VSDX: return L".vsdx"; - case AVS_OFFICESTUDIO_FILE_DRAW_VSSX: return L".vssx"; - case AVS_OFFICESTUDIO_FILE_DRAW_VSTX: return L".vstx"; - case AVS_OFFICESTUDIO_FILE_DRAW_VSDM: return L".vsdm"; - case AVS_OFFICESTUDIO_FILE_DRAW_VSSM: return L".vssm"; - case AVS_OFFICESTUDIO_FILE_DRAW_VSTM: return L".vstm"; - } - return L""; + case AVS_OFFICESTUDIO_FILE_DRAW_VSDX: + return L".vsdx"; + case AVS_OFFICESTUDIO_FILE_DRAW_VSSX: + return L".vssx"; + case AVS_OFFICESTUDIO_FILE_DRAW_VSTX: + return L".vstx"; + case AVS_OFFICESTUDIO_FILE_DRAW_VSDM: + return L".vsdm"; + case AVS_OFFICESTUDIO_FILE_DRAW_VSSM: + return L".vssm"; + case AVS_OFFICESTUDIO_FILE_DRAW_VSTM: + return L".vstm"; + } + return L""; } int COfficeFileFormatChecker::GetFormatByExtension(const std::wstring &sExt) @@ -1496,7 +1544,7 @@ int COfficeFileFormatChecker::GetFormatByExtension(const std::wstring &sExt) return AVS_OFFICESTUDIO_FILE_SPREADSHEET_OTS; if (L".ods" == ext) return AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS; - + if (L".ooxml" == ext) return AVS_OFFICESTUDIO_FILE_OTHER_OOXML; if (L".odf" == ext) diff --git a/Common/OfficeFileFormats.h b/Common/OfficeFileFormats.h index 425e4470c1..243abd1d89 100644 --- a/Common/OfficeFileFormats.h +++ b/Common/OfficeFileFormats.h @@ -55,6 +55,7 @@ #define AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_PACKAGE AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0014 #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_XML AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0030 diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index f3f46bcf25..cb38974ebf 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -80,36 +80,56 @@ namespace NExtractTools { - void initApplicationFonts(NSFonts::IApplicationFonts *pApplicationFonts, InputParams ¶ms) + // COMMON FUNCTIONS + NSFonts::IApplicationFonts* createApplicationFonts(InputParams& params) { + NSFonts::IApplicationFonts* pFonts = NSFonts::NSApplication::Create(); + std::wstring sFontPath = params.getFontPath(); if (sFontPath.empty()) - pApplicationFonts->Initialize(); + pFonts->Initialize(); else - pApplicationFonts->InitializeFromFolder(sFontPath); + pFonts->InitializeFromFolder(sFontPath); + + return pFonts; } + std::wstring getExtentionByRasterFormat(int format) { - std::wstring sExt; switch (format) { - case 1: - sExt = L".bmp"; - break; - case 2: - sExt = L".gif"; - break; - case 3: - sExt = L".jpg"; - break; - default: - sExt = L".png"; - break; + case 1: return L".bmp"; + case 2: return L".gif"; + case 3: return L".jpg"; + default: return L".png"; } - return sExt; + return L""; } - bool create_if_empty(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &signature) + + inline std::wstring combinePath(const std::wstring& sDir, const std::wstring& sName) + { + return sDir + FILE_SEPARATOR_STR + sName; + } + + _UINT32 processEncryptionError(_UINT32 hRes, const std::wstring& sFrom, InputParams& params) + { + if (AVS_ERROR_DRM == hRes) + { + if (!params.getDontSaveAdditional()) + { + copyOrigin(sFrom, *params.m_sFileTo); + } + return AVS_FILEUTILS_ERROR_CONVERT_DRM; + } + else if (AVS_ERROR_PASSWORD == hRes) + { + return AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; + } + return hRes; + } + + bool create_if_empty(const std::wstring& sFrom, const std::wstring& sTo, const std::wstring& signature) { bool res = false; NSFile::CFileBinary file; @@ -134,25 +154,10 @@ namespace NExtractTools return res; } - _UINT32 CopyOOXOrigin(const std::wstring &sToDir, const std::wstring &sOOXDir, const std::wstring &sToFile, const std::wstring &sOOXFile) + _UINT32 addContentType(const std::wstring& sDir, const std::wstring& sCT) { _UINT32 nRes = 0; - // save Editor.xlsx for pivot - std::wstring sEditorOOX = sToDir + FILE_SEPARATOR_STR + sToFile; - if (sOOXFile.empty()) - { - nRes = dir2zip(sOOXDir, sEditorOOX); - } - else - { - nRes = NSFile::CFileBinary::Copy(sOOXFile, sEditorOOX) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 addContentType(const std::wstring &sDir, const std::wstring &sCT) - { - _UINT32 nRes = 0; - std::wstring sContentTypesPath = sDir + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); + std::wstring sContentTypesPath = combinePath(sDir, L"[Content_Types].xml"); if (NSFile::CFileBinary::Exists(sContentTypesPath)) { std::wstring sData; @@ -165,10 +170,11 @@ namespace NExtractTools } return nRes; } - _UINT32 replaceContentType(const std::wstring &sDir, const std::wstring &sCTFrom, const std::wstring &sCTTo) + + _UINT32 replaceContentType(const std::wstring& sDir, const std::wstring& sCTFrom, const std::wstring& sCTTo) { _UINT32 nRes = 0; - std::wstring sContentTypesPath = sDir + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); + std::wstring sContentTypesPath = combinePath(sDir, L"[Content_Types].xml"); if (NSFile::CFileBinary::Exists(sContentTypesPath)) { std::wstring sData; @@ -181,129 +187,268 @@ namespace NExtractTools } return nRes; } - _UINT32 processEncryptionError(_UINT32 hRes, const std::wstring &sFrom, InputParams ¶ms) + + // Copy file sFromDir or sFromFile => sToDir/sToFile (compress directory, if sFromFile is empty) + _UINT32 CopyOOXOrigin(const std::wstring& sToDir, const std::wstring& sFromDir, const std::wstring& sToFile, const std::wstring& sFromFile) { - if (AVS_ERROR_DRM == hRes) - { - if (!params.getDontSaveAdditional()) - { - copyOrigin(sFrom, *params.m_sFileTo); - } - return AVS_FILEUTILS_ERROR_CONVERT_DRM; - } - else if (AVS_ERROR_PASSWORD == hRes) - { - return AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; - } - return hRes; + std::wstring sDstFile = combinePath(sToDir, sToFile); + if (sFromFile.empty()) + return dir2zip(sFromFile, sDstFile); + return NSFile::CFileBinary::Copy(sFromFile, sDstFile) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; } - _UINT32 package2ooxml(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + + // zip methods + _UINT32 dir2zip(const std::wstring& sFrom, const std::wstring& sTo, bool bSorted, int method, short level, bool bDateTime) { - std::wstring sResultOoxmlDir = sTemp + FILE_SEPARATOR_STR + _T("ooxml_unpacked"); - - NSDirectory::CreateDirectory(sResultOoxmlDir); - - _UINT32 nRes = package2ooxml_dir(sFrom, sResultOoxmlDir, sTemp, params); - - if (SUCCEEDED_X2T(nRes)) + COfficeUtils oCOfficeUtils(NULL); + return (S_OK == oCOfficeUtils.CompressFileOrDirectory(sFrom, sTo, bSorted, method, level, bDateTime)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 dir2zipMscrypt(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + _UINT32 nRes = S_OK; + if (params.hasSavePassword()) { - nRes = dir2zipMscrypt(sResultOoxmlDir, sTo, sTemp, params); + std::wstring sToMscrypt = combinePath(convertParams.m_sTempDir, L"tomscrypt.docx"); + nRes = dir2zip(sFrom, sToMscrypt); + if (SUCCEEDED_X2T(nRes)) + { + nRes = oox2mscrypt(sToMscrypt, sTo, params, convertParams); + } + } + else + { + nRes = dir2zip(sFrom, sTo, true); } - return nRes; } - _UINT32 package2bin_t(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 zip2dir(const std::wstring& sFrom, const std::wstring& sTo) { - std::wstring sResultBin_tDir = sTemp + FILE_SEPARATOR_STR + _T("bin_t_unpacked"); - std::wstring sResultBin_tFileEditor = sResultBin_tDir + FILE_SEPARATOR_STR + _T("Editor.bin"); + COfficeUtils oCOfficeUtils(NULL); + return (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } - NSDirectory::CreateDirectory(sResultBin_tDir); - - _UINT32 nRes = package2bin(sFrom, sResultBin_tFileEditor, sTemp, params); + // crypt + _UINT32 mscrypt2oot(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultOotDir = combinePath(convertParams.m_sTempDir, L"oot_unpacked"); + std::wstring sResultOotFileEditor = combinePath(sResultOotDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultOotDir); + _UINT32 nRes = mscrypt2oot_bin(sFrom, sResultOotFileEditor, params, convertParams); if (SUCCEEDED_X2T(nRes)) { COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultBin_tDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultOotDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; } return nRes; } - _UINT32 package2bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 mscrypt2oot_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultOoxmlDir = sTemp + FILE_SEPARATOR_STR + _T("ooxml_unpacked"); + //decrypt to temp file + std::wstring password = params.getPassword(); + std::wstring sResultDecryptFile = combinePath(convertParams.m_sTempDir, L"uncrypt_file.oox"); - NSDirectory::CreateDirectory(sResultOoxmlDir); + ECMACryptFile cryptReader; + bool bDataIntegrity = false; - _UINT32 nRes = package2ooxml_dir(sFrom, sResultOoxmlDir, sTemp, params); + if (cryptReader.DecryptOfficeFile(sFrom, sResultDecryptFile, password, bDataIntegrity) == false) + { + if (password.empty()) + return AVS_FILEUTILS_ERROR_CONVERT_DRM; + else + return AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; + } + if (bDataIntegrity == false) + { + // было несанкционированое вешательство в файл + } + + COfficeFileFormatChecker OfficeFileFormatChecker; + + if (OfficeFileFormatChecker.isOfficeFile(sResultDecryptFile)) + { + switch (OfficeFileFormatChecker.nFileType) + { + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF: + { + return docx2doct_bin(sResultDecryptFile, sTo, params, convertParams); + } + break; + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX: + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM: + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX: + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM: + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB: + { + const std::wstring &sXmlOptions = params.getXmlOptions(); + return xlsx2xlst_bin(sResultDecryptFile, sTo, params, convertParams); + } + break; + case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX: + case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM: + case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX: + case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX: + case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM: + case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM: + { + return pptx2pptt_bin(sResultDecryptFile, sTo, params, convertParams); + } + break; + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_FLAT: + { + return docxflat2doct_bin(sResultDecryptFile, sTo, params, convertParams); + } + break; + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_FLAT: + { + const std::wstring &sXmlOptions = params.getXmlOptions(); + return xlsxflat2xlst_bin(sResultDecryptFile, sTo, params, convertParams); + } + break; + 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, params, convertParams); + } + break; + } + } + return AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 mitcrypt2oox(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + // todo + return AVS_FILEUTILS_ERROR_CONVERT_DRM_UNSUPPORTED; + } + _UINT32 mitcrypt2oot_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + // todo + return AVS_FILEUTILS_ERROR_CONVERT_DRM_UNSUPPORTED; + } + _UINT32 mscrypt2oox(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring password = params.getPassword(); + + ECMACryptFile cryptReader; + bool bDataIntegrity = false; + + if (cryptReader.DecryptOfficeFile(sFrom, sTo, password, bDataIntegrity) == false) + { + if (password.empty()) + return AVS_FILEUTILS_ERROR_CONVERT_DRM; + else + return AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; + } + + if (bDataIntegrity == false) + { + // было несанкционированое вешательство в файл + } + + return 0; + } + _UINT32 oox2mscrypt(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring password = params.getSavePassword(); + std::wstring documentID = params.getDocumentID(); + + ECMACryptFile cryptReader; + + if (cryptReader.EncryptOfficeFile(sFrom, sTo, password, documentID) == false) + { + return AVS_FILEUTILS_ERROR_CONVERT; + } + + return 0; + } + _UINT32 fromMscrypt(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring password = params.getPassword(); + std::wstring sResultDecryptFile = combinePath(convertParams.m_sTempDir, L"uncrypt_file.oox"); + + _UINT32 nRes = mscrypt2oox(sFrom, sResultDecryptFile, params, convertParams); + + if (!SUCCEEDED_X2T(nRes) && password.empty()) // qiaoshemei1 (1).xlsx - запрокченный xlsx + { + if (!params.getDontSaveAdditional()) + { + copyOrigin(sFrom, sTo); + } + return AVS_FILEUTILS_ERROR_CONVERT_DRM; + } + nRes = processEncryptionError(nRes, sFrom, params); if (SUCCEEDED_X2T(nRes)) { - nRes = AVS_FILEUTILS_ERROR_CONVERT; - COfficeFileFormatChecker OfficeFileFormatChecker; - if (OfficeFileFormatChecker.isOOXFormatFile(sResultOoxmlDir, true)) + if (OfficeFileFormatChecker.isOfficeFile(sResultDecryptFile)) { + params.changeFormatFrom(OfficeFileFormatChecker.nFileType, OfficeFileFormatChecker.bMacroEnabled); switch (OfficeFileFormatChecker.nFileType) { case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX: case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM: case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX: case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM: - nRes = docx_dir2doct_bin(sResultOoxmlDir, sTo, sTemp, params, L""); - break; + case AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF: + { + return fromDocument(sResultDecryptFile, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, params, convertParams); + } + break; case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX: case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM: case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX: case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM: - case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB: - nRes = xlsx_dir2xlst_bin(sResultOoxmlDir, sTo, params, true, L""); - break; + { + return fromSpreadsheet(sResultDecryptFile, AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX, params, convertParams); + } + break; case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX: case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM: case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX: case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX: case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM: case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM: - nRes = pptx_dir2pptt_bin(sResultOoxmlDir, sTo, sTemp, params, L""); - break; - default: - break; + { + return fromPresentation(sResultDecryptFile, AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX, params, convertParams); + } + break; } } } - return nRes; } - _UINT32 package2ooxml_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 fromMitcrypt(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - BinDocxRW::CDocxSerializer m_oCDocxSerializer; - - _UINT32 nRes = m_oCDocxSerializer.unpackageFile(sFrom, sTo) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - - return nRes; + // todo + return AVS_FILEUTILS_ERROR_CONVERT_DRM_UNSUPPORTED; } - // docxflat -> bin - _UINT32 docxflat2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + + // vba + _UINT32 msVbaProject2Xml(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms, ConvertParams& convertParams) { - // Save to file (from temp dir) - BinDocxRW::CDocxSerializer m_oCDocxSerializer; + CVbaReader vbaReader(sFrom, sTo); - m_oCDocxSerializer.setIsNoBase64(params.getIsNoBase64()); - m_oCDocxSerializer.setFontDir(params.getFontPath()); + if (false == vbaReader.write()) + return AVS_FILEUTILS_ERROR_CONVERT; - // bool bRes = m_oCDocxSerializer.saveToFile (sResDoct, sSrcDocx, sTemp); - _UINT32 nRes = m_oCDocxSerializer.saveToFile(sTo, sFrom, params.getXmlOptions(), sTemp) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - - return nRes; + return 0; } - // docx -> bin - _UINT32 docx2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedDOCX = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); + // docx <=> doct + _UINT32 docx2doct_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedDOCX = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedDOCX); COfficeUtils oCOfficeUtils(NULL); @@ -314,9 +459,9 @@ namespace NExtractTools if (OfficeFileFormatChecker.isOfficeFile(sFrom)) { if (OfficeFileFormatChecker.nFileType == AVS_OFFICESTUDIO_FILE_OTHER_MS_OFFCRYPTO) - return mscrypt2oot_bin(sFrom, sTo, sTemp, params); + return mscrypt2oot_bin(sFrom, sTo, params, convertParams); else if (OfficeFileFormatChecker.nFileType == AVS_OFFICESTUDIO_FILE_OTHER_MS_MITCRYPTO) - return mitcrypt2oot_bin(sFrom, sTo, sTemp, params); + return mitcrypt2oot_bin(sFrom, sTo, params, convertParams); else { if (create_if_empty(sFrom, sTo, L"DOCY;v10;0;")) @@ -327,15 +472,51 @@ namespace NExtractTools else return AVS_FILEUTILS_ERROR_CONVERT; } - return docx_dir2doct_bin(sTempUnpackedDOCX, sTo, sTemp, params, sFrom); + + convertParams.m_sTempParamOOXMLFile = sFrom; + return docx_dir2doct_bin(sTempUnpackedDOCX, sTo, params, convertParams); } - _UINT32 docx_dir2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, const std::wstring &sDocxFile) + _UINT32 docx2doct(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + // Extract docx to temp directory + std::wstring sResultDoctDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + std::wstring sResultDoctFileEditor = combinePath(sResultDoctDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultDoctDir); + + _UINT32 nRes = docx2doct_bin(sFrom, sResultDoctFileEditor, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + + return nRes; + } + _UINT32 docx_dir2doct(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + // Extract docx to temp directory + std::wstring sResultDoctDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + std::wstring sResultDoctFileEditor = combinePath(sResultDoctDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultDoctDir); + + _UINT32 nRes = docx_dir2doct_bin(sFrom, sResultDoctFileEditor, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + + return nRes; + } + _UINT32 docx_dir2doct_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { _UINT32 nRes = S_OK; - std::wstring sToDir = NSDirectory::GetFolderPath(sTo); - if (params.needConvertToOrigin(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX) && !sDocxFile.empty()) + if (params.needConvertToOrigin(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX) && !convertParams.m_sTempParamOOXMLFile.empty()) { - nRes = CopyOOXOrigin(sToDir, sFrom, L"origin.docx", sDocxFile); + std::wstring sToDir = NSDirectory::GetFolderPath(sTo); + nRes = CopyOOXOrigin(sToDir, sFrom, L"origin.docx", convertParams.m_sTempParamOOXMLFile); } else { @@ -345,78 +526,26 @@ namespace NExtractTools m_oCDocxSerializer.setIsNoBase64(params.getIsNoBase64()); m_oCDocxSerializer.setFontDir(params.getFontPath()); - // bool bRes = m_oCDocxSerializer.saveToFile (sResDoct, sSrcDocx, sTemp); - nRes = m_oCDocxSerializer.saveToFile(sTo, sFrom, params.getXmlOptions(), sTemp) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + // bool bRes = m_oCDocxSerializer.saveToFile (sResDoct, sSrcDocx, sTemp); + nRes = m_oCDocxSerializer.saveToFile(sTo, sFrom, params.getXmlOptions(), convertParams.m_sTempDir) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; } + // clear tmp param for this method + convertParams.m_sTempParamOOXMLFile = L""; return nRes; } - // docxflat -> doct - _UINT32 docxflat2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 doct_bin2docx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultDoctDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - std::wstring sResultDoctFileEditor = sResultDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultDoctDir); - - _UINT32 nRes = docxflat2doct_bin(sFrom, sResultDoctFileEditor, sTemp, params); - - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - - return nRes; - } - // docx -> doct - _UINT32 docx2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - // Extract docx to temp directory - std::wstring sResultDoctDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - std::wstring sResultDoctFileEditor = sResultDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultDoctDir); - - _UINT32 nRes = docx2doct_bin(sFrom, sResultDoctFileEditor, sTemp, params); - - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - - return nRes; - } - // docx_dir -> doct - _UINT32 docx_dir2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, const std::wstring &sDocxFile) - { - // Extract docx to temp directory - std::wstring sResultDoctDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - std::wstring sResultDoctFileEditor = sResultDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultDoctDir); - - _UINT32 nRes = docx_dir2doct_bin(sFrom, sResultDoctFileEditor, sTemp, params, sDocxFile); - - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - - return nRes; - } - // bin -> docx - _UINT32 doct_bin2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms) - { - std::wstring sResultDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); + std::wstring sResultDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sResultDocxDir); - _UINT32 nRes = doct_bin2docx_dir(sFrom, sTo, sResultDocxDir, sThemeDir, params); + convertParams.m_sTempResultOOXMLDirectory = sResultDocxDir; + _UINT32 nRes = doct_bin2docx_dir(sFrom, sTo, params, convertParams); if (SUCCEEDED_X2T(nRes) && params.m_nFormatTo) { - if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == *params.m_nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX == *params.m_nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM == *params.m_nFormatTo) + if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == *params.m_nFormatTo || + AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX == *params.m_nFormatTo || + AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM == *params.m_nFormatTo) { std::wstring sCTFrom = _T("application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"); std::wstring sCTTo; @@ -436,31 +565,30 @@ namespace NExtractTools } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM == *params.m_nFormatTo) { - // std::wstring sCT = L""; - // nRes = addContentType(sResultDocxDir, sCT); + // std::wstring sCT = L""; + // nRes = addContentType(sResultDocxDir, sCT); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF == *params.m_nFormatTo) { - // std::wstring sCT = L""; - // nRes = addContentType(sResultDocxDir, sCT); + // std::wstring sCT = L""; + // nRes = addContentType(sResultDocxDir, sCT); } } if (SUCCEEDED_X2T(nRes)) { - nRes = dir2zipMscrypt(sResultDocxDir, sTo, sTemp, params); + nRes = dir2zipMscrypt(sResultDocxDir, sTo, params, convertParams); } return nRes; } - // bin -> docx dir - _UINT32 doct_bin2docx_dir(const std::wstring &sFrom, const std::wstring &sToResult, const std::wstring &sTo, const std::wstring &sThemeDir, InputParams ¶ms) + _UINT32 doct_bin2docx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { _UINT32 nRes = 0; std::wstring sTargetBin; if (params.getFromChanges()) { params.setFromChanges(false); - nRes = apply_changes(sFrom, sToResult, NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, sThemeDir, sTargetBin, params); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, sTargetBin, params, convertParams); } else sTargetBin = sFrom; @@ -477,25 +605,24 @@ namespace NExtractTools std::wstring sMediaPath; // will be filled by 'CreateDocxFolders' method std::wstring sEmbedPath; // will be filled by 'CreateDocxFolders' method - m_oCDocxSerializer.CreateDocxFolders(sTo, sThemePath, sMediaPath, sEmbedPath); + m_oCDocxSerializer.CreateDocxFolders(convertParams.m_sTempResultOOXMLDirectory, sThemePath, sMediaPath, sEmbedPath); if (SUCCEEDED_X2T(nRes)) { - nRes = m_oCDocxSerializer.loadFromFile(sTargetBin, sTo, sXmlOptions, sThemePath, sMediaPath, sEmbedPath) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + nRes = m_oCDocxSerializer.loadFromFile(sTargetBin, convertParams.m_sTempResultOOXMLDirectory, sXmlOptions, sThemePath, sMediaPath, sEmbedPath) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; } // удаляем EditorWithChanges, потому что он не в Temp if (sFrom != sTargetBin) NSFile::CFileBinary::Remove(sTargetBin); + + convertParams.m_sTempResultOOXMLDirectory = L""; return nRes; } - - // doct -> docx - _UINT32 doct2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms) + _UINT32 doct2docx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { // Extract docx to temp directory - std::wstring sTempUnpackedDOCT = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - std::wstring sTempDoctFileEditor = sTempUnpackedDOCT + FILE_SEPARATOR_STR + _T("Editor.bin"); - + std::wstring sTempUnpackedDOCT = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + std::wstring sTempDoctFileEditor = combinePath(sTempUnpackedDOCT, L"Editor.bin"); NSDirectory::CreateDirectory(sTempUnpackedDOCT); // unzip doct to folder @@ -503,15 +630,216 @@ namespace NExtractTools if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedDOCT, NULL, 0)) return AVS_FILEUTILS_ERROR_CONVERT; - return doct_bin2docx(sTempDoctFileEditor, sTo, sTemp, sThemeDir, params); + return doct_bin2docx(sTempDoctFileEditor, sTo, params, convertParams); } - // dotx -> docx - _UINT32 dotx2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + + // docx flat + _UINT32 docxflat2doct(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedDOCX = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); + std::wstring sResultDoctDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + std::wstring sResultDoctFileEditor = combinePath(sResultDoctDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultDoctDir); + + _UINT32 nRes = docxflat2doct_bin(sFrom, sResultDoctFileEditor, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + + return nRes; + } + _UINT32 docxflat2doct_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + // Save to file (from temp dir) + BinDocxRW::CDocxSerializer m_oCDocxSerializer; + + m_oCDocxSerializer.setIsNoBase64(params.getIsNoBase64()); + m_oCDocxSerializer.setFontDir(params.getFontPath()); + + // bool bRes = m_oCDocxSerializer.saveToFile (sResDoct, sSrcDocx, sTemp); + _UINT32 nRes = m_oCDocxSerializer.saveToFile(sTo, sFrom, params.getXmlOptions(), convertParams.m_sTempDir) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + + return nRes; + } + _UINT32 docxflat2odt(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedODT = combinePath(convertParams.m_sTempDir, L"odt_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedODT); + + Oox2Odf::Converter converter(sFrom, L"text", params.getFontPath(), false, convertParams.m_sTempDir); + + _UINT32 nRes = 0; + try + { + std::wstring password = params.getSavePassword(); + std::wstring documentID = params.getDocumentID(); + + converter.convert(); + converter.write(sTempUnpackedODT, convertParams.m_sTempDir, password, documentID); + + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedODT, sTo, false, password.empty() ? Z_DEFLATED : 0)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + catch (...) + { + nRes = AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 docxflat2docx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedDOCX = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedDOCX); - _UINT32 nRes = dotx2docx_dir(sFrom, sTempUnpackedDOCX, params); + BinDocxRW::CDocxSerializer m_oCDocxSerializer; + + _UINT32 nRes = 0; + if (m_oCDocxSerializer.convertFlat(sFrom, sTempUnpackedDOCX)) + { + nRes = dir2zipMscrypt(sTempUnpackedDOCX, sTo, params, convertParams); + } + else + { + nRes = AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + + // packageooxml + _UINT32 package2ooxml(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultOoxmlDir = combinePath(convertParams.m_sTempDir, L"ooxml_unpacked"); + NSDirectory::CreateDirectory(sResultOoxmlDir); + + _UINT32 nRes = package2ooxml_dir(sFrom, sResultOoxmlDir, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + nRes = dir2zipMscrypt(sResultOoxmlDir, sTo, params, convertParams); + } + + return nRes; + } + _UINT32 package2bin_t(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms, ConvertParams& convertParams) + { + std::wstring sResultBin_tDir = combinePath(convertParams.m_sTempDir, L"bin_t_unpacked"); + std::wstring sResultBin_tFileEditor = combinePath(sResultBin_tDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultBin_tDir); + + _UINT32 nRes = package2bin(sFrom, sResultBin_tFileEditor, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultBin_tDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + + return nRes; + } + _UINT32 package2bin(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms, ConvertParams& convertParams) + { + std::wstring sResultOoxmlDir = combinePath(convertParams.m_sTempDir, L"ooxml_unpacked"); + NSDirectory::CreateDirectory(sResultOoxmlDir); + + _UINT32 nRes = package2ooxml_dir(sFrom, sResultOoxmlDir, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + nRes = AVS_FILEUTILS_ERROR_CONVERT; + + COfficeFileFormatChecker OfficeFileFormatChecker; + + if (OfficeFileFormatChecker.isOOXFormatFile(sResultOoxmlDir, true)) + { + switch (OfficeFileFormatChecker.nFileType) + { + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM: + nRes = docx_dir2doct_bin(sResultOoxmlDir, sTo, params, convertParams); + break; + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX: + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM: + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX: + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM: + + case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB: + convertParams.m_bTempIsXmlOptions = true; + nRes = xlsx_dir2xlst_bin(sResultOoxmlDir, sTo, params, convertParams); + break; + case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX: + case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM: + case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX: + case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX: + case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM: + case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM: + nRes = pptx_dir2pptt_bin(sResultOoxmlDir, sTo, params, convertParams); + break; + default: + break; + } + } + } + + return nRes; + } + _UINT32 package2ooxml_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms, ConvertParams& convertParams) + { + BinDocxRW::CDocxSerializer m_oCDocxSerializer; + + _UINT32 nRes = m_oCDocxSerializer.unpackageFile(sFrom, sTo) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + + return nRes; + } + + // docm/dotx + _UINT32 dotm2docm(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedDOCM = combinePath(convertParams.m_sTempDir, L"docm_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedDOCM); + + _UINT32 nRes = dotm2docm_dir(sFrom, sTempUnpackedDOCM, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedDOCM, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 dotm2docm_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) + { + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); + if (NSFile::CFileBinary::Exists(sContentTypesPath)) + { + std::wstring sData; + if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) + { + std::wstring sCTFrom = _T("application/vnd.ms-word.template.macroEnabledTemplate.main+xml"); + std::wstring sCTTo = _T("application/vnd.ms-word.document.macroEnabled.main+xml"); + + sData = string_replaceAll(sData, sCTFrom, sCTTo); + + if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true)) + { + return 0; + } + } + } + } + return AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 dotx2docx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedDOCX = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedDOCX); + + _UINT32 nRes = dotx2docx_dir(sFrom, sTempUnpackedDOCX, params, convertParams); if (SUCCEEDED_X2T(nRes)) { COfficeUtils oCOfficeUtils(NULL); @@ -520,12 +848,12 @@ namespace NExtractTools } return AVS_FILEUTILS_ERROR_CONVERT; } - _UINT32 dotx2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms) + _UINT32 dotx2docx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { COfficeUtils oCOfficeUtils(NULL); if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); if (NSFile::CFileBinary::Exists(sContentTypesPath)) { std::wstring sData; @@ -545,25 +873,24 @@ namespace NExtractTools } return AVS_FILEUTILS_ERROR_CONVERT; } - // docm -> docx - _UINT32 docm2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 docm2docx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedDOCX = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); + std::wstring sTempUnpackedDOCX = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedDOCX); - _UINT32 nRes = docm2docx_dir(sFrom, sTempUnpackedDOCX, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedDOCX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; + _UINT32 nRes = docm2docx_dir(sFrom, sTempUnpackedDOCX, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedDOCX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; } - _UINT32 docm2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms) + _UINT32 docm2docx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { COfficeUtils oCOfficeUtils(NULL); if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); if (NSFile::CFileBinary::Exists(sContentTypesPath)) { std::wstring sData; @@ -622,26 +949,25 @@ namespace NExtractTools } return 0; } - // dotm -> docx - _UINT32 dotm2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 dotm2docx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedDOCX = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); + std::wstring sTempUnpackedDOCX = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedDOCX); - _UINT32 nRes = dotm2docx_dir(sFrom, sTempUnpackedDOCX, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedDOCX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; + _UINT32 nRes = dotm2docx_dir(sFrom, sTempUnpackedDOCX, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedDOCX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; } - _UINT32 dotm2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms) + _UINT32 dotm2docx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { COfficeUtils oCOfficeUtils(NULL); if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); if (NSFile::CFileBinary::Exists(sContentTypesPath)) { std::wstring sData; @@ -700,55 +1026,32 @@ namespace NExtractTools } return 0; } - // dotm -> docm - _UINT32 dotm2docm (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) + + // xlsx <=> xlst + _UINT32 xlsx2xlst(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedDOCM = sTemp + FILE_SEPARATOR_STR + _T("docm_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedDOCM); + // Extract xlsx to temp directory + std::wstring sResultXlstDir = combinePath(convertParams.m_sTempDir, L"xlst_unpacked"); + std::wstring sResultXlstFileEditor = combinePath(sResultXlstDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultXlstDir); - _UINT32 nRes = dotm2docm_dir(sFrom, sTempUnpackedDOCM, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedDOCM, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; + _UINT32 nRes = xlsx2xlst_bin(sFrom, sResultXlstFileEditor, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultXlstDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + + return nRes; } - _UINT32 dotm2docm_dir (const std::wstring &sFrom, const std::wstring &sTo, InputParams& params) + _UINT32 xlsx2xlst_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) - { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); - if (NSFile::CFileBinary::Exists(sContentTypesPath)) - { - std::wstring sData; - if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) - { - std::wstring sCTFrom = _T("application/vnd.ms-word.template.macroEnabledTemplate.main+xml"); - std::wstring sCTTo = _T("application/vnd.ms-word.document.macroEnabled.main+xml"); + // Extract xlsx to temp directory + std::wstring sTempUnpackedXLSX = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedXLSX); - sData = string_replaceAll(sData, sCTFrom, sCTTo); - - if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true)) - { - return 0; - } - } - } - } - return AVS_FILEUTILS_ERROR_CONVERT; - } - // xslx -> bin - _UINT32 xlsx2xlst_bin (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) - { - // Extract xlsx to temp directory - std::wstring sTempUnpackedXLSX = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); - - NSDirectory::CreateDirectory(sTempUnpackedXLSX); - - COfficeUtils oCOfficeUtils(NULL); - if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLSX, NULL, 0)) + COfficeUtils oCOfficeUtils(NULL); + if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLSX, NULL, 0)) { //check crypt COfficeFileFormatChecker OfficeFileFormatChecker; @@ -764,7 +1067,7 @@ namespace NExtractTools delete params.m_sPassword; params.m_sPassword = new std::wstring(L"VelvetSweatshop"); - _UINT32 nRes = mscrypt2oot_bin(sFrom, sTo, sTemp, params); + _UINT32 nRes = mscrypt2oot_bin(sFrom, sTo, params, convertParams); if (SUCCEEDED_X2T(nRes)) { return nRes; @@ -774,11 +1077,11 @@ namespace NExtractTools delete params.m_sPassword; if (isOldPassword) params.m_sPassword = new std::wstring(sOldPassword); - return mscrypt2oot_bin(sFrom, sTo, sTemp, params); + return mscrypt2oot_bin(sFrom, sTo, params, convertParams); } } else if (OfficeFileFormatChecker.nFileType == AVS_OFFICESTUDIO_FILE_OTHER_MS_MITCRYPTO) - return mitcrypt2oot_bin(sFrom, sTo, sTemp, params); + return mitcrypt2oot_bin(sFrom, sTo, params, convertParams); else { if (create_if_empty(sFrom, sTo, L"XLSY;v10;0;")) @@ -790,13 +1093,28 @@ namespace NExtractTools return AVS_FILEUTILS_ERROR_CONVERT; } - return xlsx_dir2xlst_bin(sTempUnpackedXLSX, sTo, params, true, sFrom); + convertParams.m_bTempIsXmlOptions = true; + convertParams.m_sTempParamOOXMLFile = sFrom; + return xlsx_dir2xlst_bin(sTempUnpackedXLSX, sTo, params, convertParams); } - // xlsxflat -> bin - _UINT32 xlsxflat2xlst_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 xlsxflat2xlst(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sToDir = NSDirectory::GetFolderPath(sTo); + std::wstring sResultXlstDir = combinePath(convertParams.m_sTempDir, L"xlst_unpacked"); + std::wstring sResultXlstFileEditor = combinePath(sResultXlstDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultXlstDir); + _UINT32 nRes = xlsxflat2xlst_bin(sFrom, sResultXlstFileEditor, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultXlstDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + + return nRes; + } + _UINT32 xlsxflat2xlst_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { BinXlsxRW::CXlsxSerializer oCXlsxSerializer; oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); @@ -804,75 +1122,12 @@ namespace NExtractTools return oCXlsxSerializer.saveToFile(sTo, sFrom, params.getXmlOptions()); } - - _UINT32 xlsx_dir2xlst_bin(const std::wstring &sXlsxDir, const std::wstring &sTo, InputParams ¶ms, bool bXmlOptions, const std::wstring &sXlsxFile) + _UINT32 xlsxflat2xlsx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - _UINT32 nRes = S_OK; - std::wstring sToDir = NSDirectory::GetFolderPath(sTo); - if (params.needConvertToOrigin(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX) && !sXlsxFile.empty()) - { - nRes = CopyOOXOrigin(sToDir, sXlsxDir, L"origin.xlsx", sXlsxFile); - } - else - { - BinXlsxRW::CXlsxSerializer oCXlsxSerializer; - if (oCXlsxSerializer.hasPivot(sXlsxDir)) - { - // save Editor.xlsx for pivot - nRes = CopyOOXOrigin(sToDir, sXlsxDir, L"Editor.xlsx", sXlsxFile); - } - - // Save to file (from temp dir) - oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); - oCXlsxSerializer.setFontDir(params.getFontPath()); - - nRes = oCXlsxSerializer.saveToFile(sTo, sXlsxDir, bXmlOptions ? params.getXmlOptions() : L""); - } - return nRes; - } - // xslx_dir -> xslt - _UINT32 xlsx_dir2xlst(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, bool bXmlOptions, const std::wstring &sXlsxFile) - { - // Extract xlsx to temp directory - std::wstring sResultXlstDir = sTemp + FILE_SEPARATOR_STR + _T("xlst_unpacked"); - std::wstring sResultXlstFileEditor = sResultXlstDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultXlstDir); - - _UINT32 nRes = xlsx_dir2xlst_bin(sFrom, sResultXlstFileEditor, params, bXmlOptions, sXlsxFile); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultXlstDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - // xslx -> xslt - _UINT32 xlsx2xlst(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - // Extract xlsx to temp directory - std::wstring sResultXlstDir = sTemp + FILE_SEPARATOR_STR + _T("xlst_unpacked"); - std::wstring sResultXlstFileEditor = sResultXlstDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultXlstDir); - - _UINT32 nRes = xlsx2xlst_bin(sFrom, sResultXlstFileEditor, sTemp, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultXlstDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - - return nRes; - } - // xlsxflat -> xlsx - _UINT32 xlsxflat2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultDocxDir = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); - + std::wstring sResultDocxDir = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); NSDirectory::CreateDirectory(sResultDocxDir); - _UINT32 nRes = xlsxflat2xlsx_dir(sFrom, sResultDocxDir, sTemp, params); + _UINT32 nRes = xlsxflat2xlsx_dir(sFrom, sResultDocxDir, params, convertParams); if (SUCCEEDED_X2T(nRes)) { COfficeUtils oCOfficeUtils(NULL); @@ -880,8 +1135,7 @@ namespace NExtractTools } return nRes; } - // xlsxflat -> xlsx dir - _UINT32 xlsxflat2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 xlsxflat2xlsx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { BinXlsxRW::CXlsxSerializer oCXlsxSerializer; @@ -892,36 +1146,63 @@ namespace NExtractTools return nRes; } - // xlsxflat -> xlst - _UINT32 xlsxflat2xlst(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 xlsx_dir2xlst(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultXlstDir = sTemp + FILE_SEPARATOR_STR + _T("xlst_unpacked"); - std::wstring sResultXlstFileEditor = sResultXlstDir + FILE_SEPARATOR_STR + _T("Editor.bin"); + // Extract xlsx to temp directory + std::wstring sResultXlstDir = combinePath(convertParams.m_sTempDir, L"xlst_unpacked"); + std::wstring sResultXlstFileEditor = combinePath(sResultXlstDir, L"Editor.bin"); NSDirectory::CreateDirectory(sResultXlstDir); - _UINT32 nRes = xlsxflat2xlst_bin(sFrom, sResultXlstFileEditor, sTemp, params); - + _UINT32 nRes = xlsx_dir2xlst_bin(sFrom, sResultXlstFileEditor, params, convertParams); if (SUCCEEDED_X2T(nRes)) { COfficeUtils oCOfficeUtils(NULL); nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultXlstDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; } - return nRes; } - // bin -> xslx - _UINT32 xlst_bin2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms) + _UINT32 xlsx_dir2xlst_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + _UINT32 nRes = S_OK; + std::wstring sToDir = NSDirectory::GetFolderPath(sTo); + if (params.needConvertToOrigin(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX) && !convertParams.m_sTempParamOOXMLFile.empty()) + { + nRes = CopyOOXOrigin(sToDir, sFrom, L"origin.xlsx", convertParams.m_sTempParamOOXMLFile); + } + else + { + BinXlsxRW::CXlsxSerializer oCXlsxSerializer; + if (oCXlsxSerializer.hasPivot(sFrom)) + { + // save Editor.xlsx for pivot + nRes = CopyOOXOrigin(sToDir, sFrom, L"Editor.xlsx", convertParams.m_sTempParamOOXMLFile); + } + + // Save to file (from temp dir) + oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); + oCXlsxSerializer.setFontDir(params.getFontPath()); + + nRes = oCXlsxSerializer.saveToFile(sTo, sFrom, convertParams.m_bTempIsXmlOptions ? params.getXmlOptions() : L""); + } + + convertParams.m_sTempParamOOXMLFile = L""; + convertParams.m_bTempIsXmlOptions = false; + return nRes; + } + _UINT32 xlst_bin2xlsx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { // Extract xlsx to temp directory - std::wstring sResultXlsxDir = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); + std::wstring sResultXlsxDir = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); NSDirectory::CreateDirectory(sResultXlsxDir); - _UINT32 nRes = xlst_bin2xlsx_dir(sFrom, sTo, sResultXlsxDir, sThemeDir, params); + convertParams.m_sTempResultOOXMLDirectory = sResultXlsxDir; + _UINT32 nRes = xlst_bin2xlsx_dir(sFrom, sTo, params, convertParams); if (SUCCEEDED_X2T(nRes) && params.m_nFormatTo) { - if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM == *params.m_nFormatTo || AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX == *params.m_nFormatTo || + if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM == *params.m_nFormatTo || + AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX == *params.m_nFormatTo || AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM == *params.m_nFormatTo) { std::wstring sCTFrom = _T("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"); @@ -943,11 +1224,11 @@ namespace NExtractTools } if (SUCCEEDED_X2T(nRes)) { - nRes = dir2zipMscrypt(sResultXlsxDir, sTo, sTemp, params); + nRes = dir2zipMscrypt(sResultXlsxDir, sTo, params, convertParams); } return nRes; } - _UINT32 xlst_bin2xlsx_dir(const std::wstring &sFrom, const std::wstring &sToResult, const std::wstring &sTo, const std::wstring &sThemeDir, InputParams ¶ms) + _UINT32 xlst_bin2xlsx_dir(const std::wstring& sFrom, const std::wstring &sTo, InputParams& params, ConvertParams& convertParams) { _UINT32 nRes = 0; @@ -955,7 +1236,7 @@ namespace NExtractTools if (params.getFromChanges()) { params.setFromChanges(false); - nRes = apply_changes(sFrom, sToResult, NSDoctRenderer::DoctRendererFormat::FormatFile::XLST, sThemeDir, sTargetBin, params); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::XLST, sTargetBin, params, convertParams); } else sTargetBin = sFrom; @@ -970,101 +1251,137 @@ namespace NExtractTools std::wstring sMediaPath; // will be filled by 'CreateXlsxFolders' method std::wstring sEmbedPath; // will be filled by 'CreateXlsxFolders' method - oCXlsxSerializer.CreateXlsxFolders(sXmlOptions, sTo, sMediaPath, sEmbedPath); + oCXlsxSerializer.CreateXlsxFolders(sXmlOptions, convertParams.m_sTempResultOOXMLDirectory, sMediaPath, sEmbedPath); if (SUCCEEDED_X2T(nRes)) { - nRes = oCXlsxSerializer.loadFromFile(sTargetBin, sTo, sXmlOptions, sMediaPath, sEmbedPath); + nRes = oCXlsxSerializer.loadFromFile(sTargetBin, convertParams.m_sTempResultOOXMLDirectory, sXmlOptions, sMediaPath, sEmbedPath); } // удаляем EditorWithChanges, потому что он не в Temp if (sFrom != sTargetBin) NSFile::CFileBinary::Remove(sTargetBin); + + convertParams.m_sTempResultOOXMLDirectory = L""; return nRes; } - - // xslt -> xslx - _UINT32 xlst2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms) + _UINT32 xlst2xlsx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { // Extract xlsx to temp directory - std::wstring sTempUnpackedXLST = sTemp + FILE_SEPARATOR_STR + _T("xlst_unpacked"); - std::wstring sTempXlstFileEditor = sTempUnpackedXLST + FILE_SEPARATOR_STR + _T("Editor.bin"); - + std::wstring sTempUnpackedXLST = combinePath(convertParams.m_sTempDir, L"xlst_unpacked"); + std::wstring sTempXlstFileEditor = combinePath(sTempUnpackedXLST, L"Editor.bin"); NSDirectory::CreateDirectory(sTempUnpackedXLST); - // unzip xlst to folder + // unzip xlst to folder COfficeUtils oCOfficeUtils(NULL); if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLST, NULL, 0)) return AVS_FILEUTILS_ERROR_CONVERT; - return xlst_bin2xlsx(sTempXlstFileEditor, sTo, sTemp, sThemeDir, params); + return xlst_bin2xlsx(sTempXlstFileEditor, sTo, params, convertParams); } - // xltx -> xlsx - _UINT32 xltx2xlsx (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) - { - std::wstring sTempUnpackedXLSX = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedXLSX); - _UINT32 nRes = xltx2xlsx_dir(sFrom, sTempUnpackedXLSX, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedXLSX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; + _UINT32 xltx2xlsx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedXLSX = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedXLSX); + + _UINT32 nRes = xltx2xlsx_dir(sFrom, sTempUnpackedXLSX, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedXLSX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; } - _UINT32 xltx2xlsx_dir (const std::wstring &sFrom, const std::wstring &sTo, InputParams& params) + _UINT32 xltx2xlsx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) - { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); - if (NSFile::CFileBinary::Exists(sContentTypesPath)) - { - std::wstring sData; - if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) - { - std::wstring sCTFrom = _T("application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"); - std::wstring sCTTo = _T("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"); + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) + { + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); + if (NSFile::CFileBinary::Exists(sContentTypesPath)) + { + std::wstring sData; + if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) + { + std::wstring sCTFrom = _T("application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"); + std::wstring sCTTo = _T("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"); - sData = string_replaceAll(sData, sCTFrom, sCTTo); + sData = string_replaceAll(sData, sCTFrom, sCTTo); - if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true)) - { - return 0; - } - } - } - } - return AVS_FILEUTILS_ERROR_CONVERT; + if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true)) + { + return 0; + } + } + } + } + return AVS_FILEUTILS_ERROR_CONVERT; } - // xlsm -> xlsx - _UINT32 xlsm2xlsx (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) + _UINT32 xltm2xlsm(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedXLSX = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedXLSX); + std::wstring sTempUnpackedXLSM = combinePath(convertParams.m_sTempDir, L"xlsm_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedXLSM); - _UINT32 nRes = xlsm2xlsx_dir(sFrom, sTempUnpackedXLSX, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedXLSX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; + _UINT32 nRes = xltm2xlsm_dir(sFrom, sTempUnpackedXLSM, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedXLSM, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; } - _UINT32 xlsm2xlsx_dir (const std::wstring &sFrom, const std::wstring &sTo, InputParams& params) + _UINT32 xltm2xlsm_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) - { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); - if (NSFile::CFileBinary::Exists(sContentTypesPath)) - { - std::wstring sData; - if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) - { - std::wstring sCTFrom = L"application/vnd.ms-excel.sheet.macroEnabled.main+xml"; - std::wstring sCTTo = L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"; - sData = string_replaceAll(sData, sCTFrom, sCTTo); + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) + { + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); + if (NSFile::CFileBinary::Exists(sContentTypesPath)) + { + std::wstring sData; + if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) + { + std::wstring sCTFrom = _T("application/vnd.ms-excel.template.macroEnabled.main+xml"); + std::wstring sCTTo = _T("application/vnd.ms-excel.sheet.macroEnabled.main+xml"); + + sData = string_replaceAll(sData, sCTFrom, sCTTo); + + if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true)) + { + return 0; + } + } + } + } + return AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 xlsm2xlsx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedXLSX = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedXLSX); + + _UINT32 nRes = xlsm2xlsx_dir(sFrom, sTempUnpackedXLSX, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedXLSX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 xlsm2xlsx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) + { + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); + if (NSFile::CFileBinary::Exists(sContentTypesPath)) + { + std::wstring sData; + if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) + { + std::wstring sCTFrom = L"application/vnd.ms-excel.sheet.macroEnabled.main+xml"; + std::wstring sCTTo = L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"; + sData = string_replaceAll(sData, sCTFrom, sCTTo); sCTFrom = L""; sData = string_replaceAll(sData, sCTFrom, L""); @@ -1106,100 +1423,25 @@ namespace NExtractTools } return 0; } - // xltm -> xlsx - _UINT32 xltm2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 xltm2xlsx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedXLSX = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); + std::wstring sTempUnpackedXLSX = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedXLSX); - _UINT32 nRes = xltm2xlsx_dir(sFrom, sTempUnpackedXLSX, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedXLSX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 xlsb2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedXLSB = sTemp + FILE_SEPARATOR_STR + _T("xlsb_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedXLSB); - - COfficeUtils oCOfficeUtils(NULL); - _UINT32 nRes = oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLSB, NULL, 0); + _UINT32 nRes = xltm2xlsx_dir(sFrom, sTempUnpackedXLSX, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - OOX::Spreadsheet::CXlsb oXlsb; - oXlsb.ReadNative(OOX::CPath(sTempUnpackedXLSB)); - oXlsb.PrepareSi(); - oXlsb.PrepareTableFormula(); - - OOX::CContentTypes oContentTypes; - oXlsb.SetPropForWriteSheet(sTo, oContentTypes); - oXlsb.ReadSheetData(); - - nRes = oXlsb.WriteNative(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; - if(!params.m_bMacro) - { - ///removing scripts - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); - if (NSFile::CFileBinary::Exists(sContentTypesPath)) - { - std::wstring sData; - if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) - { - std::wstring sCTFrom = L"application/vnd.ms-excel.sheet.macroEnabled.main+xml"; - std::wstring sCTTo = L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"; - sData = string_replaceAll(sData, sCTFrom, sCTTo); - - sCTFrom = L""; - sData = string_replaceAll(sData, sCTFrom, L""); - - sCTFrom = L""; - sData = string_replaceAll(sData, sCTFrom, L""); - - if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true) == false) - { - return AVS_FILEUTILS_ERROR_CONVERT; - } - } - } - std::wstring sWorkbookRelsPath = sTo + FILE_SEPARATOR_STR + L"xl" + FILE_SEPARATOR_STR + L"_rels" + FILE_SEPARATOR_STR + L"workbook.xml.rels"; - if (NSFile::CFileBinary::Exists(sWorkbookRelsPath)) - { - std::wstring sData; - if (NSFile::CFileBinary::ReadAllTextUtf8(sWorkbookRelsPath, sData)) - { - size_t pos = sData.find(L"vbaProject.bin"); - if (pos != std::wstring::npos) - { - size_t pos1 = sData.rfind(L"<", pos); - size_t pos2 = sData.find(L">", pos); - - if (pos1 != std::wstring::npos && pos2 != std::wstring::npos) - { - sData.erase(sData.begin() + pos1, sData.begin() + pos2 + 1); - } - } - if (NSFile::CFileBinary::SaveToFile(sWorkbookRelsPath, sData, true) == false) - { - return AVS_FILEUTILS_ERROR_CONVERT; - } - } - } - std::wstring sVbaProjectPath = sTo + FILE_SEPARATOR_STR + L"xl" + FILE_SEPARATOR_STR + L"vbaProject.bin"; - NSFile::CFileBinary::Remove(sVbaProjectPath); - } - + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedXLSX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; } return nRes; } - _UINT32 xltm2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms) + _UINT32 xltm2xlsx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { COfficeUtils oCOfficeUtils(NULL); if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); if (NSFile::CFileBinary::Exists(sContentTypesPath)) { std::wstring sData; @@ -1249,54 +1491,89 @@ namespace NExtractTools } return 0; } - // xltm -> xlsm - _UINT32 xltm2xlsm (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) + _UINT32 xlsb2xlsx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedXLSM = sTemp + FILE_SEPARATOR_STR + _T("xlsm_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedXLSM); + std::wstring sTempUnpackedXLSB = combinePath(convertParams.m_sTempDir, L"xlsb_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedXLSB); - _UINT32 nRes = xltm2xlsm_dir(sFrom, sTempUnpackedXLSM, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedXLSM, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; + COfficeUtils oCOfficeUtils(NULL); + _UINT32 nRes = oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLSB, NULL, 0); + if (SUCCEEDED_X2T(nRes)) + { + OOX::Spreadsheet::CXlsb oXlsb; + oXlsb.ReadNative(OOX::CPath(sTempUnpackedXLSB)); + oXlsb.PrepareSi(); + oXlsb.PrepareTableFormula(); + + OOX::CContentTypes oContentTypes; + oXlsb.SetPropForWriteSheet(sTo, oContentTypes); + oXlsb.ReadSheetData(); + + nRes = oXlsb.WriteNative(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; + if(!params.m_bMacro) + { + ///removing scripts + std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); + if (NSFile::CFileBinary::Exists(sContentTypesPath)) + { + std::wstring sData; + if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) + { + std::wstring sCTFrom = L"application/vnd.ms-excel.sheet.macroEnabled.main+xml"; + std::wstring sCTTo = L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"; + sData = string_replaceAll(sData, sCTFrom, sCTTo); + + sCTFrom = L""; + sData = string_replaceAll(sData, sCTFrom, L""); + + sCTFrom = L""; + sData = string_replaceAll(sData, sCTFrom, L""); + + if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true) == false) + { + return AVS_FILEUTILS_ERROR_CONVERT; + } + } + } + std::wstring sWorkbookRelsPath = sTo + FILE_SEPARATOR_STR + L"xl" + FILE_SEPARATOR_STR + L"_rels" + FILE_SEPARATOR_STR + L"workbook.xml.rels"; + if (NSFile::CFileBinary::Exists(sWorkbookRelsPath)) + { + std::wstring sData; + if (NSFile::CFileBinary::ReadAllTextUtf8(sWorkbookRelsPath, sData)) + { + size_t pos = sData.find(L"vbaProject.bin"); + if (pos != std::wstring::npos) + { + size_t pos1 = sData.rfind(L"<", pos); + size_t pos2 = sData.find(L">", pos); + + if (pos1 != std::wstring::npos && pos2 != std::wstring::npos) + { + sData.erase(sData.begin() + pos1, sData.begin() + pos2 + 1); + } + } + if (NSFile::CFileBinary::SaveToFile(sWorkbookRelsPath, sData, true) == false) + { + return AVS_FILEUTILS_ERROR_CONVERT; + } + } + } + std::wstring sVbaProjectPath = sTo + FILE_SEPARATOR_STR + L"xl" + FILE_SEPARATOR_STR + L"vbaProject.bin"; + NSFile::CFileBinary::Remove(sVbaProjectPath); + } + + } + return nRes; } - _UINT32 xltm2xlsm_dir (const std::wstring &sFrom, const std::wstring &sTo, InputParams& params) + + // pptx + _UINT32 pptx2pptt_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) - { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); - if (NSFile::CFileBinary::Exists(sContentTypesPath)) - { - std::wstring sData; - if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) - { - std::wstring sCTFrom = _T("application/vnd.ms-excel.template.macroEnabled.main+xml"); - std::wstring sCTTo = _T("application/vnd.ms-excel.sheet.macroEnabled.main+xml"); + // unzip pptx to temp folder + std::wstring sTempUnpackedPPTX = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedPPTX); - sData = string_replaceAll(sData, sCTFrom, sCTTo); - - if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true)) - { - return 0; - } - } - } - } - return AVS_FILEUTILS_ERROR_CONVERT; - } - // pptx -> bin - _UINT32 pptx2pptt_bin (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) - { - // unzip pptx to temp folder - std::wstring sTempUnpackedPPTX = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); - - NSDirectory::CreateDirectory(sTempUnpackedPPTX); - - // unzip pptx to folder + // unzip pptx to folder COfficeUtils oCOfficeUtils(NULL); if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedPPTX, NULL, 0)) { @@ -1305,9 +1582,9 @@ namespace NExtractTools if (OfficeFileFormatChecker.isOfficeFile(sFrom)) { if (OfficeFileFormatChecker.nFileType == AVS_OFFICESTUDIO_FILE_OTHER_MS_OFFCRYPTO) - return mscrypt2oot_bin(sFrom, sTo, sTemp, params); + return mscrypt2oot_bin(sFrom, sTo, params, convertParams); else if (OfficeFileFormatChecker.nFileType == AVS_OFFICESTUDIO_FILE_OTHER_MS_MITCRYPTO) - return mitcrypt2oot_bin(sFrom, sTo, sTemp, params); + return mitcrypt2oot_bin(sFrom, sTo, params, convertParams); else { if (create_if_empty(sFrom, sTo, L"PPTY;v10;0;")) @@ -1319,15 +1596,31 @@ namespace NExtractTools return AVS_FILEUTILS_ERROR_CONVERT; } - return pptx_dir2pptt_bin(sTempUnpackedPPTX, sTo, sTemp, params, sFrom); + convertParams.m_sTempParamOOXMLFile = sFrom; + return pptx_dir2pptt_bin(sTempUnpackedPPTX, sTo, params, convertParams); } - _UINT32 pptx_dir2pptt_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, const std::wstring &sPptxFile) + _UINT32 pptx_dir2pptt(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultPpttDir = combinePath(convertParams.m_sTempDir, L"pptt_unpacked"); + std::wstring sTempPpttFileEditor = combinePath(sResultPpttDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultPpttDir); + + _UINT32 nRes = pptx_dir2pptt_bin(sFrom, sTempPpttFileEditor, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + // zip pptt folder to output file + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultPpttDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 pptx_dir2pptt_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { _UINT32 nRes = 0; std::wstring sToDir = NSDirectory::GetFolderPath(sTo); - if (params.needConvertToOrigin(AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX) && !sPptxFile.empty()) + if (params.needConvertToOrigin(AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX) && !convertParams.m_sTempParamOOXMLFile.empty()) { - nRes = CopyOOXOrigin(sToDir, sFrom, L"origin.pptx", sPptxFile); + nRes = CopyOOXOrigin(sToDir, sFrom, L"origin.pptx", convertParams.m_sTempParamOOXMLFile); } else { @@ -1337,24 +1630,25 @@ namespace NExtractTools if (pptx_file) { pptx_file->SetIsNoBase64(params.getIsNoBase64()); - pptx_file->put_TempDirectory(sTemp); + pptx_file->put_TempDirectory(convertParams.m_sTempDir); pptx_file->SetFontDir(params.getFontPath()); nRes = (S_OK == pptx_file->OpenFileToPPTY(sFrom, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; delete pptx_file; } } + + convertParams.m_sTempParamOOXMLFile = L""; return nRes; } - // pptx_dir -> pptt - _UINT32 pptx_dir2pptt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, const std::wstring &sPptxFile) + _UINT32 pptx2pptt(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultPpttDir = sTemp + FILE_SEPARATOR_STR + _T("pptt_unpacked"); - std::wstring sTempPpttFileEditor = sResultPpttDir + FILE_SEPARATOR_STR + _T("Editor.bin"); + std::wstring sResultPpttDir = combinePath(convertParams.m_sTempDir, L"pptt_unpacked"); + std::wstring sTempPpttFileEditor = combinePath(sResultPpttDir, L"Editor.bin"); NSDirectory::CreateDirectory(sResultPpttDir); - _UINT32 nRes = pptx_dir2pptt_bin(sFrom, sTempPpttFileEditor, sTemp, params, sPptxFile); + _UINT32 nRes = pptx2pptt_bin(sFrom, sTempPpttFileEditor, params, convertParams); if (SUCCEEDED_X2T(nRes)) { // zip pptt folder to output file @@ -1363,36 +1657,20 @@ namespace NExtractTools } return nRes; } - // pptx -> pptt - _UINT32 pptx2pptt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 pptt_bin2pptx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultPpttDir = sTemp + FILE_SEPARATOR_STR + _T("pptt_unpacked"); - std::wstring sTempPpttFileEditor = sResultPpttDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultPpttDir); - - _UINT32 nRes = pptx2pptt_bin(sFrom, sTempPpttFileEditor, sTemp, params); - if (SUCCEEDED_X2T(nRes)) - { - // zip pptt folder to output file - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultPpttDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - - // bin -> pptx - _UINT32 pptt_bin2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms) - { - std::wstring sResultPptxDir = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); + std::wstring sResultPptxDir = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); NSDirectory::CreateDirectory(sResultPptxDir); - _UINT32 nRes = pptt_bin2pptx_dir(sFrom, sTo, sResultPptxDir, sThemeDir, params); + convertParams.m_sTempResultOOXMLDirectory = sResultPptxDir; + _UINT32 nRes = pptt_bin2pptx_dir(sFrom, sTo, params, convertParams); if (SUCCEEDED_X2T(nRes) && params.m_nFormatTo) { - if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM == *params.m_nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX == *params.m_nFormatTo || - AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == *params.m_nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM == *params.m_nFormatTo || + if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM == *params.m_nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX == *params.m_nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == *params.m_nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM == *params.m_nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM == *params.m_nFormatTo) { std::wstring sCTFrom = _T("application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"); @@ -1420,11 +1698,11 @@ namespace NExtractTools } if (SUCCEEDED_X2T(nRes)) { - nRes = dir2zipMscrypt(sResultPptxDir, sTo, sTemp, params); + nRes = dir2zipMscrypt(sResultPptxDir, sTo, params, convertParams); } return nRes; } - _UINT32 pptt_bin2pptx_dir(const std::wstring &sFrom, const std::wstring &sToResult, const std::wstring &sTo, const std::wstring &sThemeDir, InputParams ¶ms) + _UINT32 pptt_bin2pptx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { _UINT32 nRes = 0; @@ -1432,7 +1710,7 @@ namespace NExtractTools if (params.getFromChanges()) { params.setFromChanges(false); - nRes = apply_changes(sFrom, sToResult, NSDoctRenderer::DoctRendererFormat::FormatFile::PPTT, sThemeDir, sTargetBin, params); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::PPTT, sTargetBin, params, convertParams); } else sTargetBin = sFrom; @@ -1446,7 +1724,7 @@ namespace NExtractTools pptx_file->SetMacroEnabled(params.m_bMacro); pptx_file->SetIsNoBase64(params.getIsNoBase64()); pptx_file->SetFontDir(params.getFontPath()); - nRes = (S_OK == pptx_file->ConvertPPTYToPPTX(sTargetBin, sTo, sThemeDir)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + nRes = (S_OK == pptx_file->ConvertPPTYToPPTX(sTargetBin, convertParams.m_sTempResultOOXMLDirectory, convertParams.m_sThemesDir)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; delete pptx_file; } @@ -1454,791 +1732,106 @@ namespace NExtractTools if (sFrom != sTargetBin) NSFile::CFileBinary::Remove(sTargetBin); + convertParams.m_sTempResultOOXMLDirectory = L""; return nRes; } - // pptt -> pptx - _UINT32 pptt2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms) + _UINT32 pptt2pptx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { // unzip pptt to temp folder - std::wstring sTempUnpackedPPTT = sTemp + FILE_SEPARATOR_STR + _T("pptt_unpacked"); - std::wstring sTempPpttFileEditor = sTempUnpackedPPTT + FILE_SEPARATOR_STR + _T("Editor.bin"); - + std::wstring sTempUnpackedPPTT = combinePath(convertParams.m_sTempDir, L"pptt_unpacked"); + std::wstring sTempPpttFileEditor = combinePath(sTempUnpackedPPTT, L"Editor.bin"); NSDirectory::CreateDirectory(sTempUnpackedPPTT); - // unzip pptt to folder + // unzip pptt to folder COfficeUtils oCOfficeUtils(NULL); if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedPPTT, NULL, 0)) return AVS_FILEUTILS_ERROR_CONVERT; - return pptt_bin2pptx(sTempPpttFileEditor, sTo, sTemp, sThemeDir, params); - } - // zip dir - _UINT32 dir2zip(const std::wstring &sFrom, const std::wstring &sTo, bool bSorted, int method, short level, bool bDateTime) - { - COfficeUtils oCOfficeUtils(NULL); - return (S_OK == oCOfficeUtils.CompressFileOrDirectory(sFrom, sTo, bSorted, method, level, bDateTime)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - _UINT32 dir2zipMscrypt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - _UINT32 nRes = S_OK; - if (params.hasSavePassword()) - { - std::wstring sToMscrypt = sTemp + FILE_SEPARATOR_STR + _T("tomscrypt.docx"); - nRes = dir2zip(sFrom, sToMscrypt); - if (SUCCEEDED_X2T(nRes)) - { - nRes = oox2mscrypt(sToMscrypt, sTo, sTemp, params); - } - } - else - { - nRes = dir2zip(sFrom, sTo, true); - } - return nRes; + return pptt_bin2pptx(sTempPpttFileEditor, sTo, params, convertParams); } - // unzip dir - _UINT32 zip2dir(const std::wstring &sFrom, const std::wstring &sTo) + _UINT32 ppsx2pptx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - COfficeUtils oCOfficeUtils(NULL); - return (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - - // csv -> xslt - _UINT32 csv2xlst(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sCSV = sFrom; - std::wstring sResultXlstDir = sTemp + FILE_SEPARATOR_STR + _T("xlst_unpacked"); - std::wstring sResultXlstFileEditor = sResultXlstDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultXlstDir); - - COfficeUtils oCOfficeUtils(NULL); - // Save to file (from temp dir) - BinXlsxRW::CXlsxSerializer oCXlsxSerializer; - - oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); - oCXlsxSerializer.setFontDir(params.getFontPath()); - - if (!params.m_nFormatFrom) - params.m_nFormatFrom = new int(AVS_OFFICESTUDIO_FILE_UNKNOWN); - if (AVS_OFFICESTUDIO_FILE_UNKNOWN == *params.m_nFormatFrom) - *params.m_nFormatFrom = AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV; - - _UINT32 nRes = oCXlsxSerializer.saveToFile(sResultXlstFileEditor, sCSV, params.getXmlOptions()); - - if (SUCCEEDED_X2T(nRes)) - { - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultXlstDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - - return nRes; - } - // csv -> xslx_dir - _UINT32 csv2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - OOX::Spreadsheet::CXlsx oXlsx; - - BYTE fileType; - UINT nCodePage; - std::wstring sDelimiter; - BYTE saveFileType; - SerializeCommon::ReadFileType(params.getXmlOptions(), fileType, nCodePage, sDelimiter, saveFileType); - - CSVReader csvReader; - _UINT32 nRes = csvReader.Read(sFrom, oXlsx, nCodePage, sDelimiter); - - oXlsx.PrepareToWrite(); - - OOX::CContentTypes oContentTypes; - nRes = oXlsx.Write(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; - - return nRes; - } - // xml -> xlsx - _UINT32 xml2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultXlsxDir = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); - NSDirectory::CreateDirectory(sResultXlsxDir); - _UINT32 nRes = xml2xlsx_dir(sFrom, sResultXlsxDir, sTemp, params); - - if (SUCCEEDED_X2T(nRes)) - { - nRes = dir2zipMscrypt(sResultXlsxDir, sTo, sTemp, params); - } - return nRes; - } - _UINT32 xml2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - OOX::Spreadsheet::CXlsx oXlsx; - - XMLReader reader = {}; - - reader.Read2(sFrom, oXlsx); - - oXlsx.PrepareToWrite(); - - OOX::CContentTypes oContentTypes; - auto nRes = oXlsx.Write(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; - - return nRes; - } - // csv -> xslx - _UINT32 csv2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultXlsxDir = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); - NSDirectory::CreateDirectory(sResultXlsxDir); - - _UINT32 nRes = csv2xlsx_dir(sFrom, sResultXlsxDir, sTemp, params); - if (SUCCEEDED_X2T(nRes)) - { - nRes = dir2zipMscrypt(sResultXlsxDir, sTo, sTemp, params); - } - return nRes; - } - _UINT32 csv2xlst_bin(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms) - { - // Save to file (from temp dir) - BinXlsxRW::CXlsxSerializer oCXlsxSerializer; - - oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); - oCXlsxSerializer.setFontDir(params.getFontPath()); - - return oCXlsxSerializer.saveToFile(sTo, sFrom, params.getXmlOptions()); - } - // xlst -> csv - _UINT32 xlst2csv(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sCSV = sTo; - std::wstring sTempUnpackedXLST = sTemp + FILE_SEPARATOR_STR + _T("xlst_unpacked"); - std::wstring sTempXlstFileEditor = sTempUnpackedXLST + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sTempUnpackedXLST); - - // unzip xlst to folder - COfficeUtils oCOfficeUtils(NULL); - if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLST, NULL, 0)) - return AVS_FILEUTILS_ERROR_CONVERT; - - BinXlsxRW::CXlsxSerializer oCXlsxSerializer; - - oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); - oCXlsxSerializer.setFontDir(params.getFontPath()); - oCXlsxSerializer.setTempDir(sTemp); - - std::wstring sMediaPath; - std::wstring sEmbedPath; - - params.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV); - - return oCXlsxSerializer.loadFromFile(sTempXlstFileEditor, sCSV, params.getXmlOptions(), sMediaPath, sEmbedPath); - } - // xlsx_dir -> csv - _UINT32 xlsx_dir2csv(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultXlstDir = sTemp + FILE_SEPARATOR_STR + _T("xlst_unpacked"); - std::wstring sResultXlstFileEditor = sResultXlstDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultXlstDir); - - BinXlsxRW::CXlsxSerializer oCXlsxSerializer; - - oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); - oCXlsxSerializer.setFontDir(params.getFontPath()); - - std::wstring sXMLOptions = _T(""); - _UINT32 nRes = oCXlsxSerializer.saveToFile(sResultXlstFileEditor, sFrom, sXMLOptions); - if (SUCCEEDED_X2T(nRes)) - { - std::wstring sMediaPath; - std::wstring sEmbedPath; - - sXMLOptions = _T(""); - - nRes = oCXlsxSerializer.loadFromFile(sResultXlstFileEditor, sTo, sXMLOptions, sMediaPath, sEmbedPath); - } - - return nRes; - } - // xslx -> csv - _UINT32 xlsx2csv(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedXLSX = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedXLSX); - - COfficeUtils oCOfficeUtils(NULL); - if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLSX, NULL, 0)) - return AVS_FILEUTILS_ERROR_CONVERT; - - return xlsx_dir2csv(sTempUnpackedXLSX, sTo, sTemp, params); - } - _UINT32 xlst_bin2csv(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms) - { - _UINT32 nRes = 0; - - std::wstring sTargetBin; - if (params.getFromChanges()) - { - params.setFromChanges(false); - nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::XLST, sThemeDir, sTargetBin, params); - } - else - sTargetBin = sFrom; - - if (SUCCEEDED_X2T(nRes)) - { - BinXlsxRW::CXlsxSerializer oCXlsxSerializer; - - oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); - oCXlsxSerializer.setFontDir(params.getFontPath()); - - std::wstring sResultCsvDir = sTemp + FILE_SEPARATOR_STR + _T("csv_unpacked"); - - NSDirectory::CreateDirectory(sResultCsvDir); - std::wstring sMediaPath; // will be filled by 'CreateXlsxFolders' method - std::wstring sEmbedPath; // will be filled by 'CreateXlsxFolders' method - std::wstring sXmlOptions = params.getXmlOptions(); - - oCXlsxSerializer.CreateXlsxFolders(sXmlOptions, sResultCsvDir, sMediaPath, sEmbedPath); - - nRes = oCXlsxSerializer.loadFromFile(sTargetBin, sTo, sXmlOptions, sMediaPath, sEmbedPath); - } - return nRes; - } - // bin -> pdf - _UINT32 bin2pdf(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, bool bPaid, const std::wstring &sThemeDir, InputParams ¶ms) - { - NSFonts::IApplicationFonts *pApplicationFonts = NSFonts::NSApplication::Create(); - initApplicationFonts(pApplicationFonts, params); - - CPdfFile pdfWriter(pApplicationFonts); - pdfWriter.CreatePdf(params.getIsPDFA()); - pdfWriter.SetTempDirectory(sTemp); - pdfWriter.SetDocumentInfo(params.getTitle(), L"", L"", L""); - - CConvertFromBinParams oBufferParams; - oBufferParams.m_sThemesDirectory = sThemeDir; - - std::wstring documentID = params.getDocumentID(); - if (false == documentID.empty()) - pdfWriter.SetDocumentID(documentID); - - std::wstring password = params.getSavePassword(); - if (false == password.empty()) - pdfWriter.SetPassword(password); - - int nReg = (bPaid == false) ? 0 : 1; - _UINT32 nRet = 0; - if (params.getIsNoBase64()) - { - nRet = S_OK == pdfWriter.OnlineWordToPdfFromBinary(sFrom, sTo, &oBufferParams) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - else - { - nRet = S_OK == pdfWriter.OnlineWordToPdf(sFrom, sTo, &oBufferParams) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - RELEASEOBJECT(pApplicationFonts); - return nRet; - } - _UINT32 bin2image( - const std::wstring &sTFileDir, BYTE *pBuffer, LONG lBufferLen, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms, - const std::wstring &sDocxDir = L"") - { - _UINT32 nRes = 0; - NSFonts::IApplicationFonts *pApplicationFonts = NSFonts::NSApplication::Create(); - initApplicationFonts(pApplicationFonts, params); - NSOnlineOfficeBinToPdf::CMetafileToRenderterRaster imageWriter(NULL); - imageWriter.SetMediaDirectory(sTFileDir); - imageWriter.SetThemesDirectory(sThemeDir); - imageWriter.SetInternalMediaDirectory(sDocxDir); - imageWriter.SetTempDirectory(sTemp); - imageWriter.SetApplication(pApplicationFonts); - if (NULL != params.m_oThumbnail) - { - InputParamsThumbnail *oThumbnail = params.m_oThumbnail; - if (NULL != oThumbnail->format) - { - imageWriter.SetRasterFormat(*oThumbnail->format); - } - if (NULL != oThumbnail->aspect) - { - imageWriter.SetSaveType(*oThumbnail->aspect); - } - if (NULL != oThumbnail->first) - { - imageWriter.SetIsOnlyFirst(*oThumbnail->first); - } - if (NULL != oThumbnail->width) - { - imageWriter.SetRasterW(*oThumbnail->width); - } - if (NULL != oThumbnail->height) - { - imageWriter.SetRasterH(*oThumbnail->height); - } - } - std::wstring sThumbnailDir; - if (imageWriter.GetIsOnlyFirst()) - { - imageWriter.SetFileName(sTo); - } - else - { - std::wstring sFileAddon = L"image" + getExtentionByRasterFormat(imageWriter.GetRasterFormat()); - if (NULL == params.m_oThumbnail->zip || *(params.m_oThumbnail->zip)) - { - sThumbnailDir = sTemp + FILE_SEPARATOR_STR + L"thumbnails"; - NSDirectory::CreateDirectory(sThumbnailDir); - imageWriter.SetFileName(sThumbnailDir + FILE_SEPARATOR_STR + sFileAddon); - } - else - { - if (!NSDirectory::Exists(sTo)) - NSDirectory::CreateDirectory(sTo); - imageWriter.SetFileName(sTo + FILE_SEPARATOR_STR + sFileAddon); - } - } - nRes = imageWriter.ConvertBuffer(pBuffer, lBufferLen) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - if (!sThumbnailDir.empty()) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = S_OK == oCOfficeUtils.CompressFileOrDirectory(sThumbnailDir, sTo) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - RELEASEOBJECT(pApplicationFonts); - return nRes; - } - _UINT32 bin2imageBase64(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms, const std::wstring &sDocxDir = L"") - { - _UINT32 nRes = 0; - NSFile::CFileBinary oFile; - if (!oFile.OpenFile(sFrom)) - return AVS_FILEUTILS_ERROR_CONVERT; - - DWORD dwFileSize = oFile.GetFileSize(); - BYTE *pFileContent = new BYTE[dwFileSize]; - if (!pFileContent) - { - oFile.CloseFile(); - return AVS_FILEUTILS_ERROR_CONVERT; - } - - DWORD dwReaded; - oFile.ReadFile(pFileContent, dwFileSize, dwReaded); - oFile.CloseFile(); - - int nBufferLen = NSBase64::Base64DecodeGetRequiredLength(dwFileSize); - BYTE *pBuffer = new BYTE[nBufferLen]; - if (!pBuffer) - { - RELEASEARRAYOBJECTS(pFileContent); - return AVS_FILEUTILS_ERROR_CONVERT; - } - - if (NSBase64::Base64Decode((const char *)pFileContent, dwFileSize, pBuffer, &nBufferLen)) - { - std::wstring sTFileDir = NSDirectory::GetFolderPath(sFrom); - nRes = bin2image(sTFileDir, pBuffer, nBufferLen, sTo, sTemp, sThemeDir, params, sDocxDir); - } - else - { - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - - RELEASEARRAYOBJECTS(pBuffer); - RELEASEARRAYOBJECTS(pFileContent); - - return nRes; - } - // doct_bin -> epub - _UINT32 doct_bin2epub( - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType, const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms, - const std::wstring &sDocxDir = L"") - { - _UINT32 nRes = 0; - NSDoctRenderer::DoctRendererFormat::FormatFile eToType = NSDoctRenderer::DoctRendererFormat::FormatFile::HTML; - std::wstring sFileFromDir = NSDirectory::GetFolderPath(sFrom); - std::wstring sImagesDirectory = sFileFromDir + FILE_SEPARATOR_STR + L"media"; - std::wstring sHtmlFile = sTemp + FILE_SEPARATOR_STR + L"index.html"; - if (!NSDirectory::Exists(sImagesDirectory)) - NSDirectory::CreateDirectory(sImagesDirectory); - NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : L""); - std::wstring sXml = getDoctXml(eFromType, eToType, sFrom, sHtmlFile, sImagesDirectory, sThemeDir, -1, L"", params); - std::wstring sResult; - oDoctRenderer.Execute(sXml, sResult); - if (sResult.find(L"error") != std::wstring::npos) - { - std::wcerr << L"DoctRenderer:" << sResult << std::endl; - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - else - { - CEpubFile oFile; - std::wstring sEpubTemp = sTemp + FILE_SEPARATOR_STR + L"tmp"; - NSDirectory::CreateDirectory(sEpubTemp); - oFile.SetTempDirectory(sEpubTemp); - if (S_FALSE == oFile.FromHtml(sHtmlFile, sTo, params.m_sTitle ? *params.m_sTitle : L"")) - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - // doct_bin -> fb2 - _UINT32 doct_bin2fb( - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType, const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms, - const std::wstring &sDocxDir = L"") - { - _UINT32 nRes = 0; - NSDoctRenderer::DoctRendererFormat::FormatFile eToType = NSDoctRenderer::DoctRendererFormat::FormatFile::HTML; - std::wstring sFileFromDir = NSDirectory::GetFolderPath(sFrom); - std::wstring sImagesDirectory = sFileFromDir + FILE_SEPARATOR_STR + L"media"; - std::wstring sHtmlFile = sTemp + FILE_SEPARATOR_STR + L"index.html"; - if (!NSDirectory::Exists(sImagesDirectory)) - NSDirectory::CreateDirectory(sImagesDirectory); - NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : L""); - std::wstring sXml = getDoctXml(eFromType, eToType, sFrom, sHtmlFile, sImagesDirectory, sThemeDir, -1, L"", params); - std::wstring sResult; - oDoctRenderer.Execute(sXml, sResult); - if (sResult.find(L"error") != std::wstring::npos) - { - std::wcerr << L"DoctRenderer:" << sResult << std::endl; - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - else - { - CFb2File fb2File; - fb2File.SetTmpDirectory(sTemp); - if (S_FALSE == fb2File.FromHtml(sHtmlFile, sTo, params.m_sTitle ? *params.m_sTitle : L"")) - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - // doct_bin -> html - _UINT32 doct_bin2html( - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType, const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, bool bPaid, const std::wstring &sThemeDir, - InputParams ¶ms, const std::wstring &sDocxDir = L"") - { - _UINT32 nRes = 0; - NSDoctRenderer::DoctRendererFormat::FormatFile eToType = NSDoctRenderer::DoctRendererFormat::FormatFile::HTML; - std::wstring sFileFromDir = NSDirectory::GetFolderPath(sFrom); - std::wstring sImagesDirectory = sFileFromDir + FILE_SEPARATOR_STR + L"media"; - std::wstring sHtmlFile = sTemp + FILE_SEPARATOR_STR + L"index.html"; - if (!NSDirectory::Exists(sImagesDirectory)) - NSDirectory::CreateDirectory(sImagesDirectory); - NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : L""); - std::wstring sXml = getDoctXml(eFromType, eToType, sFrom, sHtmlFile, sImagesDirectory, sThemeDir, -1, L"", params); - std::wstring sResult; - oDoctRenderer.Execute(sXml, sResult); - if (sResult.find(L"error") != std::wstring::npos) - { - std::wcerr << L"DoctRenderer:" << sResult << std::endl; - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - else if (!NSFile::CFileBinary::Copy(sHtmlFile, sTo)) - nRes = AVS_FILEUTILS_ERROR_CONVERT; - return nRes; - } - // doct_bin -> html_zip - _UINT32 doct_bin2html_zip( - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType, const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, bool bPaid, const std::wstring &sThemeDir, - InputParams ¶ms, const std::wstring &sDocxDir = L"") - { - _UINT32 nRes = 0; - NSDoctRenderer::DoctRendererFormat::FormatFile eToType = NSDoctRenderer::DoctRendererFormat::FormatFile::HTML; - std::wstring sFileFromDir = NSDirectory::GetFolderPath(sFrom); - std::wstring sImagesDirectory = sFileFromDir + FILE_SEPARATOR_STR + L"media"; - std::wstring sHtmlFile = sTemp + FILE_SEPARATOR_STR + L"index.html"; - if (!NSDirectory::Exists(sImagesDirectory)) - NSDirectory::CreateDirectory(sImagesDirectory); - NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : L""); - std::wstring sXml = getDoctXml(eFromType, eToType, sFrom, sHtmlFile, sImagesDirectory, sThemeDir, -1, L"", params); - std::wstring sResult; - oDoctRenderer.Execute(sXml, sResult); - if (sResult.find(L"error") != std::wstring::npos) - { - std::wcerr << L"DoctRenderer:" << sResult << std::endl; - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - else - { - COfficeUtils oZip; - if (S_FALSE == oZip.CompressFileOrDirectory(sHtmlFile, sTo)) - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - // doct_bin -> pdf - _UINT32 doct_bin2pdf( - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType, const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, bool bPaid, const std::wstring &sThemeDir, - InputParams ¶ms, const std::wstring &sDocxDir = L"") - { - _UINT32 nRes = 0; - NSDoctRenderer::DoctRendererFormat::FormatFile eToType = NSDoctRenderer::DoctRendererFormat::FormatFile::PDF; - std::wstring sTFileDir = NSDirectory::GetFolderPath(sFrom); - std::wstring sImagesDirectory = sTFileDir + FILE_SEPARATOR_STR + _T("media"); - std::wstring sPdfBinFile = sTFileDir + FILE_SEPARATOR_STR + _T("pdf.bin"); - NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : _T("")); - std::wstring sXml = getDoctXml(eFromType, eToType, sFrom, sPdfBinFile, sImagesDirectory, sThemeDir, -1, _T(""), params); - std::wstring sResult; - bool bRes = oDoctRenderer.Execute(sXml, sResult); - if (sResult.find(L"error") != std::wstring::npos) - { - std::wcerr << _T("DoctRenderer:") << sResult << std::endl; - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - else - { - NSFonts::IApplicationFonts *pApplicationFonts = NSFonts::NSApplication::Create(); - initApplicationFonts(pApplicationFonts, params); - - CPdfFile pdfWriter(pApplicationFonts); - pdfWriter.CreatePdf(params.getIsPDFA()); - pdfWriter.SetTempDirectory(sTemp); - pdfWriter.SetDocumentInfo(params.getTitle(), L"", L"", L""); - - CConvertFromBinParams oBufferParams; - oBufferParams.m_sThemesDirectory = sThemeDir; - oBufferParams.m_sInternalMediaDirectory = sDocxDir; - - std::wstring documentID = params.getDocumentID(); - if (false == documentID.empty()) - pdfWriter.SetDocumentID(documentID); - - std::wstring password = params.getSavePassword(); - if (false == password.empty()) - pdfWriter.SetPassword(password); - - int nReg = (bPaid == false) ? 0 : 1; - nRes = (S_OK == pdfWriter.OnlineWordToPdfFromBinary(sPdfBinFile, sTo, &oBufferParams)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - RELEASEOBJECT(pApplicationFonts); - } - // удаляем sPdfBinFile, потому что он не в Temp - if (NSFile::CFileBinary::Exists(sPdfBinFile)) - NSFile::CFileBinary::Remove(sPdfBinFile); - return nRes; - } - // doct_bin -> image - _UINT32 doct_bin2image( - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType, const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, bool bPaid, const std::wstring &sThemeDir, - InputParams ¶ms, const std::wstring &sDocxDir = L"") - { - _UINT32 nRes = 0; - NSDoctRenderer::DoctRendererFormat::FormatFile eToType = NSDoctRenderer::DoctRendererFormat::FormatFile::IMAGE; - std::wstring sTFileDir = NSDirectory::GetFolderPath(sFrom); - std::wstring sImagesDirectory = sTFileDir + FILE_SEPARATOR_STR + _T("media"); - std::wstring sPdfBinFile = sTFileDir + FILE_SEPARATOR_STR + _T("pdf.bin"); - NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : _T("")); - std::wstring sXml = getDoctXml(eFromType, eToType, sFrom, sPdfBinFile, sImagesDirectory, sThemeDir, -1, _T(""), params); - std::wstring sResult; - bool bRes = oDoctRenderer.Execute(sXml, sResult); - if (-1 != sResult.find(_T("error"))) - { - std::wcerr << _T("DoctRenderer:") << sResult << std::endl; - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - else - { - BYTE *pData = NULL; - DWORD nBytesCount; - if (NSFile::CFileBinary::ReadAllBytes(sPdfBinFile, &pData, nBytesCount)) - { - nRes = 0 == bin2image(sTFileDir, pData, nBytesCount, sTo, sTemp, sThemeDir, params, sDocxDir) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - RELEASEARRAYOBJECTS(pData); - } - else - { - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - } - // delete sPdfBinFile, because it is not in Temp - if (NSFile::CFileBinary::Exists(sPdfBinFile)) - NSFile::CFileBinary::Remove(sPdfBinFile); - return nRes; - } - - // ppsx -> pptx - _UINT32 ppsx2pptx (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) - { - std::wstring sTempUnpackedPPTX = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedPPTX); - - _UINT32 nRes = ppsx2pptx_dir(sFrom, sTempUnpackedPPTX, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedPPTX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 ppsx2pptx_dir (const std::wstring &sFrom, const std::wstring &sTo, InputParams& params) - { - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) - { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); - if (NSFile::CFileBinary::Exists(sContentTypesPath)) - { - std::wstring sData; - if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) - { - std::wstring sCTFrom = _T("application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml"); - std::wstring sCTTo = _T("application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"); - - sData = string_replaceAll(sData, sCTFrom, sCTTo); - - if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true)) - { - return 0; - } - } - } - } - return AVS_FILEUTILS_ERROR_CONVERT; - } - // pptm -> pptx - _UINT32 pptm2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedPPTX = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); + std::wstring sTempUnpackedPPTX = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedPPTX); - _UINT32 nRes = pptm2pptx_dir(sFrom, sTempUnpackedPPTX, params); + _UINT32 nRes = ppsx2pptx_dir(sFrom, sTempUnpackedPPTX, params, convertParams); if (SUCCEEDED_X2T(nRes)) { COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedPPTX, sTo, true)) - return 0; + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedPPTX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; } - return AVS_FILEUTILS_ERROR_CONVERT; + return nRes; } - _UINT32 pptm2pptx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms) + _UINT32 ppsx2pptx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { COfficeUtils oCOfficeUtils(NULL); if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); if (NSFile::CFileBinary::Exists(sContentTypesPath)) { std::wstring sData; if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) { - std::wstring sCTFrom = _T("application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml"); + std::wstring sCTFrom = _T("application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml"); std::wstring sCTTo = _T("application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"); + sData = string_replaceAll(sData, sCTFrom, sCTTo); - sCTFrom = L""; - sData = string_replaceAll(sData, sCTFrom, L""); - - sCTFrom = L""; - sData = string_replaceAll(sData, sCTFrom, L""); - - if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true) == false) + if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true)) { - return AVS_FILEUTILS_ERROR_CONVERT; + return 0; } } } - std::wstring sPresentationRelsPath = sTo + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"_rels" + FILE_SEPARATOR_STR + L"presentation.xml.rels"; - if (NSFile::CFileBinary::Exists(sPresentationRelsPath)) - { - std::wstring sData; - if (NSFile::CFileBinary::ReadAllTextUtf8(sPresentationRelsPath, sData)) - { - size_t pos = sData.find(L"vbaProject.bin"); - if (pos != std::wstring::npos) - { - size_t pos1 = sData.rfind(L"<", pos); - size_t pos2 = sData.find(L">", pos); - - if (pos1 != std::wstring::npos && pos2 != std::wstring::npos) - { - sData.erase(sData.begin() + pos1, sData.begin() + pos2 + 1); - } - } - if (NSFile::CFileBinary::SaveToFile(sPresentationRelsPath, sData, true) == false) - { - return AVS_FILEUTILS_ERROR_CONVERT; - } - } - } - std::wstring sVbaProjectPath = sTo + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"vbaProject.bin"; - NSFile::CFileBinary::Remove(sVbaProjectPath); } - return 0; + return AVS_FILEUTILS_ERROR_CONVERT; } - // potm -> pptx - _UINT32 potm2pptx (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) + _UINT32 potx2pptx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedPPTX = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedPPTX); - - _UINT32 nRes = potm2pptx_dir(sFrom, sTempUnpackedPPTX, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedPPTX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 potm2pptx_dir (const std::wstring &sFrom, const std::wstring &sTo, InputParams& params) - { - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) - { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); - if (NSFile::CFileBinary::Exists(sContentTypesPath)) - { - std::wstring sData; - if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) - { - std::wstring sCTFrom = _T("application/vnd.ms-powerpoint.template.macroEnabled.main+xml"); - std::wstring sCTTo = _T("application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"); - sData = string_replaceAll(sData, sCTFrom, sCTTo); - - sCTFrom = L""; - sData = string_replaceAll(sData, sCTFrom, L""); - - sCTFrom = L""; - sData = string_replaceAll(sData, sCTFrom, L""); - - if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true) == false) - { - return AVS_FILEUTILS_ERROR_CONVERT; - } - } - } - std::wstring sPresentationRelsPath = sTo + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"_rels" + FILE_SEPARATOR_STR + L"presentation.xml.rels"; - if (NSFile::CFileBinary::Exists(sPresentationRelsPath)) - { - std::wstring sData; - if (NSFile::CFileBinary::ReadAllTextUtf8(sPresentationRelsPath, sData)) - { - size_t pos = sData.find(L"vbaProject.bin"); - if (pos != std::wstring::npos) - { - size_t pos1 = sData.rfind(L"<", pos); - size_t pos2 = sData.find(L">", pos); - - if (pos1 != std::wstring::npos && pos2 != std::wstring::npos) - { - sData.erase(sData.begin() + pos1, sData.begin() + pos2 + 1); - } - } - if (NSFile::CFileBinary::SaveToFile(sPresentationRelsPath, sData, true) == false) - { - return AVS_FILEUTILS_ERROR_CONVERT; - } - } - } - std::wstring sVbaProjectPath = sTo + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"vbaProject.bin"; - NSFile::CFileBinary::Remove(sVbaProjectPath); - } - return 0; - } - // ppsm -> pptx - _UINT32 ppsm2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedPPTX = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); + std::wstring sTempUnpackedPPTX = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedPPTX); - _UINT32 nRes = ppsm2pptx_dir(sFrom, sTempUnpackedPPTX, params); + _UINT32 nRes = potx2pptx_dir(sFrom, sTempUnpackedPPTX, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedPPTX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 potx2pptx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) + { + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); + if (NSFile::CFileBinary::Exists(sContentTypesPath)) + { + std::wstring sData; + if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) + { + std::wstring sCTFrom = _T("application/vnd.openxmlformats-officedocument.presentationml.template.main+xml"); + std::wstring sCTTo = _T("application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"); + + sData = string_replaceAll(sData, sCTFrom, sCTTo); + + if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true)) + { + return 0; + } + } + } + } + return AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 ppsm2pptx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedPPTX = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedPPTX); + + _UINT32 nRes = ppsm2pptx_dir(sFrom, sTempUnpackedPPTX, params, convertParams); if (SUCCEEDED_X2T(nRes)) { COfficeUtils oCOfficeUtils(NULL); @@ -2247,12 +1840,12 @@ namespace NExtractTools } return AVS_FILEUTILS_ERROR_CONVERT; } - _UINT32 ppsm2pptx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms) + _UINT32 ppsm2pptx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { COfficeUtils oCOfficeUtils(NULL); if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); if (NSFile::CFileBinary::Exists(sContentTypesPath)) { std::wstring sData; @@ -2302,52 +1895,12 @@ namespace NExtractTools } return 0; } - // potx -> pptx - _UINT32 potx2pptx (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) + _UINT32 potm2pptm(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedPPTX = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedPPTX); - - _UINT32 nRes = potx2pptx_dir(sFrom, sTempUnpackedPPTX, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedPPTX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 potx2pptx_dir (const std::wstring &sFrom, const std::wstring &sTo, InputParams& params) - { - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) - { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); - if (NSFile::CFileBinary::Exists(sContentTypesPath)) - { - std::wstring sData; - if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) - { - std::wstring sCTFrom = _T("application/vnd.openxmlformats-officedocument.presentationml.template.main+xml"); - std::wstring sCTTo = _T("application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"); - - sData = string_replaceAll(sData, sCTFrom, sCTTo); - - if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true)) - { - return 0; - } - } - } - } - return AVS_FILEUTILS_ERROR_CONVERT; - } - // potm -> pptm - _UINT32 potm2pptm(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedPPTM = sTemp + FILE_SEPARATOR_STR + _T("pptm_unpacked"); + std::wstring sTempUnpackedPPTM = combinePath(convertParams.m_sTempDir, L"pptm_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedPPTM); - _UINT32 nRes = potm2pptm_dir(sFrom, sTempUnpackedPPTM, params); + _UINT32 nRes = potm2pptm_dir(sFrom, sTempUnpackedPPTM, params, convertParams); if (SUCCEEDED_X2T(nRes)) { COfficeUtils oCOfficeUtils(NULL); @@ -2356,12 +1909,12 @@ namespace NExtractTools } return AVS_FILEUTILS_ERROR_CONVERT; } - _UINT32 potm2pptm_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms) + _UINT32 potm2pptm_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { COfficeUtils oCOfficeUtils(NULL); if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); if (NSFile::CFileBinary::Exists(sContentTypesPath)) { std::wstring sData; @@ -2381,298 +1934,193 @@ namespace NExtractTools } return AVS_FILEUTILS_ERROR_CONVERT; } - // ppsm -> pptm - _UINT32 ppsm2pptm (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) + _UINT32 ppsm2pptm(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedPPTM = sTemp + FILE_SEPARATOR_STR + _T("pptm_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedPPTM); - - _UINT32 nRes = ppsm2pptm_dir(sFrom, sTempUnpackedPPTM, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedPPTM, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 ppsm2pptm_dir (const std::wstring &sFrom, const std::wstring &sTo, InputParams& params) - { - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) - { - std::wstring sContentTypesPath = sTo + FILE_SEPARATOR_STR + _T("[Content_Types].xml"); - if (NSFile::CFileBinary::Exists(sContentTypesPath)) - { - std::wstring sData; - if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) - { - std::wstring sCTFrom = _T("application/vnd.ms-powerpoint.slideshow.macroEnabled.main+xml"); - std::wstring sCTTo = _T("application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml"); - - sData = string_replaceAll(sData, sCTFrom, sCTTo); - - if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true)) - { - return 0; - } - } - } - } - return AVS_FILEUTILS_ERROR_CONVERT; - } - // ppt -> pptx - _UINT32 ppt2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultPptxDir = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); - - NSDirectory::CreateDirectory(sResultPptxDir); - - _UINT32 nRes = ppt2pptx_dir(sFrom, sResultPptxDir, sTemp, params); - - nRes = processEncryptionError(nRes, sFrom, params); + std::wstring sTempUnpackedPPTM = combinePath(convertParams.m_sTempDir, L"pptm_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedPPTM); + _UINT32 nRes = ppsm2pptm_dir(sFrom, sTempUnpackedPPTM, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - nRes = dir2zipMscrypt(sResultPptxDir, sTo, sTemp, params); - } - return nRes; - } - _UINT32 ppt2pptx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - COfficePPTFile pptFile; - - pptFile.put_TempDirectory(sTemp); - - params.m_bMacro = false; - long nRes = pptFile.LoadFromFile(sFrom, sTo, params.getPassword(), params.m_bMacro); - nRes = processEncryptionError(nRes, sFrom, params); - return nRes; - } - // ppt -> pptm - _UINT32 ppt2pptm(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultPptxDir = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); - - NSDirectory::CreateDirectory(sResultPptxDir); - - _UINT32 nRes = ppt2pptm_dir(sFrom, sResultPptxDir, sTemp, params); - - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultPptxDir, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 ppt2pptm_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - COfficePPTFile pptFile; - - pptFile.put_TempDirectory(sTemp); - - params.m_bMacro = true; - _UINT32 nRes = pptFile.LoadFromFile(sFrom, sTo, params.getPassword(), params.m_bMacro); - nRes = processEncryptionError(nRes, sFrom, params); - return nRes; - } - // ppt -> pptt - _UINT32 ppt2pptt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultPpttDir = sTemp + FILE_SEPARATOR_STR + _T("pptt_unpacked"); - std::wstring sTempPpttFileEditor = sResultPpttDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultPpttDir); - - _UINT32 nRes = ppt2pptt_bin(sFrom, sTempPpttFileEditor, sTemp, params); - - if (SUCCEEDED_X2T(nRes)) - { - // zip pptt folder to output file COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultPpttDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedPPTM, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; } return nRes; } - // ppt -> pptt_bin - _UINT32 ppt2pptt_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 ppsm2pptm_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - // unzip pptx to temp folder - std::wstring sTempUnpackedPPTX = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked") + FILE_SEPARATOR_STR; // leading slash is very important! - - NSDirectory::CreateDirectory(sTempUnpackedPPTX); - - COfficePPTFile pptFile; - - pptFile.put_TempDirectory(sTemp); - - params.m_bMacro = true; - _UINT32 nRes = pptFile.LoadFromFile(sFrom, sTempUnpackedPPTX, params.getPassword(), params.m_bMacro); - - nRes = processEncryptionError(nRes, sFrom, params); - if (SUCCEEDED_X2T(nRes)) + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) { - // convert unzipped pptx to unzipped pptt - CPPTXFile *pptx_file = new CPPTXFile(); - - if (pptx_file) + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); + if (NSFile::CFileBinary::Exists(sContentTypesPath)) { - pptx_file->SetFontDir(params.getFontPath()); - nRes = (S_OK == pptx_file->OpenFileToPPTY(sTempUnpackedPPTX, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + std::wstring sData; + if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) + { + std::wstring sCTFrom = _T("application/vnd.ms-powerpoint.slideshow.macroEnabled.main+xml"); + std::wstring sCTTo = _T("application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml"); - delete pptx_file; + sData = string_replaceAll(sData, sCTFrom, sCTTo); + + if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true)) + { + return 0; + } + } } - return nRes; } - return nRes; + return AVS_FILEUTILS_ERROR_CONVERT; } - - // pptx -> odp - _UINT32 pptx2odp(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 pptm2pptx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedPPTX = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); + std::wstring sTempUnpackedPPTX = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedPPTX); - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedPPTX, NULL, 0)) - { - return pptx_dir2odp(sTempUnpackedPPTX, sTo, sTemp, params, false); // add template ??? - } - return AVS_FILEUTILS_ERROR_CONVERT; - } - // pptx_dir -> odp - _UINT32 pptx_dir2odp(const std::wstring &sPptxDir, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, bool bTemplate) - { - std::wstring sTempUnpackedODP = sTemp + FILE_SEPARATOR_STR + _T("odp_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedODP); - - Oox2Odf::Converter converter(sPptxDir, _T("presentation"), params.getFontPath(), bTemplate, sTemp); - - _UINT32 nRes = 0; - try - { - std::wstring password = params.getSavePassword(); - std::wstring documentID = params.getDocumentID(); - - converter.convert(); - converter.write(sTempUnpackedODP, sTemp, password, documentID); - - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedODP, sTo, false, password.empty() ? Z_DEFLATED : 0)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - catch (...) - { - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - // rtf -> docx - _UINT32 rtf2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); - - NSDirectory::CreateDirectory(sResultDocxDir); - _UINT32 nRes = rtf2docx_dir(sFrom, sResultDocxDir, sTemp, params); - - if (SUCCEEDED_X2T(nRes)) - { - nRes = dir2zipMscrypt(sResultDocxDir, sTo, sTemp, params); - } - - return nRes; - } - _UINT32 rtf2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - RtfConvertationManager rtfConvert; - - rtfConvert.m_sTempFolder = sTemp; - rtfConvert.m_nUserLCID = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; - - return 0 == rtfConvert.ConvertRtfToOOX(sFrom, sTo) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - - // rtf -> doct - _UINT32 rtf2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - // Extract docx to temp directory - std::wstring sResultDoctDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - std::wstring sResultDoctFileEditor = sResultDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultDoctDir); - - _UINT32 nRes = rtf2doct_bin(sFrom, sResultDoctFileEditor, sTemp, params); - + _UINT32 nRes = pptm2pptx_dir(sFrom, sTempUnpackedPPTX, params, convertParams); if (SUCCEEDED_X2T(nRes)) { COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + if (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedPPTX, sTo, true)) + return 0; } + return AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 pptm2pptx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) + { + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); + if (NSFile::CFileBinary::Exists(sContentTypesPath)) + { + std::wstring sData; + if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) + { + std::wstring sCTFrom = _T("application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml"); + std::wstring sCTTo = _T("application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"); + sData = string_replaceAll(sData, sCTFrom, sCTTo); + sCTFrom = L""; + sData = string_replaceAll(sData, sCTFrom, L""); + + sCTFrom = L""; + sData = string_replaceAll(sData, sCTFrom, L""); + + if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true) == false) + { + return AVS_FILEUTILS_ERROR_CONVERT; + } + } + } + std::wstring sPresentationRelsPath = sTo + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"_rels" + FILE_SEPARATOR_STR + L"presentation.xml.rels"; + if (NSFile::CFileBinary::Exists(sPresentationRelsPath)) + { + std::wstring sData; + if (NSFile::CFileBinary::ReadAllTextUtf8(sPresentationRelsPath, sData)) + { + size_t pos = sData.find(L"vbaProject.bin"); + if (pos != std::wstring::npos) + { + size_t pos1 = sData.rfind(L"<", pos); + size_t pos2 = sData.find(L">", pos); + + if (pos1 != std::wstring::npos && pos2 != std::wstring::npos) + { + sData.erase(sData.begin() + pos1, sData.begin() + pos2 + 1); + } + } + if (NSFile::CFileBinary::SaveToFile(sPresentationRelsPath, sData, true) == false) + { + return AVS_FILEUTILS_ERROR_CONVERT; + } + } + } + std::wstring sVbaProjectPath = sTo + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"vbaProject.bin"; + NSFile::CFileBinary::Remove(sVbaProjectPath); + } + return 0; + } + _UINT32 potm2pptx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedPPTX = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedPPTX); + + _UINT32 nRes = potm2pptx_dir(sFrom, sTempUnpackedPPTX, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedPPTX, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } return nRes; } - - // rtf -> doct_bin - _UINT32 rtf2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 potm2pptx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); - - NSDirectory::CreateDirectory(sResultDocxDir); - RtfConvertationManager rtfConvert; - - rtfConvert.m_sTempFolder = sTemp; - rtfConvert.m_nUserLCID = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; - - if (rtfConvert.ConvertRtfToOOX(sFrom, sResultDocxDir) == 0) - { - BinDocxRW::CDocxSerializer m_oCDocxSerializer; - - m_oCDocxSerializer.setFontDir(params.getFontPath()); - - std::wstring sXmlOptions; - _UINT32 res = m_oCDocxSerializer.saveToFile(sTo, sResultDocxDir, sXmlOptions, sTemp) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - - return res; - } - return AVS_FILEUTILS_ERROR_CONVERT; - } - - // docx -> rtf - _UINT32 docx2rtf(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedDOCX = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedDOCX); - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedDOCX, NULL, 0)) + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTo, NULL, 0)) { - return docx_dir2rtf(sTempUnpackedDOCX, sTo, sTemp, params); + std::wstring sContentTypesPath = combinePath(sTo, L"[Content_Types].xml"); + if (NSFile::CFileBinary::Exists(sContentTypesPath)) + { + std::wstring sData; + if (NSFile::CFileBinary::ReadAllTextUtf8(sContentTypesPath, sData)) + { + std::wstring sCTFrom = _T("application/vnd.ms-powerpoint.template.macroEnabled.main+xml"); + std::wstring sCTTo = _T("application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"); + sData = string_replaceAll(sData, sCTFrom, sCTTo); + + sCTFrom = L""; + sData = string_replaceAll(sData, sCTFrom, L""); + + sCTFrom = L""; + sData = string_replaceAll(sData, sCTFrom, L""); + + if (NSFile::CFileBinary::SaveToFile(sContentTypesPath, sData, true) == false) + { + return AVS_FILEUTILS_ERROR_CONVERT; + } + } + } + std::wstring sPresentationRelsPath = sTo + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"_rels" + FILE_SEPARATOR_STR + L"presentation.xml.rels"; + if (NSFile::CFileBinary::Exists(sPresentationRelsPath)) + { + std::wstring sData; + if (NSFile::CFileBinary::ReadAllTextUtf8(sPresentationRelsPath, sData)) + { + size_t pos = sData.find(L"vbaProject.bin"); + if (pos != std::wstring::npos) + { + size_t pos1 = sData.rfind(L"<", pos); + size_t pos2 = sData.find(L">", pos); + + if (pos1 != std::wstring::npos && pos2 != std::wstring::npos) + { + sData.erase(sData.begin() + pos1, sData.begin() + pos2 + 1); + } + } + if (NSFile::CFileBinary::SaveToFile(sPresentationRelsPath, sData, true) == false) + { + return AVS_FILEUTILS_ERROR_CONVERT; + } + } + } + std::wstring sVbaProjectPath = sTo + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"vbaProject.bin"; + NSFile::CFileBinary::Remove(sVbaProjectPath); } - return AVS_FILEUTILS_ERROR_CONVERT; - } - _UINT32 docx_dir2rtf(const std::wstring &sDocxDir, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - // docx folder to rtf - RtfConvertationManager rtfConvert; - - rtfConvert.m_sTempFolder = sTemp; - rtfConvert.m_nUserLCID = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; - - if (rtfConvert.ConvertOOXToRtf(sTo, sDocxDir) == 0) - return 0; - return AVS_FILEUTILS_ERROR_CONVERT; + return 0; } - // doc -> docx - _UINT32 doc2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + // doc + _UINT32 doc2docx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); - + std::wstring sResultDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sResultDocxDir); - _UINT32 hRes = doc2docx_dir(sFrom, sResultDocxDir, sTemp, params); + _UINT32 hRes = doc2docx_dir(sFrom, sResultDocxDir, params, convertParams); if (SUCCEEDED_X2T(hRes)) { - hRes = dir2zipMscrypt(sResultDocxDir, sTo, sTemp, params); + hRes = dir2zipMscrypt(sResultDocxDir, sTo, params, convertParams); } else if (AVS_ERROR_DRM == hRes) { @@ -2688,11 +2136,11 @@ namespace NExtractTools } return hRes; } - _UINT32 doc2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 doc2docx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { COfficeDocFile docFile; - docFile.m_sTempFolder = sTemp; + docFile.m_sTempFolder = convertParams.m_sTempDir; docFile.m_nUserLCID = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; params.m_bMacro = false; @@ -2712,39 +2160,82 @@ namespace NExtractTools } return 0 == hRes ? 0 : AVS_FILEUTILS_ERROR_CONVERT; } - - // doc -> docm - - _UINT32 doc2docm (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) + _UINT32 doc2doct(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); + // Extract docx to temp directory + std::wstring sResultDoctDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + std::wstring sResultDoctFileEditor = combinePath(sResultDoctDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultDoctDir); - NSDirectory::CreateDirectory(sResultDocxDir); + _UINT32 nRes = doc2doct_bin(sFrom, sResultDoctFileEditor, params, convertParams); - _UINT32 hRes = doc2docm_dir(sFrom, sResultDocxDir, sTemp, params); - if (SUCCEEDED_X2T(hRes)) - { - COfficeUtils oCOfficeUtils(NULL); - hRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDocxDir, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - else if (AVS_ERROR_DRM == hRes) - { - if (!params.getDontSaveAdditional()) - { - copyOrigin(sFrom, *params.m_sFileTo); - } - return AVS_FILEUTILS_ERROR_CONVERT_DRM; - } - else if (AVS_ERROR_PASSWORD == hRes) - { - return AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; - } - return hRes; + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + + return nRes; } - _UINT32 doc2docm_dir (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) + _UINT32 doc2doct_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - COfficeDocFile docFile; - docFile.m_sTempFolder = sTemp; + std::wstring sResultDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); + NSDirectory::CreateDirectory(sResultDocxDir); + + COfficeDocFile docFile; + docFile.m_sTempFolder = convertParams.m_sTempDir; + docFile.m_nUserLCID = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; + + params.m_bMacro = true; + + _UINT32 nRes = docFile.LoadFromFile(sFrom, sResultDocxDir, params.getPassword(), params.m_bMacro); + + nRes = processEncryptionError(nRes, sFrom, params); + if (SUCCEEDED_X2T(nRes)) + { + BinDocxRW::CDocxSerializer m_oCDocxSerializer; + + m_oCDocxSerializer.setFontDir(params.getFontPath()); + + std::wstring xml_options = params.getXmlOptions(); + + nRes = m_oCDocxSerializer.saveToFile (sTo, sResultDocxDir, xml_options, convertParams.m_sTempDir) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 docx_dir2doc(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + return AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 doc2docm(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); + NSDirectory::CreateDirectory(sResultDocxDir); + + _UINT32 hRes = doc2docm_dir(sFrom, sResultDocxDir, params, convertParams); + if (SUCCEEDED_X2T(hRes)) + { + COfficeUtils oCOfficeUtils(NULL); + hRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDocxDir, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + else if (AVS_ERROR_DRM == hRes) + { + if (!params.getDontSaveAdditional()) + { + copyOrigin(sFrom, *params.m_sFileTo); + } + return AVS_FILEUTILS_ERROR_CONVERT_DRM; + } + else if (AVS_ERROR_PASSWORD == hRes) + { + return AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; + } + return hRes; + } + _UINT32 doc2docm_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + COfficeDocFile docFile; + docFile.m_sTempFolder = convertParams.m_sTempDir; docFile.m_nUserLCID = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; params.m_bMacro = true; @@ -2763,18 +2254,40 @@ namespace NExtractTools hRes = AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; } return hRes; - } + } - // doc -> doct - _UINT32 doc2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + // rtf + _UINT32 rtf2docx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); + NSDirectory::CreateDirectory(sResultDocxDir); + + _UINT32 nRes = rtf2docx_dir(sFrom, sResultDocxDir, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + nRes = dir2zipMscrypt(sResultDocxDir, sTo, params, convertParams); + } + + return nRes; + } + _UINT32 rtf2docx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + RtfConvertationManager rtfConvert; + + rtfConvert.m_sTempFolder = convertParams.m_sTempDir; + rtfConvert.m_nUserLCID = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; + + return 0 == rtfConvert.ConvertRtfToOOX(sFrom, sTo) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 rtf2doct(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { // Extract docx to temp directory - std::wstring sResultDoctDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - std::wstring sResultDoctFileEditor = sResultDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - + std::wstring sResultDoctDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + std::wstring sResultDoctFileEditor = combinePath(sResultDoctDir, L"Editor.bin"); NSDirectory::CreateDirectory(sResultDoctDir); - _UINT32 nRes = doc2doct_bin(sFrom, sResultDoctFileEditor, sTemp, params); + _UINT32 nRes = rtf2doct_bin(sFrom, sResultDoctFileEditor, params, convertParams); if (SUCCEEDED_X2T(nRes)) { @@ -2784,47 +2297,56 @@ namespace NExtractTools return nRes; } - - // doc -> doct_bin - _UINT32 doc2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 rtf2doct_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); - + std::wstring sResultDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sResultDocxDir); - COfficeDocFile docFile; - docFile.m_sTempFolder = sTemp; - docFile.m_nUserLCID = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; + RtfConvertationManager rtfConvert; + rtfConvert.m_sTempFolder = convertParams.m_sTempDir; + rtfConvert.m_nUserLCID = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; - params.m_bMacro = true; - - _UINT32 nRes = docFile.LoadFromFile(sFrom, sResultDocxDir, params.getPassword(), params.m_bMacro); - - nRes = processEncryptionError(nRes, sFrom, params); - if (SUCCEEDED_X2T(nRes)) + if (rtfConvert.ConvertRtfToOOX(sFrom, sResultDocxDir) == 0) { BinDocxRW::CDocxSerializer m_oCDocxSerializer; m_oCDocxSerializer.setFontDir(params.getFontPath()); - std::wstring xml_options = params.getXmlOptions(); + std::wstring sXmlOptions; + _UINT32 res = m_oCDocxSerializer.saveToFile(sTo, sResultDocxDir, sXmlOptions, convertParams.m_sTempDir) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - nRes = m_oCDocxSerializer.saveToFile (sTo, sResultDocxDir, xml_options, sTemp) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 docx_dir2doc(const std::wstring &sDocxDir, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { + return res; + } return AVS_FILEUTILS_ERROR_CONVERT; } + _UINT32 docx2rtf(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedDOCX = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedDOCX); - // doct -> rtf - _UINT32 doct2rtf(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms) + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedDOCX, NULL, 0)) + { + return docx_dir2rtf(sTempUnpackedDOCX, sTo, params, convertParams); + } + return AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 docx_dir2rtf(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + // docx folder to rtf + RtfConvertationManager rtfConvert; + rtfConvert.m_sTempFolder = convertParams.m_sTempDir; + rtfConvert.m_nUserLCID = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; + + if (rtfConvert.ConvertOOXToRtf(sTo, sFrom) == 0) + return 0; + return AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 doct2rtf(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { // Extract docx to temp directory - std::wstring sTempUnpackedDOCT = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - std::wstring sTempDoctFileEditor = sTempUnpackedDOCT + FILE_SEPARATOR_STR + _T("Editor.bin"); - + std::wstring sTempUnpackedDOCT = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + std::wstring sTempDoctFileEditor = combinePath(sTempUnpackedDOCT, L"Editor.bin"); NSDirectory::CreateDirectory(sTempUnpackedDOCT); // unzip doct to folder @@ -2832,22 +2354,19 @@ namespace NExtractTools if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedDOCT, NULL, 0)) return AVS_FILEUTILS_ERROR_CONVERT; - return doct_bin2rtf(sTempDoctFileEditor, sTo, sTemp, sThemeDir, params); + return doct_bin2rtf(sTempDoctFileEditor, sTo, params, convertParams); } - - // bin -> rtf - _UINT32 doct_bin2rtf(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms) + _UINT32 doct_bin2rtf(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { _UINT32 nRes = 0; - std::wstring sResultDocxDir = sTemp + FILE_SEPARATOR_STR + L"docx_unpacked"; - + std::wstring sResultDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sResultDocxDir); std::wstring sTargetBin; if (params.getFromChanges()) { params.setFromChanges(false); - nRes = apply_changes(sFrom, _T(""), NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, sThemeDir, sTargetBin, params); + nRes = apply_changes(sFrom, L"", NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, sTargetBin, params, convertParams); } else sTargetBin = sFrom; @@ -2871,7 +2390,7 @@ namespace NExtractTools // docx folder to rtf RtfConvertationManager rtfConvert; - rtfConvert.m_sTempFolder = sTemp; + rtfConvert.m_sTempFolder = convertParams.m_sTempDir; rtfConvert.m_nUserLCID = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; nRes = rtfConvert.ConvertOOXToRtf(sTo, sResultDocxDir); @@ -2882,50 +2401,44 @@ namespace NExtractTools NSFile::CFileBinary::Remove(sTargetBin); return nRes; } - // txt -> docx - _UINT32 txt2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); - NSDirectory::CreateDirectory(sResultDocxDir); - _UINT32 nRes = txt2docx_dir(sFrom, sResultDocxDir, sTemp, params); - if (SUCCEEDED_X2T(nRes)) - { - nRes = dir2zipMscrypt(sResultDocxDir, sTo, sTemp, params); - } - return nRes; + // txt + _UINT32 txt2docx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); + NSDirectory::CreateDirectory(sResultDocxDir); + + _UINT32 nRes = txt2docx_dir(sFrom, sResultDocxDir, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + nRes = dir2zipMscrypt(sResultDocxDir, sTo, params, convertParams); + } + return nRes; } - _UINT32 txt2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 txt2docx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { CTxtXmlFile txtFile; - std::wstring xml_options = params.getXmlOptions(); - return txtFile.txt_LoadFromFile(sFrom, sTo, xml_options); } - // txt -> doct - _UINT32 txt2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 txt2doct(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultDoctDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - std::wstring sResultDoctFileEditor = sResultDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - + std::wstring sResultDoctDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + std::wstring sResultDoctFileEditor = combinePath(sResultDoctDir, L"Editor.bin"); NSDirectory::CreateDirectory(sResultDoctDir); - _UINT32 nRes = txt2doct_bin(sFrom, sResultDoctFileEditor, sTemp, params); + _UINT32 nRes = txt2doct_bin(sFrom, sResultDoctFileEditor, params, convertParams); if (SUCCEEDED_X2T(nRes)) { COfficeUtils oCOfficeUtils(NULL); nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; } - return nRes; } - - // txt -> doct_bin - _UINT32 txt2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 txt2doct_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); + std::wstring sResultDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sResultDocxDir); CTxtXmlFile txtFile; @@ -2934,37 +2447,593 @@ namespace NExtractTools if (SUCCEEDED_X2T(nRes)) { BinDocxRW::CDocxSerializer m_oCDocxSerializer; - nRes = m_oCDocxSerializer.saveToFile (sTo, sResultDocxDir, params.getXmlOptions(), sTemp) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + nRes = m_oCDocxSerializer.saveToFile(sTo, sResultDocxDir, params.getXmlOptions(), convertParams.m_sTempDir) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; } return nRes; } - _UINT32 docx2txt(const std::wstring &sDocxDir, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 docx2txt(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedDOCX = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); + std::wstring sTempUnpackedDOCX = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedDOCX); COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sDocxDir, sTempUnpackedDOCX, NULL, 0)) + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedDOCX, NULL, 0)) { - return docx_dir2txt(sTempUnpackedDOCX, sTo, sTemp, params); + return docx_dir2txt(sTempUnpackedDOCX, sTo, params, convertParams); } return AVS_FILEUTILS_ERROR_CONVERT; } - _UINT32 docx_dir2txt(const std::wstring &sDocxDir, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 docx_dir2txt(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { CTxtXmlFile txtFile; - - return txtFile.txt_SaveToFile(sTo, sDocxDir, params.getXmlOptions()); + return txtFile.txt_SaveToFile(sTo, sFrom, params.getXmlOptions()); } - // odf - _UINT32 odf2oot(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultDoctDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - std::wstring sResultDoctFileEditor = sResultDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); + // html + _UINT32 html2doct_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); + NSDirectory::CreateDirectory(sDocxDir); + _UINT32 nRes = html2docx_dir(sFrom, sDocxDir, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + nRes = (S_OK == docx_dir2doct_bin(sDocxDir, sTo, params, convertParams)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 html_zip2doct_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); + NSDirectory::CreateDirectory(sDocxDir); + _UINT32 nRes = html_zip2docx_dir(sFrom, sDocxDir, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + nRes = (S_OK == docx_dir2doct_bin(sDocxDir, sTo, params, convertParams)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 html2doct(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultDoctDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + std::wstring sResultDoctFileEditor = combinePath(sResultDoctDir, L"Editor.bin"); NSDirectory::CreateDirectory(sResultDoctDir); - _UINT32 nRes = odf2oot_bin(sFrom, sResultDoctFileEditor, sTemp, params); + _UINT32 nRes = html2doct_bin(sFrom, sResultDoctFileEditor, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 html_zip2doct(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultDoctDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + std::wstring sResultDoctFileEditor = combinePath(sResultDoctDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultDoctDir); + + _UINT32 nRes = html_zip2doct_bin(sFrom, sResultDoctFileEditor, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 html2docx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); + NSDirectory::CreateDirectory(sDocxDir); + + _UINT32 nRes = html2docx_dir(sFrom, sDocxDir, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + nRes = dir2zipMscrypt(sDocxDir, sTo, params, convertParams); + } + return nRes; + } + _UINT32 html_zip2docx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); + NSDirectory::CreateDirectory(sDocxDir); + + _UINT32 nRes = html_zip2docx_dir(sFrom, sDocxDir, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sDocxDir, sTo, true)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 html_array2docx_dir(const std::vector &arFiles, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + CHtmlFile2 oFile; + oFile.SetTmpDirectory(convertParams.m_sTempDir); + return (S_OK == oFile.OpenBatchHtml(arFiles, sTo)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 html2docx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::vector arFiles; + arFiles.push_back(sFrom); + return html_array2docx_dir(arFiles, sTo, params, convertParams); + } + _UINT32 html_zip2docx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::vector arFiles; + + POLE::Storage storage(sFrom.c_str()); + if (storage.open()) + { + POLE::Stream stream(&storage, L"WordDocument"); + + POLE::uint64 size_stream = stream.size(); + unsigned char *buffer = new unsigned char[size_stream]; + if (buffer) + { + stream.read(buffer, size_stream); + std::wstring sTempHtml = combinePath(convertParams.m_sTempDir, L"tempHtml.html"); + + NSFile::CFileBinary file; + + if (file.CreateFileW(sTempHtml)) + { + file.WriteFile(buffer, size_stream); + file.CloseFile(); + + arFiles.push_back(sTempHtml); + } + delete[] buffer; + } + } + else // in zip + { + } + return 0 == html_array2docx_dir(arFiles, sTo, params, convertParams) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + // mht + _UINT32 mht2docx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + CHtmlFile2 oFile; + oFile.SetTmpDirectory(convertParams.m_sTempDir); + return (S_OK == oFile.OpenMht(sFrom, sTo)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + // epub + _UINT32 epub2docx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + CEpubFile oFile; + oFile.SetTempDirectory(convertParams.m_sTempDir); + return (S_OK == oFile.Convert(sFrom, sTo, false)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 fb2docx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + CFb2File fb2File; + fb2File.SetTmpDirectory(convertParams.m_sTempDir); + return S_OK == fb2File.Open(sFrom, sTo) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 fb2docx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedDOCX = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedDOCX); + + _UINT32 nRes = fb2docx_dir(sFrom, sTempUnpackedDOCX, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + nRes = dir2zipMscrypt(sTempUnpackedDOCX, sTo, params, convertParams); + } + return nRes; + } + + // doct_bin => html + _UINT32 doct_bin2html_internal(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + NSDoctRenderer::DoctRendererFormat::FormatFile eToType = NSDoctRenderer::DoctRendererFormat::FormatFile::HTML; + std::wstring sFileFromDir = NSDirectory::GetFolderPath(sFrom); + std::wstring sImagesDirectory = combinePath(sFileFromDir, L"media"); + std::wstring sHtmlFile = combinePath(convertParams.m_sTempDir, L"index.html"); + if (!NSDirectory::Exists(sImagesDirectory)) + NSDirectory::CreateDirectory(sImagesDirectory); + + NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : L""); + std::wstring sXml = getDoctXml(NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, + NSDoctRenderer::DoctRendererFormat::FormatFile::HTML, + sFrom, sHtmlFile, sImagesDirectory, convertParams.m_sThemesDir, -1, L"", params); + + std::wstring sResult; + oDoctRenderer.Execute(sXml, sResult); + + if (sResult.find(L"error") != std::wstring::npos) + { + std::wcerr << L"DoctRenderer:" << sResult << std::endl; + return AVS_FILEUTILS_ERROR_CONVERT; + } + return 0; + } + + // doct_bin -> epub + _UINT32 doct_bin2epub(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + _UINT32 nRes = doct_bin2html_internal(sFrom, sTo, params, convertParams); + if (0 != nRes) + return nRes; + + std::wstring sHtmlFile = combinePath(convertParams.m_sTempDir, L"index.html"); + + CEpubFile oFile; + std::wstring sEpubTemp = combinePath(convertParams.m_sTempDir, L"tmp"); + NSDirectory::CreateDirectory(sEpubTemp); + oFile.SetTempDirectory(sEpubTemp); + + if (S_FALSE == oFile.FromHtml(sHtmlFile, sTo, params.m_sTitle ? *params.m_sTitle : L"")) + nRes = AVS_FILEUTILS_ERROR_CONVERT; + + return nRes; + } + // doct_bin -> fb2 + _UINT32 doct_bin2fb(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + _UINT32 nRes = doct_bin2html_internal(sFrom, sTo, params, convertParams); + if (0 != nRes) + return nRes; + + std::wstring sHtmlFile = combinePath(convertParams.m_sTempDir, L"index.html"); + + CFb2File fb2File; + fb2File.SetTmpDirectory(convertParams.m_sTempDir); + if (S_FALSE == fb2File.FromHtml(sHtmlFile, sTo, params.m_sTitle ? *params.m_sTitle : L"")) + nRes = AVS_FILEUTILS_ERROR_CONVERT; + + return nRes; + } + // doct_bin -> html + _UINT32 doct_bin2html(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + _UINT32 nRes = doct_bin2html_internal(sFrom, sTo, params, convertParams); + if (0 != nRes) + return nRes; + + std::wstring sHtmlFile = combinePath(convertParams.m_sTempDir, L"index.html"); + + if (!NSFile::CFileBinary::Copy(sHtmlFile, sTo)) + nRes = AVS_FILEUTILS_ERROR_CONVERT; + + return nRes; + } + // doct_bin -> html_zip + _UINT32 doct_bin2html_zip(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + _UINT32 nRes = doct_bin2html_internal(sFrom, sTo, params, convertParams); + if (0 != nRes) + return nRes; + + std::wstring sHtmlFile = combinePath(convertParams.m_sTempDir, L"index.html"); + + COfficeUtils oZip; + if (S_FALSE == oZip.CompressFileOrDirectory(sHtmlFile, sTo)) + nRes = AVS_FILEUTILS_ERROR_CONVERT; + + return nRes; + } + + // ppt + _UINT32 ppt2pptx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultPptxDir = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); + NSDirectory::CreateDirectory(sResultPptxDir); + + _UINT32 nRes = ppt2pptx_dir(sFrom, sResultPptxDir, params, convertParams); + nRes = processEncryptionError(nRes, sFrom, params); + + if (SUCCEEDED_X2T(nRes)) + { + nRes = dir2zipMscrypt(sResultPptxDir, sTo, params, convertParams); + } + return nRes; + } + _UINT32 ppt2pptx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + COfficePPTFile pptFile; + pptFile.put_TempDirectory(convertParams.m_sTempDir); + + params.m_bMacro = false; + long nRes = pptFile.LoadFromFile(sFrom, sTo, params.getPassword(), params.m_bMacro); + nRes = processEncryptionError(nRes, sFrom, params); + return nRes; + } + _UINT32 ppt2pptt_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + // unzip pptx to temp folder + std::wstring sTempUnpackedPPTX = combinePath(convertParams.m_sTempDir, L"pptx_unpacked") + FILE_SEPARATOR_STR; // leading slash is very important! + NSDirectory::CreateDirectory(sTempUnpackedPPTX); + + COfficePPTFile pptFile; + pptFile.put_TempDirectory(convertParams.m_sTempDir); + + params.m_bMacro = true; + _UINT32 nRes = pptFile.LoadFromFile(sFrom, sTempUnpackedPPTX, params.getPassword(), params.m_bMacro); + + nRes = processEncryptionError(nRes, sFrom, params); + if (SUCCEEDED_X2T(nRes)) + { + // convert unzipped pptx to unzipped pptt + CPPTXFile *pptx_file = new CPPTXFile(); + + if (pptx_file) + { + pptx_file->SetFontDir(params.getFontPath()); + nRes = (S_OK == pptx_file->OpenFileToPPTY(sTempUnpackedPPTX, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + + delete pptx_file; + } + return nRes; + } + return nRes; + } + _UINT32 ppt2pptt(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultPpttDir = combinePath(convertParams.m_sTempDir, L"pptt_unpacked"); + std::wstring sTempPpttFileEditor = combinePath(sResultPpttDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultPpttDir); + + _UINT32 nRes = ppt2pptt_bin(sFrom, sTempPpttFileEditor, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + // zip pptt folder to output file + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultPpttDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 ppt2pptm(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultPptxDir = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); + NSDirectory::CreateDirectory(sResultPptxDir); + + _UINT32 nRes = ppt2pptm_dir(sFrom, sResultPptxDir, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultPptxDir, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 ppt2pptm_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + COfficePPTFile pptFile; + pptFile.put_TempDirectory(convertParams.m_sTempDir); + + params.m_bMacro = true; + _UINT32 nRes = pptFile.LoadFromFile(sFrom, sTo, params.getPassword(), params.m_bMacro); + nRes = processEncryptionError(nRes, sFrom, params); + return nRes; + } + + // csv + _UINT32 csv2xlst(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sCSV = sFrom; + std::wstring sResultXlstDir = combinePath(convertParams.m_sTempDir, L"xlst_unpacked"); + std::wstring sResultXlstFileEditor = combinePath(sResultXlstDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultXlstDir); + + COfficeUtils oCOfficeUtils(NULL); + // Save to file (from temp dir) + BinXlsxRW::CXlsxSerializer oCXlsxSerializer; + + oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); + oCXlsxSerializer.setFontDir(params.getFontPath()); + + if (!params.m_nFormatFrom) + params.m_nFormatFrom = new int(AVS_OFFICESTUDIO_FILE_UNKNOWN); + if (AVS_OFFICESTUDIO_FILE_UNKNOWN == *params.m_nFormatFrom) + *params.m_nFormatFrom = AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV; + + _UINT32 nRes = oCXlsxSerializer.saveToFile(sResultXlstFileEditor, sCSV, params.getXmlOptions()); + + if (SUCCEEDED_X2T(nRes)) + { + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultXlstDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + + return nRes; + } + _UINT32 csv2xlsx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultXlsxDir = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); + NSDirectory::CreateDirectory(sResultXlsxDir); + + _UINT32 nRes = csv2xlsx_dir(sFrom, sResultXlsxDir, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + nRes = dir2zipMscrypt(sResultXlsxDir, sTo, params, convertParams); + } + return nRes; + } + _UINT32 csv2xlsx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + OOX::Spreadsheet::CXlsx oXlsx; + + BYTE fileType; + UINT nCodePage; + std::wstring sDelimiter; + BYTE saveFileType; + SerializeCommon::ReadFileType(params.getXmlOptions(), fileType, nCodePage, sDelimiter, saveFileType); + + CSVReader csvReader; + _UINT32 nRes = csvReader.Read(sFrom, oXlsx, nCodePage, sDelimiter); + + oXlsx.PrepareToWrite(); + + OOX::CContentTypes oContentTypes; + nRes = oXlsx.Write(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; + + return nRes; + } + _UINT32 csv2xlst_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + // Save to file (from temp dir) + BinXlsxRW::CXlsxSerializer oCXlsxSerializer; + + oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); + oCXlsxSerializer.setFontDir(params.getFontPath()); + + return oCXlsxSerializer.saveToFile(sTo, sFrom, params.getXmlOptions()); + } + _UINT32 xlst2csv(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sCSV = sTo; + std::wstring sTempUnpackedXLST = combinePath(convertParams.m_sTempDir, L"xlst_unpacked"); + std::wstring sTempXlstFileEditor = combinePath(sTempUnpackedXLST, L"Editor.bin"); + NSDirectory::CreateDirectory(sTempUnpackedXLST); + + // unzip xlst to folder + COfficeUtils oCOfficeUtils(NULL); + if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLST, NULL, 0)) + return AVS_FILEUTILS_ERROR_CONVERT; + + BinXlsxRW::CXlsxSerializer oCXlsxSerializer; + + oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); + oCXlsxSerializer.setFontDir(params.getFontPath()); + oCXlsxSerializer.setTempDir(convertParams.m_sTempDir); + + std::wstring sMediaPath; + std::wstring sEmbedPath; + + params.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV); + + return oCXlsxSerializer.loadFromFile(sTempXlstFileEditor, sCSV, params.getXmlOptions(), sMediaPath, sEmbedPath); + } + _UINT32 xlsx_dir2csv(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultXlstDir = combinePath(convertParams.m_sTempDir, L"xlst_unpacked"); + std::wstring sResultXlstFileEditor = combinePath(sResultXlstDir, L"Editor.bin"); + + NSDirectory::CreateDirectory(sResultXlstDir); + + BinXlsxRW::CXlsxSerializer oCXlsxSerializer; + + oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); + oCXlsxSerializer.setFontDir(params.getFontPath()); + + std::wstring sXMLOptions = _T(""); + _UINT32 nRes = oCXlsxSerializer.saveToFile(sResultXlstFileEditor, sFrom, sXMLOptions); + if (SUCCEEDED_X2T(nRes)) + { + std::wstring sMediaPath; + std::wstring sEmbedPath; + + sXMLOptions = _T(""); + + nRes = oCXlsxSerializer.loadFromFile(sResultXlstFileEditor, sTo, sXMLOptions, sMediaPath, sEmbedPath); + } + + return nRes; + } + _UINT32 xlsx2csv(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedXLSX = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedXLSX); + + COfficeUtils oCOfficeUtils(NULL); + if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLSX, NULL, 0)) + return AVS_FILEUTILS_ERROR_CONVERT; + + return xlsx_dir2csv(sTempUnpackedXLSX, sTo, params, convertParams); + } + _UINT32 xlst_bin2csv(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + _UINT32 nRes = 0; + + std::wstring sTargetBin; + if (params.getFromChanges()) + { + params.setFromChanges(false); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::XLST, sTargetBin, params, convertParams); + } + else + sTargetBin = sFrom; + + if (SUCCEEDED_X2T(nRes)) + { + BinXlsxRW::CXlsxSerializer oCXlsxSerializer; + + oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); + oCXlsxSerializer.setFontDir(params.getFontPath()); + + std::wstring sResultCsvDir = combinePath(convertParams.m_sTempDir, L"csv_unpacked"); + + NSDirectory::CreateDirectory(sResultCsvDir); + std::wstring sMediaPath; // will be filled by 'CreateXlsxFolders' method + std::wstring sEmbedPath; // will be filled by 'CreateXlsxFolders' method + std::wstring sXmlOptions = params.getXmlOptions(); + + oCXlsxSerializer.CreateXlsxFolders(sXmlOptions, sResultCsvDir, sMediaPath, sEmbedPath); + + nRes = oCXlsxSerializer.loadFromFile(sTargetBin, sTo, sXmlOptions, sMediaPath, sEmbedPath); + } + return nRes; + } + + // xls + _UINT32 xls2xlsx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultDocxDir = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); + NSDirectory::CreateDirectory(sResultDocxDir); + + _UINT32 hRes = xls2xlsx_dir(sFrom, sResultDocxDir, params, convertParams); + + if (SUCCEEDED_X2T(hRes)) + { + hRes = dir2zipMscrypt(sResultDocxDir, sTo, params, convertParams); + } + return hRes; + } + _UINT32 xls2xlsx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + params.m_bMacro = false; + int lcid = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; + + _UINT32 nRes = ConvertXls2Xlsx(sFrom, sTo, params.getPassword(), params.getFontPath(), convertParams.m_sTempDir, lcid, params.m_bMacro); + + nRes = processEncryptionError(nRes, sFrom, params); + return nRes; + } + _UINT32 xls2xlsm(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultXlsmDir = combinePath(convertParams.m_sTempDir, L"xlsm_unpacked"); + NSDirectory::CreateDirectory(sResultXlsmDir); + + _UINT32 nRes = xls2xlsm_dir(sFrom, sResultXlsmDir, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultXlsmDir, sTo, true)) + return 0; + } + return nRes; + } + _UINT32 xls2xlsm_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + params.m_bMacro = true; + + int lcid = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; + + _UINT32 nRes = ConvertXls2Xlsx(sFrom, sTo, params.getPassword(), params.getFontPath(), convertParams.m_sTempDir, lcid, params.m_bMacro); + + nRes = processEncryptionError(nRes, sFrom, params); + return nRes; + } + _UINT32 xls2xlst(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + // Extract xlsx to temp directory + std::wstring sResultDoctDir = combinePath(convertParams.m_sTempDir, L"xlst_unpacked"); + std::wstring sResultDoctFileEditor = combinePath(sResultDoctDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultDoctDir); + + _UINT32 nRes = xls2xlst_bin(sFrom, sResultDoctFileEditor, params, convertParams); if (SUCCEEDED_X2T(nRes)) { @@ -2974,11 +3043,118 @@ namespace NExtractTools return nRes; } - - _UINT32 odf2oot_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 xls2xlst_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedOdf = sTemp + FILE_SEPARATOR_STR + _T("odf_unpacked"); - std::wstring sTempUnpackedOox = sTemp + FILE_SEPARATOR_STR + _T("oox_unpacked"); + std::wstring sResultXlsxDir = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); + NSDirectory::CreateDirectory(sResultXlsxDir); + + params.m_bMacro = true; + + int lcid = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; + + _UINT32 nRes = ConvertXls2Xlsx(sFrom, sResultXlsxDir, params.getPassword(), params.getFontPath(), convertParams.m_sTempDir, lcid, params.m_bMacro); + + nRes = processEncryptionError(nRes, sFrom, params); + if (SUCCEEDED_X2T(nRes)) + { + BinXlsxRW::CXlsxSerializer oCXlsxSerializer; + + oCXlsxSerializer.setFontDir(params.getFontPath()); + + return oCXlsxSerializer.saveToFile(sTo, sResultXlsxDir, params.getXmlOptions()); + } + return nRes; + } + + // xml => xlsx + _UINT32 xml2xlsx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultXlsxDir = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); + NSDirectory::CreateDirectory(sResultXlsxDir); + + _UINT32 nRes = xml2xlsx_dir(sFrom, sResultXlsxDir, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + nRes = dir2zipMscrypt(sResultXlsxDir, sTo, params, convertParams); + } + return nRes; + } + _UINT32 xml2xlsx_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + OOX::Spreadsheet::CXlsx oXlsx; + + XMLReader reader = {}; + + reader.Read2(sFrom, oXlsx); + + oXlsx.PrepareToWrite(); + + OOX::CContentTypes oContentTypes; + auto nRes = oXlsx.Write(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; + + return nRes; + } + + // odf + _UINT32 odf2oox(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedOox = combinePath(convertParams.m_sTempDir, L"oox_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedOox); + + _UINT32 nRes = odf2oox_dir(sFrom, sTempUnpackedOox, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + nRes = dir2zipMscrypt(sTempUnpackedOox, sTo, params, convertParams); + } + else + { + nRes = AVS_FILEUTILS_ERROR_CONVERT; + if (create_if_empty(sFrom, sTo, L"")) + nRes = 0; + } + return nRes; + } + _UINT32 odf2oox_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + _UINT32 nRes = 0; + + std::wstring sTempUnpackedOdf = combinePath(convertParams.m_sTempDir, L"odf_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedOdf); + + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedOdf, NULL, 0)) + { + nRes = ConvertODF2OOXml(sTempUnpackedOdf, sTo, params.getFontPath(), convertParams.m_sTempDir, params.getPassword()); + nRes = processEncryptionError(nRes, sFrom, params); + } + else + { + nRes = AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + _UINT32 odf2oot(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sResultDoctDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + std::wstring sResultDoctFileEditor = combinePath(sResultDoctDir, L"Editor.bin"); + NSDirectory::CreateDirectory(sResultDoctDir); + + _UINT32 nRes = odf2oot_bin(sFrom, sResultDoctFileEditor, params, convertParams); + + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + + return nRes; + } + _UINT32 odf2oot_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedOdf = combinePath(convertParams.m_sTempDir, L"odf_unpacked"); + std::wstring sTempUnpackedOox = combinePath(convertParams.m_sTempDir, L"oox_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedOdf); @@ -2989,7 +3165,7 @@ namespace NExtractTools { NSDirectory::CreateDirectory(sTempUnpackedOox); - nRes = ConvertODF2OOXml(sTempUnpackedOdf, sTempUnpackedOox, params.getFontPath(), sTemp, params.getPassword()); + nRes = ConvertODF2OOXml(sTempUnpackedOdf, sTempUnpackedOox, params.getFontPath(), convertParams.m_sTempDir, params.getPassword()); nRes = processEncryptionError(nRes, sFrom, params); if (SUCCEEDED_X2T(nRes)) { @@ -3006,7 +3182,7 @@ namespace NExtractTools case AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM: case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF: { - return docx_dir2doct_bin(sTempUnpackedOox, sTo, sTemp, params, L""); + return docx_dir2doct_bin(sTempUnpackedOox, sTo, params, convertParams); } break; case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX: @@ -3016,7 +3192,8 @@ namespace NExtractTools case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB: { const std::wstring &sXmlOptions = params.getXmlOptions(); - return xlsx_dir2xlst_bin(sTempUnpackedOox, sTo, params, false, L""); + convertParams.m_bTempIsXmlOptions = false; + return xlsx_dir2xlst_bin(sTempUnpackedOox, sTo, params, convertParams); } break; case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX: @@ -3026,7 +3203,7 @@ namespace NExtractTools case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM: case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM: { - return pptx_dir2pptt_bin(sTempUnpackedOox, sTo, sTemp, params, L""); + return pptx_dir2pptt_bin(sTempUnpackedOox, sTo, params, convertParams); } break; default: @@ -3046,70 +3223,34 @@ namespace NExtractTools } return nRes; } - _UINT32 otf2odf(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedOdf = sTemp + FILE_SEPARATOR_STR + _T("odf_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedOdf); - COfficeUtils oCOfficeUtils(NULL); - if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedOdf, NULL, 0)) - return AVS_FILEUTILS_ERROR_CONVERT; - - _UINT32 nRes = ConvertOTF2ODF(sTempUnpackedOdf); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedOdf, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 odf2oox(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 odf_flat2oox(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedOox = sTemp + FILE_SEPARATOR_STR + _T("oox_unpacked"); + std::wstring sTempUnpackedOox = combinePath(convertParams.m_sTempDir, L"oox_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedOox); - _UINT32 nRes = odf2oox_dir(sFrom, sTempUnpackedOox, sTemp, params); + _UINT32 nRes = odf_flat2oox_dir(sFrom, sTempUnpackedOox, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - nRes = dir2zipMscrypt(sTempUnpackedOox, sTo, sTemp, params); - } - else - { - nRes = AVS_FILEUTILS_ERROR_CONVERT; - if (create_if_empty(sFrom, sTo, L"")) - nRes = 0; + nRes = dir2zipMscrypt(sTempUnpackedOox, sTo, params, convertParams); } + return nRes; } - _UINT32 odf2oox_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 odf_flat2oox_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - _UINT32 nRes = 0; - - std::wstring sTempUnpackedOdf = sTemp + FILE_SEPARATOR_STR + _T("odf_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedOdf); - - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedOdf, NULL, 0)) - { - nRes = ConvertODF2OOXml(sTempUnpackedOdf, sTo, params.getFontPath(), sTemp, params.getPassword()); - nRes = processEncryptionError(nRes, sFrom, params); - } - else - { - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } + _UINT32 nRes = ConvertODF2OOXml(sFrom, sTo, params.getFontPath(), convertParams.m_sTempDir, params.getPassword()); + nRes = processEncryptionError(nRes, sFrom, params); return nRes; } - // odf flat - _UINT32 odf_flat2oot(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 odf_flat2oot(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultDoctDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - std::wstring sResultDoctFileEditor = sResultDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - + std::wstring sResultDoctDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + std::wstring sResultDoctFileEditor = combinePath(sResultDoctDir, L"Editor.bin"); NSDirectory::CreateDirectory(sResultDoctDir); - _UINT32 nRes = odf_flat2oot_bin(sFrom, sResultDoctFileEditor, sTemp, params); + _UINT32 nRes = odf_flat2oot_bin(sFrom, sResultDoctFileEditor, params, convertParams); if (SUCCEEDED_X2T(nRes)) { @@ -3119,14 +3260,12 @@ namespace NExtractTools return nRes; } - - _UINT32 odf_flat2oot_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 odf_flat2oot_bin(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedOox = sTemp + FILE_SEPARATOR_STR + _T("oox_unpacked"); - + std::wstring sTempUnpackedOox = combinePath(convertParams.m_sTempDir, L"oox_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedOox); - _UINT32 nRes = ConvertODF2OOXml(sFrom, sTempUnpackedOox, params.getFontPath(), sTemp, params.getPassword()); + _UINT32 nRes = ConvertODF2OOXml(sFrom, sTempUnpackedOox, params.getFontPath(), convertParams.m_sTempDir, params.getPassword()); nRes = processEncryptionError(nRes, sFrom, params); if (SUCCEEDED_X2T(nRes)) { @@ -3134,70 +3273,32 @@ namespace NExtractTools m_oCDocxSerializer.setFontDir(params.getFontPath()); - nRes = m_oCDocxSerializer.saveToFile(sTo, sTempUnpackedOox, params.getXmlOptions(), sTemp) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + nRes = m_oCDocxSerializer.saveToFile(sTo, sTempUnpackedOox, params.getXmlOptions(), convertParams.m_sTempDir) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; } return nRes; } - _UINT32 odf_flat2oox(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedOox = sTemp + FILE_SEPARATOR_STR + _T("oox_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedOox); - _UINT32 nRes = odf_flat2oox_dir(sFrom, sTempUnpackedOox, sTemp, params); - - if (SUCCEEDED_X2T(nRes)) - { - nRes = dir2zipMscrypt(sTempUnpackedOox, sTo, sTemp, params); - } - - return nRes; - } - _UINT32 odf_flat2oox_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + // docx => odt + _UINT32 docx2odt(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - _UINT32 nRes = ConvertODF2OOXml(sFrom, sTo, params.getFontPath(), sTemp, params.getPassword()); - nRes = processEncryptionError(nRes, sFrom, params); - return nRes; - } - // docx -> odt - _UINT32 docx2odt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedDOCX = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); + std::wstring sTempUnpackedDOCX = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedDOCX); COfficeUtils oCOfficeUtils(NULL); if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedDOCX, NULL, 0)) { - return docx_dir2odt(sTempUnpackedDOCX, sTo, sTemp, params, false); // add Template ???? + convertParams.m_bIsTemplate = false; + return docx_dir2odt(sTempUnpackedDOCX, sTo, params, convertParams); // add Template ???? } return AVS_FILEUTILS_ERROR_CONVERT; } - // docxflat -> docx - _UINT32 docxflat2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 docx_dir2odt(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedDOCX = sTemp + FILE_SEPARATOR_STR + L"docx_unpacked"; - NSDirectory::CreateDirectory(sTempUnpackedDOCX); - - BinDocxRW::CDocxSerializer m_oCDocxSerializer; - - _UINT32 nRes = 0; - if (m_oCDocxSerializer.convertFlat(sFrom, sTempUnpackedDOCX)) - { - nRes = dir2zipMscrypt(sTempUnpackedDOCX, sTo, sTemp, params); - } - else - { - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - // docxflat -> odt - _UINT32 docxflat2odt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedODT = sTemp + FILE_SEPARATOR_STR + L"odt_unpacked"; + std::wstring sTempUnpackedODT = combinePath(convertParams.m_sTempDir, L"odt_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedODT); - Oox2Odf::Converter converter(sFrom, L"text", params.getFontPath(), false, sTemp); + Oox2Odf::Converter converter(sFrom, L"text", params.getFontPath(), convertParams.m_bIsTemplate, convertParams.m_sTempDir); _UINT32 nRes = 0; try @@ -3206,7 +3307,7 @@ namespace NExtractTools std::wstring documentID = params.getDocumentID(); converter.convert(); - converter.write(sTempUnpackedODT, sTemp, password, documentID); + converter.write(sTempUnpackedODT, convertParams.m_sTempDir, password, documentID); COfficeUtils oCOfficeUtils(NULL); nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedODT, sTo, false, password.empty() ? Z_DEFLATED : 0)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; @@ -3217,53 +3318,27 @@ namespace NExtractTools } return nRes; } - // docx dir -> odt - _UINT32 docx_dir2odt(const std::wstring &sDocxDir, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, bool bTemplate) + + // xlsx => ods + _UINT32 xlsx2ods(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedODT = sTemp + FILE_SEPARATOR_STR + L"odt_unpacked"; - NSDirectory::CreateDirectory(sTempUnpackedODT); - - Oox2Odf::Converter converter(sDocxDir, L"text", params.getFontPath(), bTemplate, sTemp); - - _UINT32 nRes = 0; - try - { - std::wstring password = params.getSavePassword(); - std::wstring documentID = params.getDocumentID(); - - converter.convert(); - converter.write(sTempUnpackedODT, sTemp, password, documentID); - - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedODT, sTo, false, password.empty() ? Z_DEFLATED : 0)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - catch (...) - { - nRes = AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - // xlsx -> ods - _UINT32 xlsx2ods(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedXLSX = sTemp + FILE_SEPARATOR_STR + L"xlsx_unpacked"; - + std::wstring sTempUnpackedXLSX = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedXLSX); COfficeUtils oCOfficeUtils(NULL); if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLSX, NULL, 0)) { - return xlsx_dir2ods(sTempUnpackedXLSX, sTo, sTemp, params, false); // add Template ??? + convertParams.m_bIsTemplate = false; + return xlsx_dir2ods(sTempUnpackedXLSX, sTo, params, convertParams); // add Template ??? } return AVS_FILEUTILS_ERROR_CONVERT; } - - _UINT32 xlsx_dir2ods(const std::wstring &sXlsxDir, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, bool bTemplate) + _UINT32 xlsx_dir2ods(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedODS = sTemp + FILE_SEPARATOR_STR + L"ods_unpacked"; + std::wstring sTempUnpackedODS = combinePath(convertParams.m_sTempDir, L"ods_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedODS); - Oox2Odf::Converter converter(sXlsxDir, L"spreadsheet", params.getFontPath(), bTemplate, sTemp); + Oox2Odf::Converter converter(sFrom, L"spreadsheet", params.getFontPath(), convertParams.m_bIsTemplate, convertParams.m_sTempDir); _UINT32 nRes = 0; @@ -3271,7 +3346,7 @@ namespace NExtractTools std::wstring documentID = params.getDocumentID(); converter.convert(); - converter.write(sTempUnpackedODS, sTemp, password, documentID); + converter.write(sTempUnpackedODS, convertParams.m_sTempDir, password, documentID); COfficeUtils oCOfficeUtils(NULL); nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedODS, sTo, false, password.empty() ? Z_DEFLATED : 0)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; @@ -3279,343 +3354,274 @@ namespace NExtractTools return nRes; } - _UINT32 mscrypt2oot(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + // pptx => odp + _UINT32 pptx2odp(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sResultOotDir = sTemp + FILE_SEPARATOR_STR + _T("oot_unpacked"); - std::wstring sResultOotFileEditor = sResultOotDir + FILE_SEPARATOR_STR + _T("Editor.bin"); + std::wstring sTempUnpackedPPTX = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedPPTX); - NSDirectory::CreateDirectory(sResultOotDir); - - _UINT32 nRes = mscrypt2oot_bin(sFrom, sResultOotFileEditor, sTemp, params); - if (SUCCEEDED_X2T(nRes)) + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedPPTX, NULL, 0)) { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultOotDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - - return nRes; - } - _UINT32 mscrypt2oox(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring password = params.getPassword(); - - ECMACryptFile cryptReader; - bool bDataIntegrity = false; - - if (cryptReader.DecryptOfficeFile(sFrom, sTo, password, bDataIntegrity) == false) - { - if (password.empty()) - return AVS_FILEUTILS_ERROR_CONVERT_DRM; - else - return AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; - } - - if (bDataIntegrity == false) - { - // было несанкционированое вешательство в файл - } - - return 0; - } - _UINT32 mitcrypt2oox(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - // todo - return AVS_FILEUTILS_ERROR_CONVERT_DRM_UNSUPPORTED; - } - _UINT32 mscrypt2oot_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - //decrypt to temp file - std::wstring password = params.getPassword(); - std::wstring sResultDecryptFile = sTemp + FILE_SEPARATOR_STR + L"uncrypt_file.oox"; - - ECMACryptFile cryptReader; - bool bDataIntegrity = false; - - if (cryptReader.DecryptOfficeFile(sFrom, sResultDecryptFile, password, bDataIntegrity) == false) - { - if (password.empty()) - return AVS_FILEUTILS_ERROR_CONVERT_DRM; - else - return AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; - } - - if (bDataIntegrity == false) - { - // было несанкционированое вешательство в файл - } - - COfficeFileFormatChecker OfficeFileFormatChecker; - - if (OfficeFileFormatChecker.isOfficeFile(sResultDecryptFile)) - { - switch (OfficeFileFormatChecker.nFileType) - { - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF: - { - return docx2doct_bin(sResultDecryptFile, sTo, sTemp, params); - } - break; - case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX: - case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM: - case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX: - case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM: - case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB: - { - const std::wstring &sXmlOptions = params.getXmlOptions(); - return xlsx2xlst_bin(sResultDecryptFile, sTo, sTemp, params); - } - break; - case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX: - case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM: - case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX: - case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX: - case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM: - case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM: - { - return pptx2pptt_bin(sResultDecryptFile, sTo, sTemp, params); - } - break; - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_FLAT: - { - return docxflat2doct_bin(sResultDecryptFile, sTo, sTemp, params); - } - break; - case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_FLAT: - { - const std::wstring &sXmlOptions = params.getXmlOptions(); - return xlsxflat2xlst_bin(sResultDecryptFile, sTo, sTemp, params); - } - break; - 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; - } + convertParams.m_bIsTemplate = false; + return pptx_dir2odp(sTempUnpackedPPTX, sTo, params, convertParams); // add template ??? } return AVS_FILEUTILS_ERROR_CONVERT; } - _UINT32 mitcrypt2oot_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) + // pptx_dir -> odp + _UINT32 pptx_dir2odp(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - // todo - return AVS_FILEUTILS_ERROR_CONVERT_DRM_UNSUPPORTED; - } - _UINT32 msVbaProject2Xml(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - CVbaReader vbaReader(sFrom, sTo); + std::wstring sTempUnpackedODP = combinePath(convertParams.m_sTempDir, L"odp_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedODP); - if (false == vbaReader.write()) - return AVS_FILEUTILS_ERROR_CONVERT; - - return 0; - } - _UINT32 oox2mscrypt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring password = params.getSavePassword(); - std::wstring documentID = params.getDocumentID(); - - ECMACryptFile cryptReader; - - if (cryptReader.EncryptOfficeFile(sFrom, sTo, password, documentID) == false) - { - return AVS_FILEUTILS_ERROR_CONVERT; - } - - return 0; - } - _UINT32 fromMscrypt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring password = params.getPassword(); - - std::wstring sResultDecryptFile = sTemp + FILE_SEPARATOR_STR + L"uncrypt_file.oox"; - - _UINT32 nRes = mscrypt2oox(sFrom, sResultDecryptFile, sTemp, params); - - if (!SUCCEEDED_X2T(nRes) && password.empty()) // qiaoshemei1 (1).xlsx - запрокченный xlsx - { - if (!params.getDontSaveAdditional()) - { - copyOrigin(sFrom, sTo); - } - return AVS_FILEUTILS_ERROR_CONVERT_DRM; - } - nRes = processEncryptionError(nRes, sFrom, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeFileFormatChecker OfficeFileFormatChecker; - - if (OfficeFileFormatChecker.isOfficeFile(sResultDecryptFile)) - { - params.changeFormatFrom(OfficeFileFormatChecker.nFileType, OfficeFileFormatChecker.bMacroEnabled); - switch (OfficeFileFormatChecker.nFileType) - { - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF: - { - return fromDocument(sResultDecryptFile, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, sTemp, params); - } - break; - case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX: - case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM: - case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX: - case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM: - case AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB: - { - return fromSpreadsheet(sResultDecryptFile, AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX, sTemp, params); - } - break; - case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX: - case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM: - case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX: - case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX: - case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM: - case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM: - { - return fromPresentation(sResultDecryptFile, AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX, sTemp, params); - } - break; - } - } - } - return nRes; - } - _UINT32 fromMitcrypt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - // todo - return AVS_FILEUTILS_ERROR_CONVERT_DRM_UNSUPPORTED; - } - - // html - _UINT32 html_array2docx_dir(const std::vector &arFiles, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - CHtmlFile2 oFile; - oFile.SetTmpDirectory(sTemp); - return (S_OK == oFile.OpenBatchHtml(arFiles, sTo)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - _UINT32 html2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::vector arFiles; - arFiles.push_back(sFrom); - return html_array2docx_dir(arFiles, sTo, sTemp, params); - } - // html in container - _UINT32 html_zip2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::vector arFiles; - - POLE::Storage storage(sFrom.c_str()); - if (storage.open()) - { - POLE::Stream stream(&storage, L"WordDocument"); - - POLE::uint64 size_stream = stream.size(); - unsigned char *buffer = new unsigned char[size_stream]; - if (buffer) - { - stream.read(buffer, size_stream); - std::wstring sTempHtml = sTemp + FILE_SEPARATOR_STR + L"tempHtml.html"; - - NSFile::CFileBinary file; - - if (file.CreateFileW(sTempHtml)) - { - file.WriteFile(buffer, size_stream); - file.CloseFile(); - - arFiles.push_back(sTempHtml); - } - delete[] buffer; - } - } - else // in zip - { - } - return 0 == html_array2docx_dir(arFiles, sTo, sTemp, params) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - // mht - _UINT32 mht2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - CHtmlFile2 oFile; - oFile.SetTmpDirectory(sTemp); - return (S_OK == oFile.OpenMht(sFrom, sTo)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - // epub - _UINT32 epub2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - CEpubFile oFile; - oFile.SetTempDirectory(sTemp); - return (S_OK == oFile.Convert(sFrom, sTo, false)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - _UINT32 fb2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - CFb2File fb2File; - fb2File.SetTmpDirectory(sTemp); - return S_OK == fb2File.Open(sFrom, sTo) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; - } - _UINT32 fb2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sTempUnpackedDOCX = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedDOCX); - - _UINT32 nRes = fb2docx_dir(sFrom, sTempUnpackedDOCX, sTemp, params); - if (SUCCEEDED_X2T(nRes)) - { - nRes = dir2zipMscrypt(sTempUnpackedDOCX, sTo, sTemp, params); - } - return nRes; - } - // mailmerge - _UINT32 convertmailmerge( - const InputParamsMailMerge &oMailMergeSend, const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, bool bPaid, const std::wstring &sThemeDir, InputParams ¶ms) - { - if (NULL == oMailMergeSend.mailFormat || NULL == oMailMergeSend.recordFrom || NULL == oMailMergeSend.recordTo) - return AVS_FILEUTILS_ERROR_CONVERT; + Oox2Odf::Converter converter(sFrom, L"presentation", params.getFontPath(), convertParams.m_bIsTemplate, convertParams.m_sTempDir); _UINT32 nRes = 0; - - std::wstring sFileFromDir = NSSystemPath::GetDirectoryName(sFrom); - std::wstring sFileToDir = NSSystemPath::GetDirectoryName(sTo); - std::wstring sImagesDirectory = sFileFromDir + FILE_SEPARATOR_STR + _T("media"); - NSDoctRenderer::DoctRendererFormat::FormatFile eTypeTo; - switch (*oMailMergeSend.mailFormat) + try { - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM: - case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF: - eTypeTo = NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT; - break; - case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF: - eTypeTo = NSDoctRenderer::DoctRendererFormat::FormatFile::PDF; - break; - case AVS_OFFICESTUDIO_FILE_OTHER_HTMLZIP: - eTypeTo = NSDoctRenderer::DoctRendererFormat::FormatFile::HTML; - break; - default: - eTypeTo = NSDoctRenderer::DoctRendererFormat::FormatFile::HTML; - break; + std::wstring password = params.getSavePassword(); + std::wstring documentID = params.getDocumentID(); + + converter.convert(); + converter.write(sTempUnpackedODP, convertParams.m_sTempDir, password, documentID); + + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedODP, sTo, false, password.empty() ? Z_DEFLATED : 0)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; } - std::wstring sJsonPath = sFileFromDir + FILE_SEPARATOR_STR + _T("Editor.json"); - int recordTo = *oMailMergeSend.recordFrom + 4; - if (recordTo > *oMailMergeSend.recordTo) - recordTo = *oMailMergeSend.recordTo; - NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : _T("")); - std::wstring sMailMergeXml = getMailMergeXml(sJsonPath, *oMailMergeSend.recordFrom, recordTo, *oMailMergeSend.to); - // посылаем выходную папку sFileFromDir, чтобы файлы лежали на одном уровне с папкой media, важно для дальнейшей конвертации в docx, pdf - std::wstring sXml = getDoctXml(NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, eTypeTo, sFrom, sFileFromDir, sImagesDirectory, sThemeDir, -1, sMailMergeXml, params); + catch (...) + { + nRes = AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + + _UINT32 otf2odf(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedOdf = combinePath(convertParams.m_sTempDir, L"odf_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedOdf); + + COfficeUtils oCOfficeUtils(NULL); + if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedOdf, NULL, 0)) + return AVS_FILEUTILS_ERROR_CONVERT; + + _UINT32 nRes = ConvertOTF2ODF(sTempUnpackedOdf); + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedOdf, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } + + // pdf/image + _UINT32 bin2pdf(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + NSFonts::IApplicationFonts* pApplicationFonts = createApplicationFonts(params); + + CPdfFile pdfWriter(pApplicationFonts); + pdfWriter.CreatePdf(params.getIsPDFA()); + pdfWriter.SetTempDirectory(convertParams.m_sTempDir); + pdfWriter.SetDocumentInfo(params.getTitle(), L"", L"", L""); + + CConvertFromBinParams oBufferParams; + oBufferParams.m_sThemesDirectory = convertParams.m_sThemesDir; + + std::wstring documentID = params.getDocumentID(); + if (false == documentID.empty()) + pdfWriter.SetDocumentID(documentID); + + std::wstring password = params.getSavePassword(); + if (false == password.empty()) + pdfWriter.SetPassword(password); + + int nReg = (convertParams.m_bIsPaid == false) ? 0 : 1; + _UINT32 nRet = 0; + if (params.getIsNoBase64()) + { + nRet = S_OK == pdfWriter.OnlineWordToPdfFromBinary(sFrom, sTo, &oBufferParams) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + else + { + nRet = S_OK == pdfWriter.OnlineWordToPdf(sFrom, sTo, &oBufferParams) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + RELEASEOBJECT(pApplicationFonts); + return nRet; + } + + _UINT32 bin2image(unsigned char* pBuffer, long lBufferLen, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + NSFonts::IApplicationFonts* pApplicationFonts = createApplicationFonts(params); + NSOnlineOfficeBinToPdf::CMetafileToRenderterRaster imageWriter(NULL); + + imageWriter.SetMediaDirectory(convertParams.m_sMediaDirectory); + imageWriter.SetThemesDirectory(convertParams.m_sThemesDir); + imageWriter.SetInternalMediaDirectory(convertParams.m_sInternalMediaDirectory); + imageWriter.SetTempDirectory(convertParams.m_sTempDir); + imageWriter.SetApplication(pApplicationFonts); + + if (NULL != params.m_oThumbnail) + { + InputParamsThumbnail *oThumbnail = params.m_oThumbnail; + if (NULL != oThumbnail->format) + { + imageWriter.SetRasterFormat(*oThumbnail->format); + } + if (NULL != oThumbnail->aspect) + { + imageWriter.SetSaveType(*oThumbnail->aspect); + } + if (NULL != oThumbnail->first) + { + imageWriter.SetIsOnlyFirst(*oThumbnail->first); + } + if (NULL != oThumbnail->width) + { + imageWriter.SetRasterW(*oThumbnail->width); + } + if (NULL != oThumbnail->height) + { + imageWriter.SetRasterH(*oThumbnail->height); + } + } + std::wstring sThumbnailDir; + if (imageWriter.GetIsOnlyFirst()) + { + imageWriter.SetFileName(sTo); + } + else + { + std::wstring sFileAddon = L"image" + getExtentionByRasterFormat(imageWriter.GetRasterFormat()); + if (NULL == params.m_oThumbnail->zip || *(params.m_oThumbnail->zip)) + { + sThumbnailDir = combinePath(convertParams.m_sTempDir, L"thumbnails"); + NSDirectory::CreateDirectory(sThumbnailDir); + imageWriter.SetFileName(combinePath(sThumbnailDir, sFileAddon)); + } + else + { + if (!NSDirectory::Exists(sTo)) + NSDirectory::CreateDirectory(sTo); + imageWriter.SetFileName(sTo + FILE_SEPARATOR_STR + sFileAddon); + } + } + _UINT32 nRes = imageWriter.ConvertBuffer(pBuffer, lBufferLen) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + if (!sThumbnailDir.empty()) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = S_OK == oCOfficeUtils.CompressFileOrDirectory(sThumbnailDir, sTo) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } + RELEASEOBJECT(pApplicationFonts); + return nRes; + } + _UINT32 bin2imageBase64(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + NSFile::CFileBinary oFile; + if (!oFile.OpenFile(sFrom)) + return AVS_FILEUTILS_ERROR_CONVERT; + + DWORD dwFileSize = oFile.GetFileSize(); + BYTE *pFileContent = new BYTE[dwFileSize]; + if (!pFileContent) + { + oFile.CloseFile(); + return AVS_FILEUTILS_ERROR_CONVERT; + } + + DWORD dwReaded; + oFile.ReadFile(pFileContent, dwFileSize, dwReaded); + oFile.CloseFile(); + + int nBufferLen = NSBase64::Base64DecodeGetRequiredLength(dwFileSize); + BYTE *pBuffer = new BYTE[nBufferLen]; + if (!pBuffer) + { + RELEASEARRAYOBJECTS(pFileContent); + return AVS_FILEUTILS_ERROR_CONVERT; + } + + _UINT32 nRes = 0; + if (NSBase64::Base64Decode((const char *)pFileContent, dwFileSize, pBuffer, &nBufferLen)) + { + convertParams.m_sMediaDirectory = NSDirectory::GetFolderPath(sFrom); + nRes = bin2image(pBuffer, nBufferLen, sTo, params, convertParams); + } + else + { + nRes = AVS_FILEUTILS_ERROR_CONVERT; + } + + RELEASEARRAYOBJECTS(pBuffer); + RELEASEARRAYOBJECTS(pFileContent); + + return nRes; + } + + _UINT32 doct_bin2pdf(NSDoctRenderer::DoctRendererFormat::FormatFile eFromType, + const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + NSDoctRenderer::DoctRendererFormat::FormatFile eToType = NSDoctRenderer::DoctRendererFormat::FormatFile::PDF; + + std::wstring sFileDir = NSDirectory::GetFolderPath(sFrom); + std::wstring sImagesDirectory = combinePath(sFileDir, L"media"); + std::wstring sPdfBinFile = combinePath(sFileDir, L"pdf.bin"); + + NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : L""); + std::wstring sXml = getDoctXml(eFromType, eToType, sFrom, sPdfBinFile, sImagesDirectory, convertParams.m_sThemesDir, -1, L"", params); std::wstring sResult; - oDoctRenderer.Execute(sXml, sResult); + bool bRes = oDoctRenderer.Execute(sXml, sResult); + + _UINT32 nRes = 0; + if (sResult.find(L"error") != std::wstring::npos) + { + std::wcerr << _T("DoctRenderer:") << sResult << std::endl; + nRes = AVS_FILEUTILS_ERROR_CONVERT; + } + else + { + NSFonts::IApplicationFonts* pApplicationFonts = createApplicationFonts(params); + + CPdfFile pdfWriter(pApplicationFonts); + pdfWriter.CreatePdf(params.getIsPDFA()); + pdfWriter.SetTempDirectory(convertParams.m_sTempDir); + pdfWriter.SetDocumentInfo(params.getTitle(), L"", L"", L""); + + CConvertFromBinParams oBufferParams; + oBufferParams.m_sThemesDirectory = convertParams.m_sThemesDir; + oBufferParams.m_sInternalMediaDirectory = convertParams.m_sInternalMediaDirectory; + + std::wstring documentID = params.getDocumentID(); + if (false == documentID.empty()) + pdfWriter.SetDocumentID(documentID); + + std::wstring password = params.getSavePassword(); + if (false == password.empty()) + pdfWriter.SetPassword(password); + + int nReg = (convertParams.m_bIsPaid == false) ? 0 : 1; + nRes = (S_OK == pdfWriter.OnlineWordToPdfFromBinary(sPdfBinFile, sTo, &oBufferParams)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + RELEASEOBJECT(pApplicationFonts); + } + // удаляем sPdfBinFile, потому что он не в Temp + if (NSFile::CFileBinary::Exists(sPdfBinFile)) + NSFile::CFileBinary::Remove(sPdfBinFile); + return nRes; + } + + _UINT32 doct_bin2image(NSDoctRenderer::DoctRendererFormat::FormatFile eFromType, + const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + NSDoctRenderer::DoctRendererFormat::FormatFile eToType = NSDoctRenderer::DoctRendererFormat::FormatFile::IMAGE; + + std::wstring sFileDir = NSDirectory::GetFolderPath(sFrom); + std::wstring sImagesDirectory = combinePath(sFileDir, L"media"); + std::wstring sPdfBinFile = combinePath(sFileDir, L"pdf.bin"); + + NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : L""); + std::wstring sXml = getDoctXml(eFromType, eToType, sFrom, sPdfBinFile, sImagesDirectory, convertParams.m_sThemesDir, -1, L"", params); + std::wstring sResult; + bool bRes = oDoctRenderer.Execute(sXml, sResult); + + _UINT32 nRes = 0; if (-1 != sResult.find(_T("error"))) { std::wcerr << _T("DoctRenderer:") << sResult << std::endl; @@ -3623,92 +3629,26 @@ namespace NExtractTools } else { - nRes = AVS_FILEUTILS_ERROR_CONVERT; - XmlUtils::CXmlNode oRoot; - if (TRUE == oRoot.FromXmlString(sResult)) + BYTE *pData = NULL; + DWORD nBytesCount; + if (NSFile::CFileBinary::ReadAllBytes(sPdfBinFile, &pData, nBytesCount)) { - XmlUtils::CXmlNode oMailMergeFields = oRoot.ReadNode(_T("MailMergeFields")); - std::vector oXmlNodes; - if (TRUE == oMailMergeFields.GetChilds(oXmlNodes)) - { - for (size_t i = 0; i < oXmlNodes.size(); ++i) - { - XmlUtils::CXmlNode &oXmlNode = oXmlNodes[i]; - if (oXmlNode.IsValid()) - { - std::wstring sFilePathIn = oXmlNode.GetAttribute(L"path"); - std::wstring wsFilePathInFilename = NSSystemPath::GetFileName(sFilePathIn); - std::wstring sFilePathOut = sFileToDir + FILE_SEPARATOR_STR + wsFilePathInFilename; - if (NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT == eTypeTo) - { - sFilePathOut += L".docx"; - - std::wstring sTempDocx = sTemp + FILE_SEPARATOR_STR + wsFilePathInFilename + L"_DOCX"; - NSDirectory::CreateDirectory(sTempDocx); - - BinDocxRW::CDocxSerializer m_oCDocxSerializer; - m_oCDocxSerializer.setIsNoBase64(params.getIsNoBase64()); - m_oCDocxSerializer.setFontDir(params.getFontPath()); - - std::wstring sXmlOptions; - std::wstring sThemePath; // will be filled by 'CreateDocxFolders' method - std::wstring sMediaPath; // will be filled by 'CreateDocxFolders' method - std::wstring sEmbedPath; // will be filled by 'CreateDocxFolders' method - - m_oCDocxSerializer.CreateDocxFolders(sTempDocx, sThemePath, sMediaPath, sEmbedPath); - nRes = m_oCDocxSerializer.loadFromFile(sFilePathIn, sTempDocx, sXmlOptions, sThemePath, sMediaPath, sEmbedPath) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - if (SUCCEEDED_X2T(nRes)) - { - std::wstring sTempUnencrypted = sTemp + FILE_SEPARATOR_STR + wsFilePathInFilename + L"_unencrypted"; - NSDirectory::CreateDirectory(sTempUnencrypted); - - nRes = dir2zipMscrypt(sTempDocx, sFilePathOut, sTempUnencrypted, params); - } - } - else if (NSDoctRenderer::DoctRendererFormat::FormatFile::PDF == eTypeTo) - { - sFilePathOut += _T(".pdf"); - - NSFonts::IApplicationFonts *pApplicationFonts = NSFonts::NSApplication::Create(); - initApplicationFonts(pApplicationFonts, params); - CPdfFile pdfWriter(pApplicationFonts); - pdfWriter.CreatePdf(params.getIsPDFA()); - pdfWriter.SetTempDirectory(sTemp); - pdfWriter.SetDocumentInfo(params.getTitle(), L"", L"", L""); - - CConvertFromBinParams oBufferParams; - oBufferParams.m_sThemesDirectory = sThemeDir; - - std::wstring documentID = params.getDocumentID(); - if (false == documentID.empty()) - pdfWriter.SetDocumentID(documentID); - - std::wstring password = params.getSavePassword(); - if (false == password.empty()) - pdfWriter.SetPassword(password); - - int nReg = (bPaid == false) ? 0 : 1; - nRes = (S_OK == pdfWriter.OnlineWordToPdfFromBinary(sFilePathIn, sFilePathOut, &oBufferParams)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - RELEASEOBJECT(pApplicationFonts); - } - else if (NSDoctRenderer::DoctRendererFormat::FormatFile::HTML == eTypeTo) - { - sFilePathOut += _T(".html"); - nRes = NSFile::CFileBinary::Copy(sFilePathIn, sFilePathOut) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - } - if (0 != nRes) - break; - sResult = string_replaceAll(sResult, L"\"" + sFilePathIn + L"\"", L"\"" + NSSystemPath::GetFileName(sFilePathOut) + L"\""); - } - } - } + convertParams.m_sMediaDirectory = sFileDir; + nRes = 0 == bin2image(pData, nBytesCount, sTo, params, convertParams) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + RELEASEARRAYOBJECTS(pData); + } + else + { + nRes = AVS_FILEUTILS_ERROR_CONVERT; } - if (SUCCEEDED_X2T(nRes)) - NSFile::CFileBinary::SaveToFile(sTo, sResult); } + // delete sPdfBinFile, because it is not in Temp + if (NSFile::CFileBinary::Exists(sPdfBinFile)) + NSFile::CFileBinary::Remove(sPdfBinFile); return nRes; } + // from crossplatform (pdf) std::string checkPrintPages(InputParams ¶ms) { if (NULL == params.m_sJsonParams) @@ -3822,240 +3762,229 @@ namespace NExtractTools return arPages; } - _UINT32 PdfDjvuXpsToRenderer( - IOfficeDrawingFile **ppReader, IRenderer *pRenderer, const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, - NSFonts::IApplicationFonts *pApplicationFonts, const std::string &sPages = "") + IOfficeDrawingFile* createDrawingFile(NSFonts::IApplicationFonts* pFonts, const int& nFormat) + { + switch (nFormat) + { + case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF: + return new CPdfFile(pFonts); + case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS: + return new CXpsFile(pFonts); + case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU: + return new CDjVuFile(pFonts); + default: + break; + } + return NULL; + } + + _UINT32 PdfDjvuXpsToRenderer(IOfficeDrawingFile** ppReader, IRenderer *pRenderer, + const std::wstring& sFrom, int nFormatFrom, + const std::wstring& sTo, InputParams& params, ConvertParams& convertParams, + NSFonts::IApplicationFonts* pApplicationFonts) { _UINT32 nRes = 0; - IOfficeDrawingFile *pReader = NULL; - if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatFrom) + IOfficeDrawingFile* pReader = createDrawingFile(pApplicationFonts, nFormatFrom); + if (!pReader) + return AVS_FILEUTILS_ERROR_CONVERT; + + *ppReader = pReader; + pReader->SetTempDirectory(convertParams.m_sTempDir); + + std::wstring sPassword = params.getPassword(); + bool bResult = pReader->LoadFromFile(sFrom.c_str(), L"", sPassword, sPassword); + + if (bResult) { - pReader = new CPdfFile(pApplicationFonts); - } - else if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU == nFormatFrom) - { - pReader = new CDjVuFile(pApplicationFonts); - } - else if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS == nFormatFrom) - { - pReader = new CXpsFile(pApplicationFonts); + int nPagesCount = pReader->GetPagesCount(); + + bool bIsUsePages = convertParams.m_sPrintPages.empty() ? false : true; + std::vector arPages; + if (bIsUsePages) + arPages = getPrintPages(convertParams.m_sPrintPages, nPagesCount); + + for (int i = 0; i < nPagesCount; ++i) + { + if (bIsUsePages && !arPages[i]) + continue; + + pRenderer->NewPage(); + pRenderer->BeginCommand(c_nPageType); + + double dPageDpiX, dPageDpiY; + double dWidth, dHeight; + pReader->GetPageInfo(i, &dWidth, &dHeight, &dPageDpiX, &dPageDpiY); + + dWidth *= 25.4 / dPageDpiX; + dHeight *= 25.4 / dPageDpiY; + + pRenderer->put_Width(dWidth); + pRenderer->put_Height(dHeight); + + pReader->DrawPageOnRenderer(pRenderer, i, NULL); + + pRenderer->EndCommand(c_nPageType); + } } else - nRes = AVS_FILEUTILS_ERROR_CONVERT; - if (SUCCEEDED_X2T(nRes)) { - *ppReader = pReader; - pReader->SetTempDirectory(sTemp); - - std::wstring sPassword = params.getPassword(); - - bool bResult = pReader->LoadFromFile(sFrom.c_str(), L"", sPassword, sPassword); - if (bResult) + nRes = AVS_FILEUTILS_ERROR_CONVERT; + if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatFrom) { - int nPagesCount = pReader->GetPagesCount(); - - bool bIsUsePages = sPages.empty() ? false : true; - std::vector arPages; - if (bIsUsePages) - arPages = getPrintPages(sPages, nPagesCount); - - for (int i = 0; i < nPagesCount; ++i) + CPdfFile *pPdfReader = static_cast(pReader); + if (PdfFile::errorEncrypted == pPdfReader->GetError()) { - if (bIsUsePages && !arPages[i]) - continue; + if (sPassword.empty()) + { + if (!params.getDontSaveAdditional()) + { + copyOrigin(sFrom, *params.m_sFileTo); + } + nRes = AVS_FILEUTILS_ERROR_CONVERT_DRM; + } + else + { + nRes = AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; + } + } + } + } + return nRes; + } - pRenderer->NewPage(); - pRenderer->BeginCommand(c_nPageType); + _UINT32 PdfDjvuXpsToImage(IOfficeDrawingFile** ppReader, const std::wstring& sFrom, int nFormatFrom, + const std::wstring& sTo, InputParams& params, ConvertParams& convertParams, + NSFonts::IApplicationFonts* pApplicationFonts) + { + _UINT32 nRes = 0; + IOfficeDrawingFile* pReader = createDrawingFile(pApplicationFonts, nFormatFrom); + if (!pReader) + return AVS_FILEUTILS_ERROR_CONVERT; + *ppReader = pReader; + pReader->SetTempDirectory(convertParams.m_sTempDir); + + std::wstring sPassword = params.getPassword(); + bool bResult = pReader->LoadFromFile(sFrom.c_str(), L"", sPassword, sPassword); + + if (bResult) + { + // default as in CMetafileToRenderterRaster + int nRasterFormat = 4; + int nSaveType = 2; + bool bIsOnlyFirst = true; + bool bIsZip = true; + int nRasterW = 100; + int nRasterH = 100; + if (NULL != params.m_oThumbnail) + { + InputParamsThumbnail *oThumbnail = params.m_oThumbnail; + if (NULL != oThumbnail->format) + { + nRasterFormat = *oThumbnail->format; + } + if (NULL != oThumbnail->aspect) + { + nSaveType = *oThumbnail->aspect; + } + if (NULL != oThumbnail->first) + { + bIsOnlyFirst = *oThumbnail->first; + } + if (NULL != oThumbnail->zip) + { + bIsZip = *oThumbnail->zip; + } + if (NULL != oThumbnail->width) + { + nRasterW = *oThumbnail->width; + } + if (NULL != oThumbnail->height) + { + nRasterH = *oThumbnail->height; + } + } + std::wstring sThumbnailDir; + std::wstring sFileToExt; + if (!bIsOnlyFirst) + { + if (bIsZip) + { + sThumbnailDir = combinePath(convertParams.m_sTempDir, L"thumbnails"); + NSDirectory::CreateDirectory(sThumbnailDir); + } + else + { + if (!NSDirectory::Exists(sTo)) + NSDirectory::CreateDirectory(sTo); + sThumbnailDir = sTo; + } + sFileToExt = getExtentionByRasterFormat(nRasterFormat); + } + int nPagesCount = pReader->GetPagesCount(); + if (bIsOnlyFirst) + nPagesCount = 1; + for (int i = 0; i < nPagesCount; ++i) + { + int nRasterWCur = nRasterW; + int nRasterHCur = nRasterH; + + if (1 == nSaveType) + { double dPageDpiX, dPageDpiY; double dWidth, dHeight; pReader->GetPageInfo(i, &dWidth, &dHeight, &dPageDpiX, &dPageDpiY); - dWidth *= 25.4 / dPageDpiX; - dHeight *= 25.4 / dPageDpiY; + double dKoef1 = nRasterWCur / dWidth; + double dKoef2 = nRasterHCur / dHeight; + if (dKoef1 > dKoef2) + dKoef1 = dKoef2; - pRenderer->put_Width(dWidth); - pRenderer->put_Height(dHeight); - - pReader->DrawPageOnRenderer(pRenderer, i, NULL); - - pRenderer->EndCommand(c_nPageType); + nRasterWCur = (int)(dWidth * dKoef1 + 0.5); + nRasterHCur = (int)(dHeight * dKoef1 + 0.5); } - } - else - { - nRes = AVS_FILEUTILS_ERROR_CONVERT; - if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatFrom) + else if (2 == nSaveType) { - CPdfFile *pPdfReader = static_cast(pReader); - if (PdfFile::errorEncrypted == pPdfReader->GetError()) - { - if (sPassword.empty()) - { - if (!params.getDontSaveAdditional()) - { - copyOrigin(sFrom, *params.m_sFileTo); - } - nRes = AVS_FILEUTILS_ERROR_CONVERT_DRM; - } - else - { - nRes = AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; - } - } + nRasterWCur = -1; + nRasterHCur = -1; } + std::wstring sFileTo; + if (bIsOnlyFirst) + { + sFileTo = sTo; + } + else + { + sFileTo = sThumbnailDir + FILE_SEPARATOR_STR + L"image" + std::to_wstring(i + 1) + sFileToExt; + } + pReader->ConvertToRaster(i, sFileTo, nRasterFormat, nRasterWCur, nRasterHCur); + } + // zip + if (!bIsOnlyFirst && bIsZip) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = S_OK == oCOfficeUtils.CompressFileOrDirectory(sThumbnailDir, sTo) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; } - } - return nRes; - } - - _UINT32 PdfDjvuXpsToImage( - IOfficeDrawingFile **ppReader, const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, - NSFonts::IApplicationFonts *pApplicationFonts) - { - _UINT32 nRes = 0; - IOfficeDrawingFile *pReader = NULL; - if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatFrom) - { - pReader = new CPdfFile(pApplicationFonts); - } - else if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU == nFormatFrom) - { - pReader = new CDjVuFile(pApplicationFonts); - } - else if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS == nFormatFrom) - { - pReader = new CXpsFile(pApplicationFonts); } else - nRes = AVS_FILEUTILS_ERROR_CONVERT; - if (SUCCEEDED_X2T(nRes)) { - *ppReader = pReader; - pReader->SetTempDirectory(sTemp); - - std::wstring sPassword = params.getPassword(); - - bool bResult = pReader->LoadFromFile(sFrom.c_str(), L"", sPassword, sPassword); - if (bResult) + nRes = AVS_FILEUTILS_ERROR_CONVERT; + if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatFrom) { - // default as in CMetafileToRenderterRaster - int nRasterFormat = 4; - int nSaveType = 2; - bool bIsOnlyFirst = true; - bool bIsZip = true; - int nRasterW = 100; - int nRasterH = 100; - if (NULL != params.m_oThumbnail) + CPdfFile *pPdfReader = static_cast(pReader); + if (PdfFile::errorEncrypted == pPdfReader->GetError()) { - InputParamsThumbnail *oThumbnail = params.m_oThumbnail; - if (NULL != oThumbnail->format) + if (sPassword.empty()) { - nRasterFormat = *oThumbnail->format; - } - if (NULL != oThumbnail->aspect) - { - nSaveType = *oThumbnail->aspect; - } - if (NULL != oThumbnail->first) - { - bIsOnlyFirst = *oThumbnail->first; - } - if (NULL != oThumbnail->zip) - { - bIsZip = *oThumbnail->zip; - } - if (NULL != oThumbnail->width) - { - nRasterW = *oThumbnail->width; - } - if (NULL != oThumbnail->height) - { - nRasterH = *oThumbnail->height; - } - } - std::wstring sThumbnailDir; - std::wstring sFileToExt; - if (!bIsOnlyFirst) - { - if (bIsZip) - { - sThumbnailDir = sTemp + FILE_SEPARATOR_STR + _T("thumbnails"); - NSDirectory::CreateDirectory(sThumbnailDir); + if (!params.getDontSaveAdditional()) + { + copyOrigin(sFrom, *params.m_sFileTo); + } + nRes = AVS_FILEUTILS_ERROR_CONVERT_DRM; } else { - if (!NSDirectory::Exists(sTo)) - NSDirectory::CreateDirectory(sTo); - sThumbnailDir = sTo; - } - sFileToExt = getExtentionByRasterFormat(nRasterFormat); - } - int nPagesCount = pReader->GetPagesCount(); - if (bIsOnlyFirst) - nPagesCount = 1; - for (int i = 0; i < nPagesCount; ++i) - { - int nRasterWCur = nRasterW; - int nRasterHCur = nRasterH; - - if (1 == nSaveType) - { - double dPageDpiX, dPageDpiY; - double dWidth, dHeight; - pReader->GetPageInfo(i, &dWidth, &dHeight, &dPageDpiX, &dPageDpiY); - - double dKoef1 = nRasterWCur / dWidth; - double dKoef2 = nRasterHCur / dHeight; - if (dKoef1 > dKoef2) - dKoef1 = dKoef2; - - nRasterWCur = (int)(dWidth * dKoef1 + 0.5); - nRasterHCur = (int)(dHeight * dKoef1 + 0.5); - } - else if (2 == nSaveType) - { - nRasterWCur = -1; - nRasterHCur = -1; - } - std::wstring sFileTo; - if (bIsOnlyFirst) - { - sFileTo = sTo; - } - else - { - sFileTo = sThumbnailDir + FILE_SEPARATOR_STR + L"image" + std::to_wstring(i + 1) + sFileToExt; - } - pReader->ConvertToRaster(i, sFileTo, nRasterFormat, nRasterWCur, nRasterHCur); - } - // zip - if (!bIsOnlyFirst && bIsZip) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = S_OK == oCOfficeUtils.CompressFileOrDirectory(sThumbnailDir, sTo) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - } - else - { - nRes = AVS_FILEUTILS_ERROR_CONVERT; - if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatFrom) - { - CPdfFile *pPdfReader = static_cast(pReader); - if (PdfFile::errorEncrypted == pPdfReader->GetError()) - { - if (sPassword.empty()) - { - if (!params.getDontSaveAdditional()) - { - copyOrigin(sFrom, *params.m_sFileTo); - } - nRes = AVS_FILEUTILS_ERROR_CONVERT_DRM; - } - else - { - nRes = AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; - } + nRes = AVS_FILEUTILS_ERROR_CONVERT_PASSWORD; } } } @@ -4063,8 +3992,384 @@ namespace NExtractTools return nRes; } - _UINT32 fromDocxDir( - const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms, const std::wstring &sDocxFile) + bool applyChangesPdf(const std::wstring& sFrom, const std::wstring& sTo, + NSFonts::IApplicationFonts* pApplicationFonts, + InputParams& params, ConvertParams& convertParams, + std::vector& changes) + { + CPdfFile oPdfResult(pApplicationFonts); + oPdfResult.SetTempDirectory(convertParams.m_sTempDir); + oPdfResult.SetDocumentInfo(params.getTitle(), L"", L"", L""); + + std::wstring documentID = params.getDocumentID(); + if (!documentID.empty()) + oPdfResult.SetDocumentID(documentID); + + std::wstring password = params.getSavePassword(); + if (!oPdfResult.LoadFromFile(sFrom, L"", password, password)) + return false; + + if (!oPdfResult.EditPdf(sTo)) + return false; + + CConvertFromBinParams oConvertParams; + oConvertParams.m_sInternalMediaDirectory = NSFile::GetDirectoryName(sFrom); + oConvertParams.m_sMediaDirectory = oConvertParams.m_sInternalMediaDirectory; + + for (std::vector::const_iterator i = changes.begin(); i != changes.end(); i++) + { + BYTE* pChangesData = NULL; + DWORD dwChangesSize = 0; + if (NSFile::CFileBinary::ReadAllBytes(*i, &pChangesData, dwChangesSize)) + { + oPdfResult.AddToPdfFromBinary(pChangesData, (unsigned int)dwChangesSize, &oConvertParams); + RELEASEARRAYOBJECTS(pChangesData); + } + } + + oPdfResult.Close(); + return true; + } + + _UINT32 fromCrossPlatform(const std::wstring& sFromSrc, int nFormatFrom, + const std::wstring& sTo, int nFormatTo, + InputParams& params, ConvertParams& convertParams) + { + _UINT32 nRes = 0; + NSFonts::IApplicationFonts *pApplicationFonts = createApplicationFonts(params); + + std::wstring sFrom = sFromSrc; + if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatFrom || + AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDFA == nFormatFrom) + { + if (params.getFromChanges()) + { + std::wstring sChangesDir = NSDirectory::GetFolderPath(sFrom) + FILE_SEPARATOR_STR + L"changes"; + std::vector arChanges = NSDirectory::GetFiles(sChangesDir); + + sFrom = NSFile::CFileBinary::CreateTempFileWithUniqueName(convertParams.m_sTempDir, L"PDF_"); + if (NSFile::CFileBinary::Exists(sFrom)) + NSFile::CFileBinary::Remove(sFrom); + + if (!applyChangesPdf(sFromSrc, sFrom, pApplicationFonts, params, convertParams, arChanges)) + { + if (NSFile::CFileBinary::Exists(sFrom)) + NSFile::CFileBinary::Remove(sFrom); + + sFrom = sFromSrc; + } + } + } + + if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) + { + std::string sPages = checkPrintPages(params); + + if (nFormatFrom == nFormatTo && !params.getIsPDFA() && params.getPassword() == params.getSavePassword() && sPages.empty()) + { + if (sFrom == sFromSrc) + nRes = NSFile::CFileBinary::Copy(sFrom, sTo) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + else + { + nRes = NSFile::CFileBinary::Move(sFrom, sTo) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + sFrom = sFromSrc; + } + } + else + { + CPdfFile pdfWriter(pApplicationFonts); + pdfWriter.CreatePdf(params.getIsPDFA()); + pdfWriter.SetTempDirectory(convertParams.m_sTempDir); + pdfWriter.SetDocumentInfo(params.getTitle(), L"", L"", L""); + + std::wstring documentID = params.getDocumentID(); + if (false == documentID.empty()) + pdfWriter.SetDocumentID(documentID); + + std::wstring password = params.getSavePassword(); + if (false == password.empty()) + pdfWriter.SetPassword(password); + + IOfficeDrawingFile *pReader = NULL; + convertParams.m_sPrintPages = sPages; + nRes = PdfDjvuXpsToRenderer(&pReader, &pdfWriter, sFrom, nFormatFrom, sTo, params, convertParams, pApplicationFonts); + if (SUCCEEDED_X2T(nRes)) + nRes = S_OK == pdfWriter.SaveToFile(sTo) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + RELEASEOBJECT(pReader); + } + } + else if (0 != (AVS_OFFICESTUDIO_FILE_CANVAS & nFormatTo)) + { + if (params.needConvertToOrigin(nFormatFrom)) + { + copyOrigin(sFrom, *params.m_sFileTo); + } + else + { + std::wstring sToDir = NSSystemPath::GetDirectoryName(sTo); + if (!params.getDontSaveAdditional()) + { + // save origin to print + copyOrigin(sFrom, *params.m_sFileTo); + } + NSHtmlRenderer::CASCHTMLRenderer3 oHtmlRenderer; + oHtmlRenderer.CreateOfficeFile(sToDir); + IOfficeDrawingFile *pReader = NULL; + nRes = PdfDjvuXpsToRenderer(&pReader, &oHtmlRenderer, sFrom, nFormatFrom, sTo, params, convertParams, pApplicationFonts); + oHtmlRenderer.CloseFile(params.getIsNoBase64()); + RELEASEOBJECT(pReader); + } + } + else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) + { + IOfficeDrawingFile *pReader = NULL; + nRes = PdfDjvuXpsToImage(&pReader, sFrom, nFormatFrom, sTo, params, convertParams, pApplicationFonts); + RELEASEOBJECT(pReader); + } + else + { + switch (nFormatTo) + { + case AVS_OFFICESTUDIO_FILE_OTHER_OOXML: + nFormatTo = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX; + break; + case AVS_OFFICESTUDIO_FILE_OTHER_ODF: + nFormatTo = AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT; + break; + } + + IOfficeDrawingFile *pReader = NULL; + switch (nFormatFrom) + { + case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF: + pReader = new CPdfFile(pApplicationFonts); + break; + case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS: + pReader = new CXpsFile(pApplicationFonts); + break; + case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU: + pReader = new CDjVuFile(pApplicationFonts); + break; + default: + break; + } + + if (pReader) + { + pReader->SetTempDirectory(convertParams.m_sTempDir); + + std::wstring sPassword = params.getPassword(); + pReader->LoadFromFile(sFrom, L"", sPassword, sPassword); + + CDocxRenderer oDocxRenderer(pApplicationFonts); + + NSDocxRenderer::TextAssociationType taType = NSDocxRenderer::tatPlainLine; + if (params.m_oTextParams) + { + InputParamsText *oTextParams = params.m_oTextParams; + if (oTextParams->m_nTextAssociationType) + // taType = static_cast(*oTextParams->m_nTextAssociationType); + { + switch (*oTextParams->m_nTextAssociationType) + { + case 0: + taType = NSDocxRenderer::tatBlockChar; + break; + case 1: + taType = NSDocxRenderer::tatBlockLine; + break; + case 2: + taType = NSDocxRenderer::tatPlainLine; + break; + case 3: + taType = NSDocxRenderer::tatPlainParagraph; + break; + default: + break; + } + } + } + oDocxRenderer.SetTextAssociationType(taType); + + std::wstring sTempDirOut = combinePath(convertParams.m_sTempDir, L"output"); + if (!NSDirectory::Exists(sTempDirOut)) + NSDirectory::CreateDirectory(sTempDirOut); + + oDocxRenderer.SetTempFolder(sTempDirOut); + bool bIsOutCompress = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatTo && !params.hasSavePassword(); + nRes = oDocxRenderer.Convert(pReader, sTo, bIsOutCompress); + + if (nRes == S_OK && !bIsOutCompress) + nRes = fromDocxDir(sTempDirOut, sTo, nFormatTo, params, convertParams); + } + else + nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; + RELEASEOBJECT(pReader); + } + RELEASEOBJECT(pApplicationFonts); + + if (sFrom != sFromSrc && NSFile::CFileBinary::Exists(sFrom)) + NSFile::CFileBinary::Remove(sFrom); + return nRes; + } + _UINT32 fromCanvasPdf(const std::wstring& sFrom, int nFormatFrom, + const std::wstring& sTo, int nFormatTo, + InputParams& params, ConvertParams& convertParams) + { + _UINT32 nRes = 0; + if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) + { + nRes = bin2pdf(sFrom, sTo, params, convertParams); + } + else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) + { + nRes = bin2imageBase64(sFrom, sTo, params, convertParams); + } + else + { + nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; + } + return nRes; + } + + // mailmerge + _UINT32 convertmailmerge(const InputParamsMailMerge& oMailMergeSend, + const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + if (NULL == oMailMergeSend.mailFormat || NULL == oMailMergeSend.recordFrom || NULL == oMailMergeSend.recordTo) + return AVS_FILEUTILS_ERROR_CONVERT; + + _UINT32 nRes = 0; + + std::wstring sFileFromDir = NSSystemPath::GetDirectoryName(sFrom); + std::wstring sFileToDir = NSSystemPath::GetDirectoryName(sTo); + std::wstring sImagesDirectory = sFileFromDir + FILE_SEPARATOR_STR + _T("media"); + NSDoctRenderer::DoctRendererFormat::FormatFile eTypeTo; + switch (*oMailMergeSend.mailFormat) + { + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM: + case AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF: + eTypeTo = NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT; + break; + case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF: + eTypeTo = NSDoctRenderer::DoctRendererFormat::FormatFile::PDF; + break; + case AVS_OFFICESTUDIO_FILE_OTHER_HTMLZIP: + eTypeTo = NSDoctRenderer::DoctRendererFormat::FormatFile::HTML; + break; + default: + eTypeTo = NSDoctRenderer::DoctRendererFormat::FormatFile::HTML; + break; + } + std::wstring sJsonPath = sFileFromDir + FILE_SEPARATOR_STR + _T("Editor.json"); + int recordTo = *oMailMergeSend.recordFrom + 4; + if (recordTo > *oMailMergeSend.recordTo) + recordTo = *oMailMergeSend.recordTo; + NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : _T("")); + std::wstring sMailMergeXml = getMailMergeXml(sJsonPath, *oMailMergeSend.recordFrom, recordTo, *oMailMergeSend.to); + // посылаем выходную папку sFileFromDir, чтобы файлы лежали на одном уровне с папкой media, важно для дальнейшей конвертации в docx, pdf + std::wstring sXml = getDoctXml(NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, eTypeTo, sFrom, sFileFromDir, sImagesDirectory, convertParams.m_sThemesDir, -1, sMailMergeXml, params); + std::wstring sResult; + oDoctRenderer.Execute(sXml, sResult); + if (-1 != sResult.find(_T("error"))) + { + std::wcerr << _T("DoctRenderer:") << sResult << std::endl; + nRes = AVS_FILEUTILS_ERROR_CONVERT; + } + else + { + nRes = AVS_FILEUTILS_ERROR_CONVERT; + XmlUtils::CXmlNode oRoot; + if (TRUE == oRoot.FromXmlString(sResult)) + { + XmlUtils::CXmlNode oMailMergeFields = oRoot.ReadNode(_T("MailMergeFields")); + std::vector oXmlNodes; + if (TRUE == oMailMergeFields.GetChilds(oXmlNodes)) + { + for (size_t i = 0; i < oXmlNodes.size(); ++i) + { + XmlUtils::CXmlNode &oXmlNode = oXmlNodes[i]; + if (oXmlNode.IsValid()) + { + std::wstring sFilePathIn = oXmlNode.GetAttribute(L"path"); + std::wstring wsFilePathInFilename = NSSystemPath::GetFileName(sFilePathIn); + std::wstring sFilePathOut = sFileToDir + FILE_SEPARATOR_STR + wsFilePathInFilename; + if (NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT == eTypeTo) + { + sFilePathOut += L".docx"; + + std::wstring sTempDocx = convertParams.m_sTempDir + FILE_SEPARATOR_STR + wsFilePathInFilename + L"_DOCX"; + NSDirectory::CreateDirectory(sTempDocx); + + BinDocxRW::CDocxSerializer m_oCDocxSerializer; + m_oCDocxSerializer.setIsNoBase64(params.getIsNoBase64()); + m_oCDocxSerializer.setFontDir(params.getFontPath()); + + std::wstring sXmlOptions; + std::wstring sThemePath; // will be filled by 'CreateDocxFolders' method + std::wstring sMediaPath; // will be filled by 'CreateDocxFolders' method + std::wstring sEmbedPath; // will be filled by 'CreateDocxFolders' method + + m_oCDocxSerializer.CreateDocxFolders(sTempDocx, sThemePath, sMediaPath, sEmbedPath); + nRes = m_oCDocxSerializer.loadFromFile(sFilePathIn, sTempDocx, sXmlOptions, sThemePath, sMediaPath, sEmbedPath) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + if (SUCCEEDED_X2T(nRes)) + { + std::wstring sTempUnencrypted = convertParams.m_sTempDir + FILE_SEPARATOR_STR + wsFilePathInFilename + L"_unencrypted"; + NSDirectory::CreateDirectory(sTempUnencrypted); + + std::wstring sOldTempDir = convertParams.m_sTempDir; + convertParams.m_sTempDir = sTempUnencrypted; + nRes = dir2zipMscrypt(sTempDocx, sFilePathOut, params, convertParams); + convertParams.m_sTempDir = sOldTempDir; + } + } + else if (NSDoctRenderer::DoctRendererFormat::FormatFile::PDF == eTypeTo) + { + sFilePathOut += _T(".pdf"); + + NSFonts::IApplicationFonts* pApplicationFonts = createApplicationFonts(params); + CPdfFile pdfWriter(pApplicationFonts); + pdfWriter.CreatePdf(params.getIsPDFA()); + pdfWriter.SetTempDirectory(convertParams.m_sTempDir); + pdfWriter.SetDocumentInfo(params.getTitle(), L"", L"", L""); + + CConvertFromBinParams oBufferParams; + oBufferParams.m_sThemesDirectory = convertParams.m_sThemesDir; + + std::wstring documentID = params.getDocumentID(); + if (false == documentID.empty()) + pdfWriter.SetDocumentID(documentID); + + std::wstring password = params.getSavePassword(); + if (false == password.empty()) + pdfWriter.SetPassword(password); + + int nReg = (convertParams.m_bIsPaid == false) ? 0 : 1; + nRes = (S_OK == pdfWriter.OnlineWordToPdfFromBinary(sFilePathIn, sFilePathOut, &oBufferParams)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + RELEASEOBJECT(pApplicationFonts); + } + else if (NSDoctRenderer::DoctRendererFormat::FormatFile::HTML == eTypeTo) + { + sFilePathOut += _T(".html"); + nRes = NSFile::CFileBinary::Copy(sFilePathIn, sFilePathOut) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + if (0 != nRes) + break; + sResult = string_replaceAll(sResult, L"\"" + sFilePathIn + L"\"", L"\"" + NSSystemPath::GetFileName(sFilePathOut) + L"\""); + } + } + } + } + if (SUCCEEDED_X2T(nRes)) + NSFile::CFileBinary::SaveToFile(sTo, sResult); + } + return nRes; + } + + // from docxDir + _UINT32 fromDocxDir(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, InputParams ¶ms, ConvertParams& convertParams) { _UINT32 nRes = 0; std::wstring sFromWithChanges = sFrom; @@ -4087,10 +4392,16 @@ namespace NExtractTools if (0 != (AVS_OFFICESTUDIO_FILE_DOCUMENT & nFormatTo) && !bIsNeedDoct) { - if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX == nFormatTo || - AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF == nFormatTo) + if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatTo || + AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == nFormatTo || + AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX == nFormatTo || + AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM == nFormatTo || + AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM == nFormatTo || + AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF == nFormatTo) { - if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM == nFormatTo) + if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == nFormatTo || + AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX == nFormatTo || + AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM == nFormatTo) { std::wstring sCTFrom = L"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"; switch (*params.m_nFormatFrom) @@ -4132,93 +4443,96 @@ namespace NExtractTools } if (SUCCEEDED_X2T(nRes)) { - nRes = dir2zipMscrypt(sFromWithChanges, sTo, sTemp, params); + nRes = dir2zipMscrypt(sFromWithChanges, sTo, params, convertParams); } } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC == nFormatTo) { - nRes = docx_dir2doc(sFromWithChanges, sTo, sTemp, params); + nRes = docx_dir2doc(sFromWithChanges, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT == nFormatTo) { - nRes = docx_dir2odt(sFromWithChanges, sTo, sTemp, params, false); + convertParams.m_bIsTemplate = false; + nRes = docx_dir2odt(sFromWithChanges, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_OTT == nFormatTo) { - nRes = docx_dir2odt(sFromWithChanges, sTo, sTemp, params, true); + convertParams.m_bIsTemplate = true; + nRes = docx_dir2odt(sFromWithChanges, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF == nFormatTo) { - nRes = docx_dir2rtf(sFromWithChanges, sTo, sTemp, params); + nRes = docx_dir2rtf(sFromWithChanges, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT == nFormatTo) { - nRes = docx_dir2txt(sFromWithChanges, sTo, sTemp, params); + nRes = docx_dir2txt(sFromWithChanges, sTo, params, convertParams); } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; } else if (AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo) { - nRes = dir2zipMscrypt(sFrom, sTo, sTemp, params); + nRes = dir2zipMscrypt(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_CANVAS_WORD == nFormatTo) { - nRes = docx_dir2doct_bin(sFromWithChanges, sTo, sTemp, params, sDocxFile); + nRes = docx_dir2doct_bin(sFromWithChanges, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY == nFormatTo) { - nRes = docx_dir2doct(sFromWithChanges, sTo, sTemp, params, sDocxFile); + nRes = docx_dir2doct(sFromWithChanges, sTo, params, convertParams); } else if (bIsNeedDoct) { if (params.needConvertToOrigin(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX)) { - std::wstring sToRender = sDocxFile; + std::wstring sToRender = convertParams.m_sTempParamOOXMLFile; if (sToRender.empty()) { - sToRender = sTemp + FILE_SEPARATOR_STR + _T("toRender.docx"); + sToRender = combinePath(convertParams.m_sTempDir, L"toRender.docx"); nRes = dir2zip(sFromWithChanges, sToRender); } NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT; + convertParams.m_sInternalMediaDirectory = sFrom; if (AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB == nFormatTo) { - nRes = doct_bin2epub(eFromType, sToRender, sTo, sTemp, sThemeDir, params, sFrom); + nRes = doct_bin2epub(sToRender, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2 == nFormatTo) { - nRes = doct_bin2fb(eFromType, sToRender, sTo, sTemp, sThemeDir, params, sFrom); + nRes = doct_bin2fb(sToRender, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML == nFormatTo) { - nRes = doct_bin2html(eFromType, sToRender, sTo, sTemp, bPaid, sThemeDir, params, sFrom); + nRes = doct_bin2html(sToRender, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML_IN_CONTAINER == nFormatTo) { - nRes = doct_bin2html_zip(eFromType, sToRender, sTo, sTemp, bPaid, sThemeDir, params, sFrom); + nRes = doct_bin2html_zip(sToRender, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) { - nRes = doct_bin2pdf(eFromType, sToRender, sTo, sTemp, bPaid, sThemeDir, params, sFrom); + nRes = doct_bin2pdf(eFromType, sToRender, sTo, params, convertParams); } else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) { - nRes = doct_bin2image(eFromType, sToRender, sTo, sTemp, bPaid, sThemeDir, params, sFrom); + nRes = doct_bin2image(eFromType, sToRender, sTo, params, convertParams); } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; } else { - std::wstring sDoctDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); + std::wstring sDoctDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); NSDirectory::CreateDirectory(sDoctDir); - std::wstring sTFile = sDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); + std::wstring sTFile = combinePath(sDoctDir, L"Editor.bin"); - nRes = docx_dir2doct_bin(sFromWithChanges, sTFile, sTemp, params, sDocxFile); + nRes = docx_dir2doct_bin(sFromWithChanges, sTFile, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - nRes = fromDoctBin(sTFile, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params); + nRes = fromDoctBin(sTFile, sTo, nFormatTo, params, convertParams); } } } @@ -4226,7 +4540,8 @@ namespace NExtractTools nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; return nRes; } - _UINT32 fromDoctBin(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms) + + _UINT32 fromDoctBin(const std::wstring& sFrom, const std::wstring& sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams) { _UINT32 nRes = 0; if (AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY == nFormatTo) @@ -4236,46 +4551,42 @@ namespace NExtractTools } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB == nFormatTo) { - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT; - nRes = doct_bin2epub(eFromType, sFrom, sTo, sTemp, sThemeDir, params); + nRes = doct_bin2epub(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2 == nFormatTo) { - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT; - nRes = doct_bin2fb(eFromType, sFrom, sTo, sTemp, sThemeDir, params); + nRes = doct_bin2fb(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML == nFormatTo) { - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT; - nRes = doct_bin2html(eFromType, sFrom, sTo, sTemp, bPaid, sThemeDir, params); + nRes = doct_bin2html(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML_IN_CONTAINER == nFormatTo) { - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT; - nRes = doct_bin2html_zip(eFromType, sFrom, sTo, sTemp, bPaid, sThemeDir, params); + nRes = doct_bin2html_zip(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) { NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT; - nRes = doct_bin2pdf(eFromType, sFrom, sTo, sTemp, bPaid, sThemeDir, params); + nRes = doct_bin2pdf(eFromType, sFrom, sTo, params, convertParams); } else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) { NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT; - nRes = doct_bin2image(eFromType, sFrom, sTo, sTemp, bPaid, sThemeDir, params); + nRes = doct_bin2image(eFromType, sFrom, sTo, params, convertParams); } else if (0 != (AVS_OFFICESTUDIO_FILE_DOCUMENT & nFormatTo)) { - std::wstring sDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); - + std::wstring sDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); if (true == NSDirectory::CreateDirectory(sDocxDir)) { params.m_bMacro = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM == nFormatTo; - nRes = doct_bin2docx_dir(sFrom, sTo, sDocxDir, sThemeDir, params); + convertParams.m_sTempResultOOXMLDirectory = sDocxDir; + nRes = doct_bin2docx_dir(sFrom, sTo, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - nRes = fromDocxDir(sDocxDir, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params, L""); + nRes = fromDocxDir(sDocxDir, sTo, nFormatTo, params, convertParams); } } else @@ -4287,67 +4598,59 @@ namespace NExtractTools nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; return nRes; } - _UINT32 fromDocument(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 fromDocument(const std::wstring& sFrom, int nFormatFrom, InputParams& params, ConvertParams& convertParams) { std::wstring sTo = *params.m_sFileTo; int nFormatTo = AVS_OFFICESTUDIO_FILE_UNKNOWN; if (NULL != params.m_nFormatTo) nFormatTo = *params.m_nFormatTo; - std::wstring sFontPath; - if (NULL != params.m_sFontDir) - sFontPath = *params.m_sFontDir; - std::wstring sThemeDir; - if (NULL != params.m_sThemeDir) - sThemeDir = *params.m_sThemeDir; - bool bPaid = true; - if (NULL != params.m_bPaid) - bPaid = *params.m_bPaid; _UINT32 nRes = 0; if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_FLAT == nFormatFrom) { if (AVS_OFFICESTUDIO_FILE_CANVAS_WORD == nFormatTo) { - nRes = docxflat2doct_bin(sFrom, sTo, sTemp, params); + nRes = docxflat2doct_bin(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT == nFormatTo) { - nRes = docxflat2odt(sFrom, sTo, sTemp, params); + nRes = docxflat2odt(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatTo) { - nRes = docxflat2docx(sFrom, sTo, sTemp, params); + nRes = docxflat2docx(sFrom, sTo, params, convertParams); } else { - std::wstring sDoctDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); + std::wstring sDoctDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); NSDirectory::CreateDirectory(sDoctDir); - std::wstring sTFile = sDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); + std::wstring sTFile = combinePath(sDoctDir, L"Editor.bin"); if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_FLAT == nFormatFrom) - nRes = docxflat2doct_bin(sFrom, sTFile, sTemp, params); + nRes = docxflat2doct_bin(sFrom, sTFile, params, convertParams); else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; if (SUCCEEDED_X2T(nRes)) { - nRes = fromDoctBin(sTFile, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params); + nRes = fromDoctBin(sTFile, sTo, nFormatTo, params, convertParams); } } } else { std::wstring sDocxFile; - std::wstring sDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); + std::wstring sDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sDocxDir); if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatFrom || AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM == nFormatFrom || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF == nFormatFrom) { sDocxFile = sFrom; + convertParams.m_sTempParamOOXMLFile = sDocxFile; if (params.getFromChanges()) { params.setFromChanges(false); - nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, sThemeDir, sDocxFile, params); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, sDocxFile, params, convertParams); } nRes = zip2dir(sDocxFile, sDocxDir); } @@ -4356,7 +4659,7 @@ namespace NExtractTools if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM == nFormatTo) { - nRes = docm2docx_dir(sFrom, sDocxDir, params); + nRes = docm2docx_dir(sFrom, sDocxDir, params, convertParams); } else { @@ -4365,135 +4668,146 @@ namespace NExtractTools } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX == nFormatFrom) { - nRes = dotx2docx_dir(sFrom, sDocxDir, params); + nRes = dotx2docx_dir(sFrom, sDocxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM == nFormatFrom) { if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM == nFormatTo) { - nRes = dotm2docx_dir(sFrom, sDocxDir, params); + nRes = dotm2docx_dir(sFrom, sDocxDir, params, convertParams); } else { - nRes = dotm2docm_dir(sFrom, sDocxDir, params); + nRes = dotm2docm_dir(sFrom, sDocxDir, params, convertParams); } } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC == nFormatFrom) { if (params.m_bMacro) { - nRes = doc2docm_dir(sFrom, sDocxDir, sTemp, params); + nRes = doc2docm_dir(sFrom, sDocxDir, params, convertParams); } else { - nRes = doc2docx_dir(sFrom, sDocxDir, sTemp, params); + nRes = doc2docx_dir(sFrom, sDocxDir, params, convertParams); } } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT == nFormatFrom || AVS_OFFICESTUDIO_FILE_DOCUMENT_OTT == nFormatFrom) { - nRes = odf2oox_dir(sFrom, sDocxDir, sTemp, params); + nRes = odf2oox_dir(sFrom, sDocxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT_FLAT == nFormatFrom) { - nRes = odf_flat2oox_dir(sFrom, sDocxDir, sTemp, params); + nRes = odf_flat2oox_dir(sFrom, sDocxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF == nFormatFrom) { - nRes = rtf2docx_dir(sFrom, sDocxDir, sTemp, params); + nRes = rtf2docx_dir(sFrom, sDocxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT == nFormatFrom || AVS_OFFICESTUDIO_FILE_DOCUMENT_XML == nFormatFrom) { - nRes = txt2docx_dir(sFrom, sDocxDir, sTemp, params); + nRes = txt2docx_dir(sFrom, sDocxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2 == nFormatFrom) { - nRes = fb2docx_dir(sFrom, sDocxDir, sTemp, params); + nRes = fb2docx_dir(sFrom, sDocxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB == nFormatFrom) { - nRes = epub2docx_dir(sFrom, sDocxDir, sTemp, params); + nRes = epub2docx_dir(sFrom, sDocxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML == nFormatFrom) { - nRes = html2docx_dir(sFrom, sDocxDir, sTemp, params); + nRes = html2docx_dir(sFrom, sDocxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML_IN_CONTAINER == nFormatFrom) { - nRes = html_zip2docx_dir(sFrom, sDocxDir, sTemp, params); + nRes = html_zip2docx_dir(sFrom, sDocxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_PACKAGE == nFormatFrom) { - nRes = package2ooxml_dir(sFrom, sDocxDir, sTemp, params); + nRes = package2ooxml_dir(sFrom, sDocxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_MHT == nFormatFrom) { - nRes = mht2docx_dir(sFrom, sDocxDir, sTemp, params); + nRes = mht2docx_dir(sFrom, sDocxDir, params, convertParams); } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; if (SUCCEEDED_X2T(nRes)) { - nRes = fromDocxDir(sDocxDir, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params, sDocxFile); + nRes = fromDocxDir(sDocxDir, sTo, nFormatTo, params, convertParams); } } return nRes; } - _UINT32 fromXlsbXlsxDir( - const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms, const std::wstring &sXlsxFile) + // from xlsxDir + _UINT32 fromXlsbXlsxDir(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, InputParams ¶ms, ConvertParams& convertParams) { _UINT32 nRes = S_OK; if (AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo) { - nRes = dir2zipMscrypt(sFrom, sTo, sTemp, params); + nRes = dir2zipMscrypt(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_OTHER_JSON == nFormatTo) { - nRes = xlsx_dir2xlst_bin(sFrom, sTo, params, true, sXlsxFile); + convertParams.m_bTempIsXmlOptions = true; + nRes = xlsx_dir2xlst_bin(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_CANVAS_SPREADSHEET == nFormatTo) { - nRes = xlsx_dir2xlst_bin(sFrom, sTo, params, true, sXlsxFile); + convertParams.m_bTempIsXmlOptions = true; + nRes = xlsx_dir2xlst_bin(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_TEAMLAB_XLSY == nFormatTo) { - nRes = xlsx_dir2xlst(sFrom, sTo, sTemp, params, true, sXlsxFile); + convertParams.m_bTempIsXmlOptions = true; + nRes = xlsx_dir2xlst(sFrom, sTo, params, convertParams); } else if ((0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo || AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV == nFormatTo) { - if (params.needConvertToOrigin(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX) && ((0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo)) + if (params.needConvertToOrigin(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX) && + ((0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo)) { - std::wstring sToRender = sXlsxFile; + std::wstring sToRender = convertParams.m_sTempParamOOXMLFile; if (sToRender.empty()) { - sToRender = sTemp + FILE_SEPARATOR_STR + _T("toRender.xlsx"); + sToRender = combinePath(convertParams.m_sTempDir, L"toRender.xlsx"); nRes = dir2zip(sFrom, sToRender); } NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::XLST; if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) { - nRes = doct_bin2pdf(eFromType, sToRender, sTo, sTemp, bPaid, sThemeDir, params, sFrom); + nRes = doct_bin2pdf(eFromType, sToRender, sTo, params, convertParams); } else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) { - nRes = doct_bin2image(eFromType, sToRender, sTo, sTemp, bPaid, sThemeDir, params, sFrom); + nRes = doct_bin2image(eFromType, sToRender, sTo, params, convertParams); } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; } else { - std::wstring sXlstDir = sTemp + FILE_SEPARATOR_STR + _T("xlst_unpacked"); + std::wstring sXlstDir = combinePath(convertParams.m_sTempDir, L"xlst_unpacked"); NSDirectory::CreateDirectory(sXlstDir); - std::wstring sTFile = sXlstDir + FILE_SEPARATOR_STR + _T("Editor.bin"); + std::wstring sTFile = combinePath(sXlstDir, L"Editor.bin"); + if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV == nFormatTo) - nRes = xlsx_dir2xlst_bin(sFrom, sTFile, params, false, sXlsxFile); + { + convertParams.m_bTempIsXmlOptions = false; + nRes = xlsx_dir2xlst_bin(sFrom, sTFile, params, convertParams); + } else - nRes = xlsx_dir2xlst_bin(sFrom, sTFile, params, true, sXlsxFile); + { + convertParams.m_bTempIsXmlOptions = true; + nRes = xlsx_dir2xlst_bin(sFrom, sTFile, params, convertParams); + } if (SUCCEEDED_X2T(nRes)) { - nRes = fromXlstBin(sTFile, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params); + nRes = fromXlstBin(sTFile, sTo, nFormatTo, params, convertParams); } } } @@ -4501,16 +4815,19 @@ namespace NExtractTools nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; return nRes; } - _UINT32 fromXlsxDir( - const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms, const std::wstring &sXlsxFile) + _UINT32 fromXlsxDir(const std::wstring& sFrom, const std::wstring& sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams) { _UINT32 nRes = 0; if (0 != (AVS_OFFICESTUDIO_FILE_SPREADSHEET & nFormatTo) && AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV != nFormatTo) { - if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX == nFormatTo || AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM == nFormatTo || AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX == nFormatTo || + if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX == nFormatTo || + AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM == nFormatTo || + AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX == nFormatTo || AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM == nFormatTo) { - if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM == nFormatTo || AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX == nFormatTo || AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM == nFormatTo) + if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM == nFormatTo || + AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX == nFormatTo || + AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM == nFormatTo) { std::wstring sCTFrom = _T("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"); switch (*params.m_nFormatFrom) @@ -4542,12 +4859,13 @@ namespace NExtractTools } if (SUCCEEDED_X2T(nRes)) { - nRes = dir2zipMscrypt(sFrom, sTo, sTemp, params); + nRes = dir2zipMscrypt(sFrom, sTo, params, convertParams); } } else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS == nFormatTo) { - nRes = xlsx_dir2ods(sFrom, sTo, sTemp, params, false); + convertParams.m_bIsTemplate = false; + nRes = xlsx_dir2ods(sFrom, sTo, params, convertParams); } // else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV == nFormatTo) //{ @@ -4555,18 +4873,19 @@ namespace NExtractTools // } else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_OTS == nFormatTo) { - nRes = xlsx_dir2ods(sFrom, sTo, sTemp, params, true); + convertParams.m_bIsTemplate = true; + nRes = xlsx_dir2ods(sFrom, sTo, params, convertParams); } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; } else { - nRes = fromXlsbXlsxDir(sFrom, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params, sXlsxFile); + nRes = fromXlsbXlsxDir(sFrom, sTo, nFormatTo, params, convertParams); } return nRes; } - _UINT32 fromXlstBin(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms) + _UINT32 fromXlstBin(const std::wstring& sFrom, const std::wstring& sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams) { _UINT32 nRes = 0; if (AVS_OFFICESTUDIO_FILE_TEAMLAB_XLSY == nFormatTo) @@ -4576,29 +4895,30 @@ namespace NExtractTools } else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV == nFormatTo) { - nRes = xlst_bin2csv(sFrom, sTo, sTemp, sThemeDir, params); + nRes = xlst_bin2csv(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) { NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::XLST; - nRes = doct_bin2pdf(eFromType, sFrom, sTo, sTemp, bPaid, sThemeDir, params); + nRes = doct_bin2pdf(eFromType, sFrom, sTo, params, convertParams); } else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) { NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::XLST; - nRes = doct_bin2image(eFromType, sFrom, sTo, sTemp, bPaid, sThemeDir, params); + nRes = doct_bin2image(eFromType, sFrom, sTo, params, convertParams); } else if (0 != (AVS_OFFICESTUDIO_FILE_SPREADSHEET & nFormatTo)) { - std::wstring sXlsxDir = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); + std::wstring sXlsxDir = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); if (true == NSDirectory::CreateDirectory(sXlsxDir)) { params.m_bMacro = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM == nFormatTo || AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM == nFormatTo; - nRes = xlst_bin2xlsx_dir(sFrom, sTo, sXlsxDir, sThemeDir, params); + convertParams.m_sTempResultOOXMLDirectory = sXlsxDir; + nRes = xlst_bin2xlsx_dir(sFrom, sTo, params, convertParams); if (SUCCEEDED_X2T(nRes)) { std::wstring sXlsxFile; - nRes = fromXlsxDir(sXlsxDir, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params, sXlsxFile); + nRes = fromXlsxDir(sXlsxDir, sTo, nFormatTo, params, convertParams); } } else @@ -4610,7 +4930,7 @@ namespace NExtractTools nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; return nRes; } - _UINT32 fromSpreadsheet(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTemp, InputParams ¶ms) + _UINT32 fromSpreadsheet(const std::wstring& sFrom, int nFormatFrom, InputParams& params, ConvertParams& convertParams) { std::wstring sTo = *params.m_sFileTo; int nFormatTo = AVS_OFFICESTUDIO_FILE_UNKNOWN; @@ -4622,41 +4942,31 @@ namespace NExtractTools return AVS_FILEUTILS_ERROR_CONVERT_PARAMS; } - std::wstring sFontPath; - if (NULL != params.m_sFontDir) - sFontPath = *params.m_sFontDir; - std::wstring sThemeDir; - if (NULL != params.m_sThemeDir) - sThemeDir = *params.m_sThemeDir; - bool bPaid = true; - if (NULL != params.m_bPaid) - bPaid = *params.m_bPaid; - _UINT32 nRes = 0; - std::wstring sXlsxFile; - if ((AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV == nFormatFrom) && (AVS_OFFICESTUDIO_FILE_CANVAS_SPREADSHEET == nFormatTo || AVS_OFFICESTUDIO_FILE_OTHER_JSON == nFormatTo)) + if ((AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV == nFormatFrom) && + (AVS_OFFICESTUDIO_FILE_CANVAS_SPREADSHEET == nFormatTo || AVS_OFFICESTUDIO_FILE_OTHER_JSON == nFormatTo)) { - nRes = csv2xlst_bin(sFrom, sTo, params); + nRes = csv2xlst_bin(sFrom, sTo, params, convertParams); } else { - std::wstring sXlsxDir = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); + std::wstring sXlsxDir = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); NSDirectory::CreateDirectory(sXlsxDir); if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB == nFormatFrom && !((AVS_OFFICESTUDIO_FILE_CANVAS & nFormatTo) || (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo) || (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo))) { - nRes = xlsb2xlsx_dir(sFrom, sXlsxDir, sTemp, params); + nRes = xlsb2xlsx_dir(sFrom, sXlsxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX == nFormatFrom || AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB == nFormatFrom) { - sXlsxFile = sFrom; + convertParams.m_sTempParamOOXMLFile = sFrom; if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX == nFormatFrom && params.getFromChanges()) { params.setFromChanges(false); - nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::XLST, sThemeDir, sXlsxFile, params); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::XLST, convertParams.m_sTempParamOOXMLFile, params, convertParams); } - nRes = zip2dir(sXlsxFile, sXlsxDir); + nRes = zip2dir(convertParams.m_sTempParamOOXMLFile, sXlsxDir); if (!SUCCEEDED_X2T(nRes)) { // check crypt @@ -4665,7 +4975,7 @@ namespace NExtractTools { if (OfficeFileFormatChecker.nFileType == AVS_OFFICESTUDIO_FILE_OTHER_MS_OFFCRYPTO) { - std::wstring sResultDecryptFile = sTemp + FILE_SEPARATOR_STR + L"uncrypt_file.oox"; + std::wstring sResultDecryptFile = combinePath(convertParams.m_sTempDir, L"uncrypt_file.oox"); // test protect bool isOldPassword = params.hasPassword(); const std::wstring sOldPassword = params.getPassword(); @@ -4674,13 +4984,13 @@ namespace NExtractTools delete params.m_sPassword; params.m_sPassword = new std::wstring(L"VelvetSweatshop"); - nRes = mscrypt2oox(sFrom, sResultDecryptFile, sTemp, params); + nRes = mscrypt2oox(sFrom, sResultDecryptFile, params, convertParams); if (SUCCEEDED_X2T(nRes)) { nRes = zip2dir(sResultDecryptFile, sXlsxDir); if (SUCCEEDED_X2T(nRes)) { - sXlsxFile = sResultDecryptFile; + convertParams.m_sTempParamOOXMLFile = sResultDecryptFile; } } else @@ -4691,7 +5001,7 @@ namespace NExtractTools } } else if (OfficeFileFormatChecker.nFileType == AVS_OFFICESTUDIO_FILE_OTHER_MS_MITCRYPTO) - nRes = mitcrypt2oox(sFrom, sTo, sTemp, params); + nRes = mitcrypt2oox(sFrom, sTo, params, convertParams); } } } @@ -4699,7 +5009,7 @@ namespace NExtractTools { if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX == nFormatTo || AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX == nFormatTo) { - nRes = xlsm2xlsx_dir(sFrom, sXlsxDir, params); + nRes = xlsm2xlsx_dir(sFrom, sXlsxDir, params, convertParams); } else { @@ -4708,76 +5018,83 @@ namespace NExtractTools } else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX == nFormatFrom) { - nRes = xltx2xlsx_dir(sFrom, sXlsxDir, params); + nRes = xltx2xlsx_dir(sFrom, sXlsxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM == nFormatFrom) { if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX == nFormatTo || AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX == nFormatTo) { - nRes = xltm2xlsx_dir(sFrom, sXlsxDir, params); + nRes = xltm2xlsx_dir(sFrom, sXlsxDir, params, convertParams); } else { - nRes = xltm2xlsm_dir(sFrom, sXlsxDir, params); + nRes = xltm2xlsm_dir(sFrom, sXlsxDir, params, convertParams); } } else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS == nFormatFrom) { if (params.m_bMacro) { - nRes = xls2xlsm_dir(sFrom, sXlsxDir, sTemp, params); + nRes = xls2xlsm_dir(sFrom, sXlsxDir, params, convertParams); } else { - nRes = xls2xlsx_dir(sFrom, sXlsxDir, sTemp, params); + nRes = xls2xlsx_dir(sFrom, sXlsxDir, params, convertParams); } } else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_FLAT == nFormatFrom) { - nRes = xlsxflat2xlsx_dir(sFrom, sXlsxDir, sTemp, params); + nRes = xlsxflat2xlsx_dir(sFrom, sXlsxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS == nFormatFrom || AVS_OFFICESTUDIO_FILE_SPREADSHEET_OTS == nFormatFrom) { - nRes = odf2oox_dir(sFrom, sXlsxDir, sTemp, params); + nRes = odf2oox_dir(sFrom, sXlsxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS_FLAT == nFormatFrom) { - nRes = odf_flat2oox_dir(sFrom, sXlsxDir, sTemp, params); + nRes = odf_flat2oox_dir(sFrom, sXlsxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX_PACKAGE == nFormatFrom) { - nRes = package2ooxml_dir(sFrom, sXlsxDir, sTemp, params); + nRes = package2ooxml_dir(sFrom, sXlsxDir, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV == nFormatFrom) { - nRes = csv2xlsx_dir(sFrom, sXlsxDir, sTemp, params); + nRes = csv2xlsx_dir(sFrom, sXlsxDir, params, convertParams); *params.m_nFormatFrom = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX; } else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_XML == nFormatFrom) { - nRes = xml2xlsx_dir(sFrom, sXlsxDir, sTemp, params); + nRes = xml2xlsx_dir(sFrom, sXlsxDir, params, convertParams); } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; if (SUCCEEDED_X2T(nRes)) { - nRes = fromXlsxDir(sXlsxDir, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params, sXlsxFile); + nRes = fromXlsxDir(sXlsxDir, sTo, nFormatTo, params, convertParams); } } return nRes; } - _UINT32 fromPptxDir( - const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms, const std::wstring &sPptxFile) + // from pptx + _UINT32 fromPptxDir(const std::wstring& sFrom, const std::wstring& sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams) { _UINT32 nRes = 0; if (0 != (AVS_OFFICESTUDIO_FILE_PRESENTATION & nFormatTo)) { - if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX == nFormatTo || - AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM == nFormatTo) + if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM == nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX == nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM == nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM == nFormatTo) { - if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == nFormatTo || - AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM == nFormatTo) + if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM == nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX == nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM == nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM == nFormatTo) { std::wstring sCTFrom = _T("application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"); switch (*params.m_nFormatFrom) @@ -4821,65 +5138,69 @@ namespace NExtractTools } if (SUCCEEDED_X2T(nRes)) { - nRes = dir2zipMscrypt(sFrom, sTo, sTemp, params); + nRes = dir2zipMscrypt(sFrom, sTo, params, convertParams); } } // else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT == nFormatTo) else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP == nFormatTo) { - nRes = pptx_dir2odp(sFrom, sTo, sTemp, params, false); + convertParams.m_bIsTemplate = false; + nRes = pptx_dir2odp(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_OTP == nFormatTo) { - nRes = pptx_dir2odp(sFrom, sTo, sTemp, params, true); + convertParams.m_bIsTemplate = true; + nRes = pptx_dir2odp(sFrom, sTo, params, convertParams); } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; } else if (AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo) { - nRes = dir2zipMscrypt(sFrom, sTo, sTemp, params); + nRes = dir2zipMscrypt(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_CANVAS_PRESENTATION == nFormatTo) { - nRes = pptx_dir2pptt_bin(sFrom, sTo, sTemp, params, sPptxFile); + nRes = pptx_dir2pptt_bin(sFrom, sTo, params, convertParams); } else if (AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY == nFormatTo) { - nRes = pptx_dir2pptt(sFrom, sTo, sTemp, params, sPptxFile); + nRes = pptx_dir2pptt(sFrom, sTo, params, convertParams); } else if ((0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) { if (params.needConvertToOrigin(AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX)) { - std::wstring sToRender = sPptxFile; + std::wstring sToRender = convertParams.m_sTempParamOOXMLFile; if (sToRender.empty()) { - sToRender = sTemp + FILE_SEPARATOR_STR + _T("toRender.pptx"); + sToRender = combinePath(convertParams.m_sTempDir, L"toRender.pptx"); nRes = dir2zip(sFrom, sToRender); } NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::PPTT; if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) { - nRes = doct_bin2pdf(eFromType, sToRender, sTo, sTemp, bPaid, sThemeDir, params, sFrom); + convertParams.m_sInternalMediaDirectory = sFrom; + nRes = doct_bin2pdf(eFromType, sToRender, sTo, params, convertParams); } else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) { - nRes = doct_bin2image(eFromType, sToRender, sTo, sTemp, bPaid, sThemeDir, params, sFrom); + convertParams.m_sInternalMediaDirectory = sFrom; + nRes = doct_bin2image(eFromType, sToRender, sTo, params, convertParams); } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; } else { - std::wstring sPpttDir = sTemp + FILE_SEPARATOR_STR + _T("pptt_unpacked"); + std::wstring sPpttDir = combinePath(convertParams.m_sTempDir, L"pptt_unpacked"); NSDirectory::CreateDirectory(sPpttDir); - std::wstring sTFile = sPpttDir + FILE_SEPARATOR_STR + _T("Editor.bin"); + std::wstring sTFile = combinePath(sPpttDir, L"Editor.bin"); - nRes = pptx_dir2pptt_bin(sFrom, sTFile, sTemp, params, sPptxFile); + nRes = pptx_dir2pptt_bin(sFrom, sTFile, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - nRes = fromPpttBin(sTFile, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params); + nRes = fromPpttBin(sTFile, sTo, nFormatTo, params, convertParams); } } } @@ -4887,7 +5208,170 @@ namespace NExtractTools nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; return nRes; } - _UINT32 fromVsdxDir(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams& params, const std::wstring &sPptxFile) + _UINT32 fromPpttBin(const std::wstring& sFrom, const std::wstring& sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams) + { + _UINT32 nRes = 0; + if (AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY == nFormatTo) + { + std::wstring sFromDir = NSDirectory::GetFolderPath(sFrom); + nRes = dir2zip(sFromDir, sTo); + } + else if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) + { + NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::PPTT; + nRes = doct_bin2pdf(eFromType, sFrom, sTo, params, convertParams); + } + else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) + { + NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::PPTT; + nRes = doct_bin2image(eFromType, sFrom, sTo, params, convertParams); + } + else if (0 != (AVS_OFFICESTUDIO_FILE_PRESENTATION & nFormatTo)) + { + std::wstring sPptxDir = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); + + if (true == NSDirectory::CreateDirectory(sPptxDir)) + { + params.m_bMacro = AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM == nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM == nFormatTo || + AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM == nFormatTo; + + convertParams.m_sTempResultOOXMLDirectory = sPptxDir; + nRes = pptt_bin2pptx_dir(sFrom, sTo, params, convertParams); + if (SUCCEEDED_X2T(nRes)) + { + nRes = fromPptxDir(sPptxDir, sTo, nFormatTo, params, convertParams); + } + } + else + { + nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; + } + } + else + nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; + return nRes; + } + _UINT32 fromPresentation(const std::wstring& sFrom, int nFormatFrom, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTo = *params.m_sFileTo; + + int nFormatTo = AVS_OFFICESTUDIO_FILE_UNKNOWN; + if (NULL != params.m_nFormatTo) + nFormatTo = *params.m_nFormatTo; + + _UINT32 nRes = 0; + std::wstring sPptxDir = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); + NSDirectory::CreateDirectory(sPptxDir); + + if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatFrom) + { + convertParams.m_sTempParamOOXMLFile = sFrom; + if (params.getFromChanges()) + { + params.setFromChanges(false); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::PPTT, convertParams.m_sTempParamOOXMLFile, params, convertParams); + } + nRes = zip2dir(convertParams.m_sTempParamOOXMLFile, sPptxDir); + } + else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM == nFormatFrom) + { + if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == nFormatTo) + { + nRes = pptm2pptx_dir(sFrom, sPptxDir, params, convertParams); + } + else + { + nRes = zip2dir(sFrom, sPptxDir); + } + } + else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM == nFormatFrom) + { + if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == nFormatTo) + { + nRes = ppsm2pptx_dir(sFrom, sPptxDir, params, convertParams); + } + else + { + nRes = ppsm2pptm_dir(sFrom, sPptxDir, params, convertParams); + } + } + else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT == nFormatFrom) + { + nRes = ppt2pptx_dir(sFrom, sPptxDir, params, convertParams); + } + else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP == nFormatFrom || AVS_OFFICESTUDIO_FILE_PRESENTATION_OTP == nFormatFrom) + { + nRes = odf2oox_dir(sFrom, sPptxDir, params, convertParams); + } + else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP_FLAT == nFormatFrom) + { + nRes = odf_flat2oox_dir(sFrom, sPptxDir, params, convertParams); + } + else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX == nFormatFrom) + { + nRes = ppsx2pptx_dir(sFrom, sPptxDir, params, convertParams); + } + else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == nFormatFrom) + { + nRes = potx2pptx_dir(sFrom, sPptxDir, params, convertParams); + } + else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM == nFormatFrom) + { + if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == nFormatTo) + { + nRes = potm2pptx_dir(sFrom, sPptxDir, params, convertParams); + } + else + { + nRes = potm2pptm_dir(sFrom, sPptxDir, params, convertParams); + } + } + else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX_PACKAGE == nFormatFrom) + { + nRes = package2ooxml_dir(sFrom, sPptxDir, params, convertParams); + } + else + nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; + if (SUCCEEDED_X2T(nRes)) + { + nRes = fromPptxDir(sPptxDir, sTo, nFormatTo, params, convertParams); + } + return nRes; + } + + // from T + _UINT32 fromT(const std::wstring& sFrom, int nFormatFrom, const std::wstring& sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams) + { + _UINT32 nRes = 0; + if (0 != (AVS_OFFICESTUDIO_FILE_CANVAS & nFormatTo)) + { + std::wstring sTDir = NSDirectory::GetFolderPath(sTo); + nRes = zip2dir(sFrom, sTDir); + } + else + { + std::wstring sTDir = combinePath(convertParams.m_sTempDir, L"doct_unpacked"); + NSDirectory::CreateDirectory(sTDir); + std::wstring sTFile = combinePath(sTDir, L"Editor.bin"); + nRes = zip2dir(sFrom, sTDir); + if (SUCCEEDED_X2T(nRes)) + { + if (AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY == nFormatFrom) + nRes = fromDoctBin(sTFile, sTo, nFormatTo, params, convertParams); + else if (AVS_OFFICESTUDIO_FILE_TEAMLAB_XLSY == nFormatFrom) + nRes = fromXlstBin(sTFile, sTo, nFormatTo, params, convertParams); + else if (AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY == nFormatFrom) + nRes = fromPpttBin(sTFile, sTo, nFormatTo, params, convertParams); + else + nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; + } + } + return nRes; + } + + // visio + _UINT32 fromVsdxDir(const std::wstring& sFrom, const std::wstring& sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams) { _UINT32 nRes = 0; if (0 != (AVS_OFFICESTUDIO_FILE_DRAW & nFormatTo)) @@ -4896,7 +5380,7 @@ namespace NExtractTools { if (SUCCEEDED_X2T(nRes)) { - nRes = dir2zipMscrypt(sFrom, sTo, sTemp, params); + nRes = dir2zipMscrypt(sFrom, sTo, params, convertParams); } } else @@ -4906,172 +5390,26 @@ namespace NExtractTools nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; return nRes; } - _UINT32 fromPpttBin(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams& params) - { - _UINT32 nRes = 0; - if (AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY == nFormatTo) - { - std::wstring sFromDir = NSDirectory::GetFolderPath(sFrom); - nRes = dir2zip(sFromDir, sTo); - } - else if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) - { - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::PPTT; - nRes = doct_bin2pdf(eFromType, sFrom, sTo, sTemp, bPaid, sThemeDir, params); - } - else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) - { - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::PPTT; - nRes = doct_bin2image(eFromType, sFrom, sTo, sTemp, bPaid, sThemeDir, params); - } - else if (0 != (AVS_OFFICESTUDIO_FILE_PRESENTATION & nFormatTo)) - { - std::wstring sPptxDir = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); - if (true == NSDirectory::CreateDirectory(sPptxDir)) - { - params.m_bMacro = AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM == nFormatTo; - nRes = pptt_bin2pptx_dir(sFrom, sTo, sPptxDir, sThemeDir, params); - if (SUCCEEDED_X2T(nRes)) - { - nRes = fromPptxDir(sPptxDir, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params, L""); - } - } - else - { - nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; - } - } - else - nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; - return nRes; - } - _UINT32 fromPresentation(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTemp, InputParams& params) - { - std::wstring sTo = *params.m_sFileTo; - - int nFormatTo = AVS_OFFICESTUDIO_FILE_UNKNOWN; - if (NULL != params.m_nFormatTo) - nFormatTo = *params.m_nFormatTo; - std::wstring sFontPath; - if (NULL != params.m_sFontDir) - sFontPath = *params.m_sFontDir; - std::wstring sThemeDir; - if (NULL != params.m_sThemeDir) - sThemeDir = *params.m_sThemeDir; - bool bPaid = true; - if (NULL != params.m_bPaid) - bPaid = *params.m_bPaid; - - _UINT32 nRes = 0; - std::wstring sPptxFile; - std::wstring sPptxDir = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); - NSDirectory::CreateDirectory(sPptxDir); - - if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatFrom) - { - sPptxFile = sFrom; - if (params.getFromChanges()) - { - params.setFromChanges(false); - nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::PPTT, sThemeDir, sPptxFile, params); - } - nRes = zip2dir(sPptxFile, sPptxDir); - } - else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM == nFormatFrom) - { - if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == nFormatTo) - { - nRes = pptm2pptx_dir(sFrom, sPptxDir, params); - } - else - { - nRes = zip2dir(sFrom, sPptxDir); - } - } - else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM == nFormatFrom) - { - if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == nFormatTo) - { - nRes = ppsm2pptx_dir(sFrom, sPptxDir, params); - } - else - { - nRes = ppsm2pptm_dir(sFrom, sPptxDir, params); - } - } - else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT == nFormatFrom) - { - nRes = ppt2pptx_dir(sFrom, sPptxDir, sTemp, params); - } - else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP == nFormatFrom || AVS_OFFICESTUDIO_FILE_PRESENTATION_OTP == nFormatFrom) - { - nRes = odf2oox_dir(sFrom, sPptxDir, sTemp, params); - } - else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP_FLAT == nFormatFrom) - { - nRes = odf_flat2oox_dir(sFrom, sPptxDir, sTemp, params); - } - else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSX == nFormatFrom) - { - nRes = ppsx2pptx_dir(sFrom, sPptxDir, params); - } - else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == nFormatFrom) - { - nRes = potx2pptx_dir(sFrom, sPptxDir, params); - } - else if (AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM == nFormatFrom) - { - if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatTo || AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX == nFormatTo) - { - nRes = potm2pptx_dir(sFrom, sPptxDir, params); - } - else - { - 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; - if (SUCCEEDED_X2T(nRes)) - { - nRes = fromPptxDir(sPptxDir, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params, sPptxFile); - } - return nRes; - } - - _UINT32 fromDraw(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTemp, InputParams& params) + _UINT32 fromDraw(const std::wstring& sFrom, int nFormatFrom, InputParams& params, ConvertParams& convertParams) { std::wstring sTo = *params.m_sFileTo; int nFormatTo = AVS_OFFICESTUDIO_FILE_UNKNOWN; if (NULL != params.m_nFormatTo) nFormatTo = *params.m_nFormatTo; - std::wstring sFontPath; - if (NULL != params.m_sFontDir) - sFontPath = *params.m_sFontDir; - std::wstring sThemeDir; - if (NULL != params.m_sThemeDir) - sThemeDir = *params.m_sThemeDir; - bool bPaid = true; - if (NULL != params.m_bPaid) - bPaid = *params.m_bPaid; _UINT32 nRes = 0; std::wstring sVsdxFile; - std::wstring sVsdxDir = sTemp + FILE_SEPARATOR_STR + _T("xsdx_unpacked"); + std::wstring sVsdxDir = combinePath(convertParams.m_sTempDir, L"xsdx_unpacked"); NSDirectory::CreateDirectory(sVsdxDir); if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatFrom) { - sVsdxFile = sFrom; + convertParams.m_sTempParamOOXMLFile = sFrom; if (params.getFromChanges()) { params.setFromChanges(false); - nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::VSDT, sThemeDir, sVsdxFile, params); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::VSDT, convertParams.m_sTempParamOOXMLFile, params, convertParams); } nRes = zip2dir(sVsdxFile, sVsdxDir); } @@ -5079,458 +5417,13 @@ namespace NExtractTools nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; if (SUCCEEDED_X2T(nRes)) { - nRes = fromVsdxDir(sVsdxDir, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params, sVsdxFile); - } - return nRes; - } - - _UINT32 fromT(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams& params) - { - _UINT32 nRes = 0; - if (0 != (AVS_OFFICESTUDIO_FILE_CANVAS & nFormatTo)) - { - std::wstring sTDir = NSDirectory::GetFolderPath(sTo); - nRes = zip2dir(sFrom, sTDir); - } - else - { - std::wstring sTDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - NSDirectory::CreateDirectory(sTDir); - std::wstring sTFile = sTDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - nRes = zip2dir(sFrom, sTDir); - if (SUCCEEDED_X2T(nRes)) - { - if (AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY == nFormatFrom) - nRes = fromDoctBin(sTFile, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params); - else if (AVS_OFFICESTUDIO_FILE_TEAMLAB_XLSY == nFormatFrom) - nRes = fromXlstBin(sTFile, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params); - else if (AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY == nFormatFrom) - nRes = fromPpttBin(sTFile, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params); - else - nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; - } - } - return nRes; - } - - bool applyChangesPdf(const std::wstring& sFrom, const std::wstring& sTo, - NSFonts::IApplicationFonts* pApplicationFonts, - const std::wstring &sTemp, InputParams& params, - std::vector& changes) - { - CPdfFile oPdfResult(pApplicationFonts); - oPdfResult.SetTempDirectory(sTemp); - oPdfResult.SetDocumentInfo(params.getTitle(), L"", L"", L""); - - std::wstring documentID = params.getDocumentID(); - if (!documentID.empty()) - oPdfResult.SetDocumentID(documentID); - - std::wstring password = params.getSavePassword(); - if (!oPdfResult.LoadFromFile(sFrom, L"", password, password)) - return false; - - if (!oPdfResult.EditPdf(sTo)) - return false; - - CConvertFromBinParams oConvertParams; - oConvertParams.m_sInternalMediaDirectory = NSFile::GetDirectoryName(sFrom); - oConvertParams.m_sMediaDirectory = oConvertParams.m_sInternalMediaDirectory; - - for (std::vector::const_iterator i = changes.begin(); i != changes.end(); i++) - { - BYTE* pChangesData = NULL; - DWORD dwChangesSize = 0; - if (NSFile::CFileBinary::ReadAllBytes(*i, &pChangesData, dwChangesSize)) - { - oPdfResult.AddToPdfFromBinary(pChangesData, (unsigned int)dwChangesSize, &oConvertParams); - RELEASEARRAYOBJECTS(pChangesData); - } - } - - oPdfResult.Close(); - return true; - } - - _UINT32 - fromCrossPlatform(const std::wstring &sFromSrc, int nFormatFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms) - { - _UINT32 nRes = 0; - NSFonts::IApplicationFonts *pApplicationFonts = NSFonts::NSApplication::Create(); - initApplicationFonts(pApplicationFonts, params); - - std::wstring sFrom = sFromSrc; - if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatFrom || - AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDFA == nFormatFrom) - { - if (params.getFromChanges()) - { - std::wstring sChangesDir = NSDirectory::GetFolderPath(sFrom) + FILE_SEPARATOR_STR + L"changes"; - std::vector arChanges = NSDirectory::GetFiles(sChangesDir); - - sFrom = NSFile::CFileBinary::CreateTempFileWithUniqueName(sTemp, L"PDF_"); - if (NSFile::CFileBinary::Exists(sFrom)) - NSFile::CFileBinary::Remove(sFrom); - - if (!applyChangesPdf(sFromSrc, sFrom, pApplicationFonts, sTemp, params, arChanges)) - { - if (NSFile::CFileBinary::Exists(sFrom)) - NSFile::CFileBinary::Remove(sFrom); - - sFrom = sFromSrc; - } - } - } - - if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) - { - std::string sPages = checkPrintPages(params); - - if (nFormatFrom == nFormatTo && !params.getIsPDFA() && params.getPassword() == params.getSavePassword() && sPages.empty()) - { - if (sFrom == sFromSrc) - nRes = NSFile::CFileBinary::Copy(sFrom, sTo) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - else - { - nRes = NSFile::CFileBinary::Move(sFrom, sTo) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - sFrom = sFromSrc; - } - } - else - { - CPdfFile pdfWriter(pApplicationFonts); - pdfWriter.CreatePdf(params.getIsPDFA()); - pdfWriter.SetTempDirectory(sTemp); - pdfWriter.SetDocumentInfo(params.getTitle(), L"", L"", L""); - - std::wstring documentID = params.getDocumentID(); - if (false == documentID.empty()) - pdfWriter.SetDocumentID(documentID); - - std::wstring password = params.getSavePassword(); - if (false == password.empty()) - pdfWriter.SetPassword(password); - - IOfficeDrawingFile *pReader = NULL; - nRes = PdfDjvuXpsToRenderer(&pReader, &pdfWriter, sFrom, nFormatFrom, sTo, sTemp, params, pApplicationFonts, sPages); - if (SUCCEEDED_X2T(nRes)) - nRes = S_OK == pdfWriter.SaveToFile(sTo) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; - RELEASEOBJECT(pReader); - } - } - else if (0 != (AVS_OFFICESTUDIO_FILE_CANVAS & nFormatTo)) - { - if (params.needConvertToOrigin(nFormatFrom)) - { - copyOrigin(sFrom, *params.m_sFileTo); - } - else - { - std::wstring sToDir = NSSystemPath::GetDirectoryName(sTo); - if (!params.getDontSaveAdditional()) - { - // save origin to print - copyOrigin(sFrom, *params.m_sFileTo); - } - NSHtmlRenderer::CASCHTMLRenderer3 oHtmlRenderer; - oHtmlRenderer.CreateOfficeFile(sToDir); - IOfficeDrawingFile *pReader = NULL; - nRes = PdfDjvuXpsToRenderer(&pReader, &oHtmlRenderer, sFrom, nFormatFrom, sTo, sTemp, params, pApplicationFonts); - oHtmlRenderer.CloseFile(params.getIsNoBase64()); - RELEASEOBJECT(pReader); - } - } - else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) - { - IOfficeDrawingFile *pReader = NULL; - nRes = PdfDjvuXpsToImage(&pReader, sFrom, nFormatFrom, sTo, sTemp, params, pApplicationFonts); - RELEASEOBJECT(pReader); - } - else - { - switch (nFormatTo) - { - case AVS_OFFICESTUDIO_FILE_OTHER_OOXML: - nFormatTo = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX; - break; - case AVS_OFFICESTUDIO_FILE_OTHER_ODF: - nFormatTo = AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT; - break; - } - - IOfficeDrawingFile *pReader = NULL; - switch (nFormatFrom) - { - case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF: - pReader = new CPdfFile(pApplicationFonts); - break; - case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS: - pReader = new CXpsFile(pApplicationFonts); - break; - case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU: - pReader = new CDjVuFile(pApplicationFonts); - break; - default: - break; - } - - if (pReader) - { - pReader->SetTempDirectory(sTemp); - - std::wstring sPassword = params.getPassword(); - pReader->LoadFromFile(sFrom, L"", sPassword, sPassword); - - CDocxRenderer oDocxRenderer(pApplicationFonts); - - NSDocxRenderer::TextAssociationType taType = NSDocxRenderer::tatPlainLine; - if (params.m_oTextParams) - { - InputParamsText *oTextParams = params.m_oTextParams; - if (oTextParams->m_nTextAssociationType) - // taType = static_cast(*oTextParams->m_nTextAssociationType); - { - switch (*oTextParams->m_nTextAssociationType) - { - case 0: - taType = NSDocxRenderer::tatBlockChar; - break; - case 1: - taType = NSDocxRenderer::tatBlockLine; - break; - case 2: - taType = NSDocxRenderer::tatPlainLine; - break; - case 3: - taType = NSDocxRenderer::tatPlainParagraph; - break; - default: - break; - } - } - } - oDocxRenderer.SetTextAssociationType(taType); - - std::wstring sTempDirOut = sTemp + L"/output"; - if (!NSDirectory::Exists(sTempDirOut)) - NSDirectory::CreateDirectory(sTempDirOut); - - oDocxRenderer.SetTempFolder(sTempDirOut); - bool bIsOutCompress = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatTo && !params.hasSavePassword(); - nRes = oDocxRenderer.Convert(pReader, sTo, bIsOutCompress); - - if (nRes == S_OK && !bIsOutCompress) - nRes = fromDocxDir(sTempDirOut, sTo, nFormatTo, sTemp, sThemeDir, bPaid, params, L""); - } - else - nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; - RELEASEOBJECT(pReader); - } - RELEASEOBJECT(pApplicationFonts); - - if (sFrom != sFromSrc && NSFile::CFileBinary::Exists(sFrom)) - NSFile::CFileBinary::Remove(sFrom); - return nRes; - } - _UINT32 fromCanvasPdf(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms) - { - _UINT32 nRes = 0; - if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) - { - nRes = bin2pdf(sFrom, sTo, sTemp, bPaid, sThemeDir, params); - } - else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) - { - nRes = bin2imageBase64(sFrom, sTo, sTemp, sThemeDir, params); - } - else - { - nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; - } - return nRes; - } - - // xls -> xlsx - _UINT32 xls2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultDocxDir = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); - - NSDirectory::CreateDirectory(sResultDocxDir); - - _UINT32 hRes = xls2xlsx_dir(sFrom, sResultDocxDir, sTemp, params); - - if (SUCCEEDED_X2T(hRes)) - { - hRes = dir2zipMscrypt(sResultDocxDir, sTo, sTemp, params); - } - return hRes; - } - _UINT32 xls2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - params.m_bMacro = false; - - int lcid = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; - - _UINT32 nRes = ConvertXls2Xlsx(sFrom, sTo, params.getPassword(), params.getFontPath(), sTemp, lcid, params.m_bMacro); - - nRes = processEncryptionError(nRes, sFrom, params); - return nRes; - } - // xls -> xlsm - _UINT32 xls2xlsm(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultXlsmDir = sTemp + FILE_SEPARATOR_STR + _T("xlsm_unpacked"); - - NSDirectory::CreateDirectory(sResultXlsmDir); - - _UINT32 nRes = xls2xlsm_dir(sFrom, sResultXlsmDir, sTemp, params); - - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultXlsmDir, sTo, true)) - return 0; - } - return nRes; - } - _UINT32 xls2xlsm_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - params.m_bMacro = true; - - int lcid = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; - - _UINT32 nRes = ConvertXls2Xlsx(sFrom, sTo, params.getPassword(), params.getFontPath(), sTemp, lcid, params.m_bMacro); - - nRes = processEncryptionError(nRes, sFrom, params); - return nRes; - } - // xls -> xlst - _UINT32 xls2xlst(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - // Extract xlsx to temp directory - std::wstring sResultDoctDir = sTemp + FILE_SEPARATOR_STR + _T("xlst_unpacked"); - std::wstring sResultDoctFileEditor = sResultDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultDoctDir); - - _UINT32 nRes = xls2xlst_bin(sFrom, sResultDoctFileEditor, sTemp, params); - - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - - return nRes; - } - - // xls -> xlst_bin - _UINT32 xls2xlst_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultXlsxDir = sTemp + FILE_SEPARATOR_STR + _T("xlsx_unpacked"); - - NSDirectory::CreateDirectory(sResultXlsxDir); - - params.m_bMacro = true; - - int lcid = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; - - _UINT32 nRes = ConvertXls2Xlsx(sFrom, sResultXlsxDir, params.getPassword(), params.getFontPath(), sTemp, lcid, params.m_bMacro); - - nRes = processEncryptionError(nRes, sFrom, params); - if (SUCCEEDED_X2T(nRes)) - { - BinXlsxRW::CXlsxSerializer oCXlsxSerializer; - - oCXlsxSerializer.setFontDir(params.getFontPath()); - - return oCXlsxSerializer.saveToFile(sTo, sResultXlsxDir, params.getXmlOptions()); - } - return nRes; - } - _UINT32 html2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); - NSDirectory::CreateDirectory(sDocxDir); - _UINT32 nRes = html2docx_dir(sFrom, sDocxDir, sTemp, params); - if (SUCCEEDED_X2T(nRes)) - { - nRes = (S_OK == docx_dir2doct_bin(sDocxDir, sTo, sTemp, params, L"")) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 html_zip2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); - NSDirectory::CreateDirectory(sDocxDir); - _UINT32 nRes = html_zip2docx_dir(sFrom, sDocxDir, sTemp, params); - if (SUCCEEDED_X2T(nRes)) - { - nRes = (S_OK == docx_dir2doct_bin(sDocxDir, sTo, sTemp, params, L"")) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 html2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultDoctDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - std::wstring sResultDoctFileEditor = sResultDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultDoctDir); - - _UINT32 nRes = html2doct_bin(sFrom, sResultDoctFileEditor, sTemp, params); - - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 html_zip2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sResultDoctDir = sTemp + FILE_SEPARATOR_STR + _T("doct_unpacked"); - std::wstring sResultDoctFileEditor = sResultDoctDir + FILE_SEPARATOR_STR + _T("Editor.bin"); - - NSDirectory::CreateDirectory(sResultDoctDir); - - _UINT32 nRes = html_zip2doct_bin(sFrom, sResultDoctFileEditor, sTemp, params); - - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sResultDoctDir, sTo)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; - } - return nRes; - } - _UINT32 html2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); - NSDirectory::CreateDirectory(sDocxDir); - - _UINT32 nRes = html2docx_dir(sFrom, sDocxDir, sTemp, params); - if (SUCCEEDED_X2T(nRes)) - { - nRes = dir2zipMscrypt(sDocxDir, sTo, sTemp, params); - } - return nRes; - } - - _UINT32 html_zip2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms) - { - std::wstring sDocxDir = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); - NSDirectory::CreateDirectory(sDocxDir); - - _UINT32 nRes = html_zip2docx_dir(sFrom, sDocxDir, sTemp, params); - if (SUCCEEDED_X2T(nRes)) - { - COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sDocxDir, sTo, true)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + nRes = fromVsdxDir(sVsdxDir, sTo, nFormatTo, params, convertParams); } return nRes; } //------------------------------------------------------------------------------------------------------------------ - _UINT32 detectMacroInFile(InputParams &oInputParams) + _UINT32 detectMacroInFile(InputParams& oInputParams) { _UINT32 nRes = 0; // no macro std::wstring sFileFrom = *oInputParams.m_sFileFrom; @@ -5547,7 +5440,7 @@ namespace NExtractTools return nRes; } - _UINT32 fromInputParams(InputParams &oInputParams) + _UINT32 fromInputParams(InputParams& oInputParams) { TConversionDirection conversion = oInputParams.getConversionDirection(); std::wstring sFileFrom = *oInputParams.m_sFileFrom; @@ -5578,34 +5471,35 @@ namespace NExtractTools return AVS_FILEUTILS_ERROR_CONVERT_PARAMS; } - bool bPaid = true; + ConvertParams oConvertParams; + if (NULL != oInputParams.m_bPaid) - bPaid = *oInputParams.m_bPaid; - std::wstring sThemeDir; + oConvertParams.m_bIsPaid = *oInputParams.m_bPaid; + if (NULL != oInputParams.m_sThemeDir) - sThemeDir = *oInputParams.m_sThemeDir; + oConvertParams.m_sThemesDir = *oInputParams.m_sThemeDir; + InputParamsMailMerge *oMailMerge = NULL; if (NULL != oInputParams.m_oMailMergeSend) oMailMerge = oInputParams.m_oMailMergeSend; bool bExternalTempDir = false; - std::wstring sTempDir; if (NULL != oInputParams.m_sTempDir) { bExternalTempDir = true; - sTempDir = *oInputParams.m_sTempDir; + oConvertParams.m_sTempDir = *oInputParams.m_sTempDir; } else { - sTempDir = NSDirectory::CreateDirectoryWithUniqueName(NSDirectory::GetFolderPath(sFileTo)); + oConvertParams.m_sTempDir = NSDirectory::CreateDirectoryWithUniqueName(NSDirectory::GetFolderPath(sFileTo)); } - if (sTempDir.empty()) + if (oConvertParams.m_sTempDir.empty()) { std::cerr << "Couldn't create temp folder" << std::endl; return AVS_FILEUTILS_ERROR_UNKNOWN; } - NSFile::CFileBinary::SetTempPath(sTempDir); + NSFile::CFileBinary::SetTempPath(oConvertParams.m_sTempDir); if (!oInputParams.checkInputLimits()) { @@ -5626,221 +5520,221 @@ namespace NExtractTools break; case TCD_DOC2DOCT: { - result = doc2doct(sFileFrom, sFileTo, sTempDir, oInputParams); + result = doc2doct(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCX2DOCT: { - result = docx2doct(sFileFrom, sFileTo, sTempDir, oInputParams); + result = docx2doct(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCXFLAT2DOCT: { - result = docxflat2doct(sFileFrom, sFileTo, sTempDir, oInputParams); + result = docxflat2doct(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCXFLAT2DOCT_BIN: { - result = docxflat2doct_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = docxflat2doct_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PKG2BIN_T: { - result = package2bin_t(sFileFrom, sFileTo, sTempDir, oInputParams); + result = package2bin_t(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PKG2BIN: { - result = package2bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = package2bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PKG2OOXML: { oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX); - result = package2ooxml(sFileFrom, sFileTo, sTempDir, oInputParams); + result = package2ooxml(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCT2DOCX: { oInputParams.m_bMacro = false; oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX); - result = doct2docx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = doct2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCT2DOTX: { oInputParams.m_bMacro = false; oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTX); - result = doct2docx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = doct2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCT2OFORM: { oInputParams.m_bMacro = false; oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM); - result = doct2docx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = doct2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCT2DOCXF: { oInputParams.m_bMacro = false; oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF); - result = doct2docx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = doct2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCT2DOCM: { oInputParams.m_bMacro = true; oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM); - result = doct2docx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = doct2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLSX2XLST: { - result = xlsx2xlst(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xlsx2xlst(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLSB2XLST: { oInputParams.m_nFormatFrom = new int(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB); - result = xlsx2xlst(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xlsx2xlst(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLSXFLAT2XLST: { - result = xlsxflat2xlst(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xlsxflat2xlst(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLSXFLAT2XLST_BIN: { - result = xlsxflat2xlst_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xlsxflat2xlst_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLSXFLAT2XLSX: { - result = xlsxflat2xlsx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xlsxflat2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLST2XLSX: { oInputParams.m_bMacro = false; oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX); - result = xlst2xlsx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = xlst2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLST2XLSM: { oInputParams.m_bMacro = true; oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM); - result = xlst2xlsx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = xlst2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLST2XLTX: { oInputParams.m_bMacro = false; oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX); - result = xlst2xlsx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = xlst2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPTX2PPTT: { - result = pptx2pptt(sFileFrom, sFileTo, sTempDir, oInputParams); + result = pptx2pptt(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPTT2PPTX: { oInputParams.m_bMacro = false; oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX); - result = pptt2pptx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = pptt2pptx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPTT2PPTM: { oInputParams.m_bMacro = true; oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM); - result = pptt2pptx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = pptt2pptx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPTT2POTX: { oInputParams.m_bMacro = false; oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX); - result = pptt2pptx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = pptt2pptx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOTX2DOCX: { - result = dotx2docx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = dotx2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCM2DOCX: { - result = docm2docx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = docm2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOTM2DOCX: { - result = dotm2docx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = dotm2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOTM2DOCM: { - result = dotm2docm(sFileFrom, sFileTo, sTempDir, oInputParams); + result = dotm2docm(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLTX2XLSX: { - result = xltx2xlsx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xltx2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLSM2XLSX: { - result = xltx2xlsx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xltx2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLTM2XLSX: { - result = xltm2xlsx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xltm2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLTM2XLSM: { - result = xltm2xlsm(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xltm2xlsm(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPSX2PPTX: { - result = ppsx2pptx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = ppsx2pptx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_POTX2PPTX: { - result = potx2pptx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = potx2pptx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_POTM2PPTX: { - result = potm2pptx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = potm2pptx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPSM2PPTX: { - result = ppsm2pptx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = ppsm2pptx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_POTM2PPTM: { - result = potm2pptm(sFileFrom, sFileTo, sTempDir, oInputParams); + result = potm2pptm(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPSM2PPTM: { - result = ppsm2pptm(sFileFrom, sFileTo, sTempDir, oInputParams); + result = ppsm2pptm(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPTM2PPTX: { - result = pptm2pptx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = pptm2pptx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_ZIPDIR: @@ -5855,62 +5749,62 @@ namespace NExtractTools break; case TCD_XML2XLSX: { - result = xml2xlsx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xml2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_CSV2XLSX: { - result = csv2xlsx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = csv2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_CSV2XLST: { - result = csv2xlst(sFileFrom, sFileTo, sTempDir, oInputParams); + result = csv2xlst(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLSX2CSV: { - result = xlsx2csv(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xlsx2csv(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLST2CSV: { - result = xlst2csv(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xlst2csv(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCX2DOCT_BIN: { - result = docx2doct_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = docx2doct_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCT_BIN2DOCX: { - result = doct_bin2docx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = doct_bin2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLSX2XLST_BIN: { - result = xlsx2xlst_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xlsx2xlst_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLST_BIN2XLSX: { - result = xlst_bin2xlsx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = xlst_bin2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPTX2PPTT_BIN: { - result = pptx2pptt_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = pptx2pptt_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPTT_BIN2PPTX: { - result = pptt_bin2pptx(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = pptt_bin2pptx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_BIN2PDF: { - result = bin2pdf(sFileFrom, sFileTo, sTempDir, bPaid, sThemeDir, oInputParams); + result = bin2pdf(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_BIN2T: @@ -5925,285 +5819,285 @@ namespace NExtractTools break; case TCD_PPT2PPTX: { - result = ppt2pptx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = ppt2pptx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPT2PPTM: { - result = ppt2pptm(sFileFrom, sFileTo, sTempDir, oInputParams); + result = ppt2pptm(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPT2PPTT: { - result = ppt2pptt(sFileFrom, sFileTo, sTempDir, oInputParams); + result = ppt2pptt(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPT2PPTT_BIN: { - result = ppt2pptt_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = ppt2pptt_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_RTF2DOCX: { - result = rtf2docx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = rtf2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_RTF2DOCT: { - result = rtf2doct(sFileFrom, sFileTo, sTempDir, oInputParams); + result = rtf2doct(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_RTF2DOCT_BIN: { - result = rtf2doct_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = rtf2doct_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCX2RTF: { - result = docx2rtf(sFileFrom, sFileTo, sTempDir, oInputParams); + result = docx2rtf(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCX2TXT: { - result = docx2txt(sFileFrom, sFileTo, sTempDir, oInputParams); + result = docx2txt(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOC2DOCX: { - result = doc2docx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = doc2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOC2DOCM: { - result = doc2docm(sFileFrom, sFileTo, sTempDir, oInputParams); + result = doc2docm(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCT2RTF: { - result = doct2rtf(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = doct2rtf(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCT_BIN2RTF: { - result = doct_bin2rtf(sFileFrom, sFileTo, sTempDir, sThemeDir, oInputParams); + result = doct_bin2rtf(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_TXT2DOCX: { - result = txt2docx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = txt2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_TXT2DOCT: { - result = txt2doct(sFileFrom, sFileTo, sTempDir, oInputParams); + result = txt2doct(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_TXT2DOCT_BIN: { - result = txt2doct_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = txt2doct_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLS2XLSX: { - result = xls2xlsx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xls2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLS2XLSM: { - result = xls2xlsm(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xls2xlsm(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLS2XLST: { - result = xls2xlst(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xls2xlst(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLS2XLST_BIN: { - result = xls2xlst_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xls2xlst_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_OTF2ODF: { - result = otf2odf(sFileFrom, sFileTo, sTempDir, oInputParams); + result = otf2odf(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_ODF2OOX: { - result = odf2oox(sFileFrom, sFileTo, sTempDir, oInputParams); + result = odf2oox(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_ODF2OOT: { - result = odf2oot(sFileFrom, sFileTo, sTempDir, oInputParams); + result = odf2oot(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_ODF2OOT_BIN: { - result = odf2oot_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = odf2oot_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_ODF_FLAT2OOX: { - result = odf_flat2oox(sFileFrom, sFileTo, sTempDir, oInputParams); + result = odf_flat2oox(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_ODF_FLAT2OOT: { - result = odf_flat2oot(sFileFrom, sFileTo, sTempDir, oInputParams); + result = odf_flat2oot(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_ODF_FLAT2OOT_BIN: { - result = odf_flat2oot_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = odf_flat2oot_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCX2ODT: { - result = docx2odt(sFileFrom, sFileTo, sTempDir, oInputParams); + result = docx2odt(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_XLSX2ODS: { - result = xlsx2ods(sFileFrom, sFileTo, sTempDir, oInputParams); + result = xlsx2ods(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_PPTX2ODP: { - result = pptx2odp(sFileFrom, sFileTo, sTempDir, oInputParams); + result = pptx2odp(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_MAILMERGE: { - result = convertmailmerge(*oMailMerge, sFileFrom, sFileTo, sTempDir, bPaid, sThemeDir, oInputParams); + result = convertmailmerge(*oMailMerge, sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DOCUMENT2: { oInputParams.m_bMacro = ( nFormatTo == AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM || nFormatTo == AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM || nFormatTo == AVS_OFFICESTUDIO_FILE_OTHER_OOXML); - result = fromDocument(sFileFrom, nFormatFrom, sTempDir, oInputParams); + result = fromDocument(sFileFrom, nFormatFrom, oInputParams, oConvertParams); } break; case TCD_SPREADSHEET2: { oInputParams.m_bMacro = ( nFormatTo == AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM || nFormatTo == AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM || nFormatTo == AVS_OFFICESTUDIO_FILE_OTHER_OOXML); - result = fromSpreadsheet(sFileFrom, nFormatFrom, sTempDir, oInputParams); + result = fromSpreadsheet(sFileFrom, nFormatFrom, oInputParams, oConvertParams); } break; case TCD_PRESENTATION2: { oInputParams.m_bMacro = ( nFormatTo == AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTM || nFormatTo == AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM || nFormatTo == AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM || nFormatTo == AVS_OFFICESTUDIO_FILE_OTHER_OOXML); - result = fromPresentation(sFileFrom, nFormatFrom, sTempDir, oInputParams); + result = fromPresentation(sFileFrom, nFormatFrom, oInputParams, oConvertParams); } break; case TCD_T2: { - result = fromT(sFileFrom, nFormatFrom, sFileTo, nFormatTo, sTempDir, sThemeDir, bPaid, oInputParams); + result = fromT(sFileFrom, nFormatFrom, sFileTo, nFormatTo, oInputParams, oConvertParams); } break; case TCD_DOCT_BIN2: { - result = fromDoctBin(sFileFrom, sFileTo, nFormatTo, sTempDir, sThemeDir, bPaid, oInputParams); + result = fromDoctBin(sFileFrom, sFileTo, nFormatTo, oInputParams, oConvertParams); } break; case TCD_XLST_BIN2: { - result = fromXlstBin(sFileFrom, sFileTo, nFormatTo, sTempDir, sThemeDir, bPaid, oInputParams); + result = fromXlstBin(sFileFrom, sFileTo, nFormatTo, oInputParams, oConvertParams); } break; case TCD_PPTT_BIN2: { - result = fromPpttBin(sFileFrom, sFileTo, nFormatTo, sTempDir, sThemeDir, bPaid, oInputParams); + result = fromPpttBin(sFileFrom, sFileTo, nFormatTo, oInputParams, oConvertParams); } break; case TCD_CROSSPLATFORM2: { - result = fromCrossPlatform(sFileFrom, nFormatFrom, sFileTo, nFormatTo, sTempDir, sThemeDir, bPaid, oInputParams); + result = fromCrossPlatform(sFileFrom, nFormatFrom, sFileTo, nFormatTo, oInputParams, oConvertParams); } break; case TCD_CANVAS_PDF2: { - result = fromCanvasPdf(sFileFrom, nFormatFrom, sFileTo, nFormatTo, sTempDir, sThemeDir, bPaid, oInputParams); + result = fromCanvasPdf(sFileFrom, nFormatFrom, sFileTo, nFormatTo, oInputParams, oConvertParams); } break; case TCD_MSCRYPT2: { - result = fromMscrypt(sFileFrom, sFileTo, sTempDir, oInputParams); + result = fromMscrypt(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_MSCRYPT2_RAW: { - result = mscrypt2oox(sFileFrom, sFileTo, sTempDir, oInputParams); + result = mscrypt2oox(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_2MSCRYPT_RAW: { - result = oox2mscrypt(sFileFrom, sFileTo, sTempDir, oInputParams); + result = oox2mscrypt(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_MSCRYPT2DOCT: case TCD_MSCRYPT2XLST: case TCD_MSCRYPT2PPTT: { - result = mscrypt2oot(sFileFrom, sFileTo, sTempDir, oInputParams); + result = mscrypt2oot(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_MSCRYPT2BIN: { - result = mscrypt2oot_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = mscrypt2oot_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_MITCRYPT2: { - result = fromMitcrypt(sFileFrom, sFileTo, sTempDir, oInputParams); + result = fromMitcrypt(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_HTML2DOCX: { - result = html2docx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = html2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_HTMLZIP2DOCX: { - result = html_zip2docx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = html_zip2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_HTML2DOCT: { - result = html2doct(sFileFrom, sFileTo, sTempDir, oInputParams); + result = html2doct(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_HTMLZIP2DOCT: { - result = html_zip2doct(sFileFrom, sFileTo, sTempDir, oInputParams); + result = html_zip2doct(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_HTML2DOCT_BIN: { - result = html2doct_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = html2doct_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_HTMLZIP2DOCT_BIN: { - result = html_zip2doct_bin(sFileFrom, sFileTo, sTempDir, oInputParams); + result = html_zip2doct_bin(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_FB22DOCX: { - result = fb2docx(sFileFrom, sFileTo, sTempDir, oInputParams); + result = fb2docx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_VBAPROJECT2XML: { - result = msVbaProject2Xml(sFileFrom, sFileTo, sTempDir, oInputParams); + result = msVbaProject2Xml(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; case TCD_DRAW2: { - result = fromDraw(sFileFrom, nFormatFrom, sTempDir, oInputParams); + result = fromDraw(sFileFrom, nFormatFrom, oInputParams, oConvertParams); }break; // TCD_FB22DOCT, // TCD_FB22DOCT_BIN, @@ -6220,7 +6114,7 @@ namespace NExtractTools // delete temp dir if (!bExternalTempDir) { - NSDirectory::DeleteDirectory(sTempDir); + NSDirectory::DeleteDirectory(oConvertParams.m_sTempDir); } // clean up v8 @@ -6273,4 +6167,4 @@ namespace NExtractTools return AVS_FILEUTILS_ERROR_CONVERT_PARAMS; } } -} // namespace NExtractTools \ No newline at end of file +} // namespace NExtractTools diff --git a/X2tConverter/src/ASCConverters.h b/X2tConverter/src/ASCConverters.h index f8734d68fa..5aa30c45cf 100644 --- a/X2tConverter/src/ASCConverters.h +++ b/X2tConverter/src/ASCConverters.h @@ -46,197 +46,245 @@ namespace NExtractTools { class InputParams; class InputParamsMailMerge; + class ConvertParams; } // namespace NExtractTools namespace NExtractTools { - _UINT32 docx2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 docx2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 docx_dir2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, const std::wstring &sDocxFile); - _UINT32 docx_dir2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, const std::wstring &sDocxFile); - _UINT32 doct_bin2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms); - _UINT32 doct_bin2docx_dir(const std::wstring &sFrom, const std::wstring &sToResult, const std::wstring &sTo, const std::wstring &sThemeDir, InputParams ¶ms); - _UINT32 doct2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms); + #define DECLARE_CONVERT_FUNC(name) _UINT32 name(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) - _UINT32 docxflat2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 docxflat2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 docxflat2odt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 docxflat2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 package2ooxml(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 package2ooxml_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 package2bin_t(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 package2bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 dotm2docm(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 dotm2docm_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 dotx2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 dotx2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 docm2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 docm2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 dotm2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 dotm2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - - _UINT32 xlsx2xlst(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlsx2xlst_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlsxflat2xlst(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlsxflat2xlst_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlsxflat2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlsxflat2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlsx_dir2xlst(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, bool bXmlOptions, const std::wstring &sXlsxFile); - _UINT32 xlsx_dir2xlst_bin(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms, bool bXmlOptions, const std::wstring &sXlsxFile); - _UINT32 xlst_bin2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms); - _UINT32 xlst_bin2xlsx_dir(const std::wstring &sFrom, const std::wstring &sToResult, const std::wstring &sTo, const std::wstring &sThemeDir, InputParams ¶ms); - _UINT32 xlst2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms); - - _UINT32 xltx2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xltx2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 xltm2xlsm(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xltm2xlsm_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 xlsm2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlsm2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 xltm2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xltm2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 xlsb2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlsx2xlsb(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlsx_dir2xlsb(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 pptx2pptt_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 pptx_dir2pptt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, const std::wstring &sPptxFile); - _UINT32 pptx_dir2pptt_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, const std::wstring &sPptxFile); - _UINT32 pptx2pptt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 pptt_bin2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms); - _UINT32 pptt_bin2pptx_dir(const std::wstring &sFrom, const std::wstring &sToResult, const std::wstring &sTo, const std::wstring &sThemeDir, InputParams ¶ms); - _UINT32 pptt2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms); - - _UINT32 xml2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xml2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 csv2xlst(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 csv2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 csv2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 csv2xlst_bin(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 xlst2csv(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlsx_dir2csv(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlsx2csv(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlst_bin2csv(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 bin2pdf(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, bool bPaid, const std::wstring &sThemeDir, InputParams ¶ms); - - _UINT32 ppsx2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 ppsx2pptx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 potx2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 potx2pptx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 ppsm2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 ppsm2pptx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 potm2pptm(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 potm2pptm_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 ppsm2pptm(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 ppsm2pptm_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 pptm2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 pptm2pptx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - _UINT32 potm2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 potm2pptx_dir(const std::wstring &sFrom, const std::wstring &sTo, InputParams ¶ms); - - _UINT32 ppt2pptx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 ppt2pptx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 ppt2pptt_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 ppt2pptt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 ppt2pptm(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 ppt2pptm_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 rtf2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 rtf2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 rtf2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 rtf2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 docx2rtf(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 docx_dir2rtf(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 doct2rtf(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms); - _UINT32 doct_bin2rtf(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, const std::wstring &sThemeDir, InputParams ¶ms); - - _UINT32 doc2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 doc2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 doc2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 doc2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 docx_dir2doc(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 doc2docm(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 doc2docm_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 xls2xlsx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xls2xlsx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xls2xlst(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xls2xlst_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xls2xlsm(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xls2xlsm_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 txt2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 txt2docx_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 txt2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 txt2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 docx_dir2txt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 odf2oox(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 odf2oox_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 odf2oot(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 odf2oot_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 odf_flat2oox(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 odf_flat2oox_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 odf_flat2oot(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 odf_flat2oot_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 docx2odt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 docx_dir2odt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, bool bTemplate); - _UINT32 xlsx2ods(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 xlsx_dir2ods(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, bool bTemplate); - _UINT32 pptx2odp(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 pptx_dir2odp(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms, bool bTemplate); - - _UINT32 fromMscrypt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 fromMitcrypt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 mscrypt2oox(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 mitcrypt2oox(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 mscrypt2oot(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 mscrypt2oot_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 mitcrypt2oot_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 oox2mscrypt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 msVbaProject2dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - _UINT32 html2doct_bin(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 html2doct(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - _UINT32 html2docx(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); - - //------------------------------------------------------------------------------------------------------------------------------------------------- + // zip _UINT32 dir2zip(const std::wstring &sFrom, const std::wstring &sTo, bool bSorted = false, int method = 8 /*Z_DEFLATED*/, short level = -1, bool bDateTime = false); _UINT32 dir2zipMscrypt(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams ¶ms); _UINT32 zip2dir(const std::wstring &sFrom, const std::wstring &sTo); - _UINT32 convertmailmerge(const InputParamsMailMerge &oMailMergeSend, const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, bool bPaid, const std::wstring &sThemeDir, InputParams ¶ms); + // crypt + DECLARE_CONVERT_FUNC(mscrypt2oot); + DECLARE_CONVERT_FUNC(mscrypt2oot_bin); + DECLARE_CONVERT_FUNC(mitcrypt2oox); + DECLARE_CONVERT_FUNC(mitcrypt2oot_bin); + DECLARE_CONVERT_FUNC(mscrypt2oox); + DECLARE_CONVERT_FUNC(oox2mscrypt); + DECLARE_CONVERT_FUNC(fromMscrypt); + DECLARE_CONVERT_FUNC(fromMitcrypt); - _UINT32 fromDocxDir(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms, const std::wstring &sDocxFile); - _UINT32 fromDoctBin(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms); - _UINT32 fromDocument(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTemp, InputParams ¶ms); + DECLARE_CONVERT_FUNC(msVbaProject2dir); - _UINT32 fromXlsxDir(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms, const std::wstring &sXlsxFile); - _UINT32 fromXlsbXlsxDir(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms, const std::wstring &sXlsxFile); - _UINT32 fromXlstBin(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms); - _UINT32 fromSpreadsheet(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTemp, InputParams ¶ms); + // docx + DECLARE_CONVERT_FUNC(docx2doct_bin); + DECLARE_CONVERT_FUNC(docx2doct); + DECLARE_CONVERT_FUNC(docx_dir2doct); + DECLARE_CONVERT_FUNC(docx_dir2doct_bin); + DECLARE_CONVERT_FUNC(doct_bin2docx); + DECLARE_CONVERT_FUNC(doct_bin2docx_dir); + DECLARE_CONVERT_FUNC(doct2docx); - _UINT32 fromPptxDir(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms, const std::wstring &sPptxFile); - _UINT32 fromPpttBin(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms); - _UINT32 fromPresentation(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTemp, InputParams ¶ms); + DECLARE_CONVERT_FUNC(docxflat2doct); + DECLARE_CONVERT_FUNC(docxflat2doct_bin); + DECLARE_CONVERT_FUNC(docxflat2odt); + DECLARE_CONVERT_FUNC(docxflat2docx); - _UINT32 fromT(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms); - _UINT32 fromCrossPlatform(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms); - _UINT32 fromCanvasPdf(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTo, int nFormatTo, const std::wstring &sTemp, const std::wstring &sThemeDir, bool bPaid, InputParams ¶ms); + DECLARE_CONVERT_FUNC(package2ooxml); + DECLARE_CONVERT_FUNC(package2ooxml_dir); + DECLARE_CONVERT_FUNC(package2bin_t); + DECLARE_CONVERT_FUNC(package2bin); - _UINT32 fromInputParams(InputParams &oInputParams); - _UINT32 detectMacroInFile(InputParams &oInputParams); + DECLARE_CONVERT_FUNC(dotm2docm); + DECLARE_CONVERT_FUNC(dotm2docm_dir); + DECLARE_CONVERT_FUNC(dotx2docx); + DECLARE_CONVERT_FUNC(dotx2docx_dir); + DECLARE_CONVERT_FUNC(docm2docx); + DECLARE_CONVERT_FUNC(docm2docx_dir); + DECLARE_CONVERT_FUNC(dotm2docx); + DECLARE_CONVERT_FUNC(dotm2docx_dir); + + // xlsx + DECLARE_CONVERT_FUNC(xlsx2xlst); + DECLARE_CONVERT_FUNC(xlsx2xlst_bin); + DECLARE_CONVERT_FUNC(xlsxflat2xlst); + DECLARE_CONVERT_FUNC(xlsxflat2xlst_bin); + DECLARE_CONVERT_FUNC(xlsxflat2xlsx); + DECLARE_CONVERT_FUNC(xlsxflat2xlsx_dir); + DECLARE_CONVERT_FUNC(xlsx_dir2xlst); + DECLARE_CONVERT_FUNC(xlsx_dir2xlst_bin); + DECLARE_CONVERT_FUNC(xlst_bin2xlsx); + DECLARE_CONVERT_FUNC(xlst_bin2xlsx_dir); + DECLARE_CONVERT_FUNC(xlst2xlsx); + + DECLARE_CONVERT_FUNC(xltx2xlsx); + DECLARE_CONVERT_FUNC(xltx2xlsx_dir); + DECLARE_CONVERT_FUNC(xltm2xlsm); + DECLARE_CONVERT_FUNC(xltm2xlsm_dir); + DECLARE_CONVERT_FUNC(xlsm2xlsx); + DECLARE_CONVERT_FUNC(xlsm2xlsx_dir); + DECLARE_CONVERT_FUNC(xltm2xlsx); + DECLARE_CONVERT_FUNC(xltm2xlsx_dir); + DECLARE_CONVERT_FUNC(xlsb2xlsx_dir); + + // pptx + DECLARE_CONVERT_FUNC(pptx2pptt_bin); + DECLARE_CONVERT_FUNC(pptx_dir2pptt); + DECLARE_CONVERT_FUNC(pptx_dir2pptt_bin); + DECLARE_CONVERT_FUNC(pptx2pptt); + DECLARE_CONVERT_FUNC(pptt_bin2pptx); + DECLARE_CONVERT_FUNC(pptt_bin2pptx_dir); + DECLARE_CONVERT_FUNC(pptt2pptx); + + DECLARE_CONVERT_FUNC(ppsx2pptx); + DECLARE_CONVERT_FUNC(ppsx2pptx_dir); + DECLARE_CONVERT_FUNC(potx2pptx); + DECLARE_CONVERT_FUNC(potx2pptx_dir); + DECLARE_CONVERT_FUNC(ppsm2pptx); + DECLARE_CONVERT_FUNC(ppsm2pptx_dir); + DECLARE_CONVERT_FUNC(potm2pptm); + DECLARE_CONVERT_FUNC(potm2pptm_dir); + DECLARE_CONVERT_FUNC(ppsm2pptm); + DECLARE_CONVERT_FUNC(ppsm2pptm_dir); + DECLARE_CONVERT_FUNC(pptm2pptx); + DECLARE_CONVERT_FUNC(pptm2pptx_dir); + DECLARE_CONVERT_FUNC(potm2pptx); + DECLARE_CONVERT_FUNC(potm2pptx_dir); + + // doc + DECLARE_CONVERT_FUNC(doc2docx); + DECLARE_CONVERT_FUNC(doc2docx_dir); + DECLARE_CONVERT_FUNC(doc2doct); + DECLARE_CONVERT_FUNC(doc2doct_bin); + DECLARE_CONVERT_FUNC(docx_dir2doc); + DECLARE_CONVERT_FUNC(doc2docm); + DECLARE_CONVERT_FUNC(doc2docm_dir); + + // rtf + DECLARE_CONVERT_FUNC(rtf2docx); + DECLARE_CONVERT_FUNC(rtf2docx_dir); + DECLARE_CONVERT_FUNC(rtf2doct); + DECLARE_CONVERT_FUNC(rtf2doct_bin); + DECLARE_CONVERT_FUNC(docx2rtf); + DECLARE_CONVERT_FUNC(docx_dir2rtf); + DECLARE_CONVERT_FUNC(doct2rtf); + DECLARE_CONVERT_FUNC(doct_bin2rtf); + + // txt + DECLARE_CONVERT_FUNC(txt2docx); + DECLARE_CONVERT_FUNC(txt2docx_dir); + DECLARE_CONVERT_FUNC(txt2doct); + DECLARE_CONVERT_FUNC(txt2doct_bin); + DECLARE_CONVERT_FUNC(docx2txt); + DECLARE_CONVERT_FUNC(docx_dir2txt); + + // html + DECLARE_CONVERT_FUNC(html2doct_bin); + DECLARE_CONVERT_FUNC(html_zip2doct_bin); + DECLARE_CONVERT_FUNC(html_zip2doct); + DECLARE_CONVERT_FUNC(html2doct); + DECLARE_CONVERT_FUNC(html2docx); + DECLARE_CONVERT_FUNC(html_zip2docx); + + DECLARE_CONVERT_FUNC(html2docx_dir); + DECLARE_CONVERT_FUNC(html_zip2docx_dir); + + DECLARE_CONVERT_FUNC(doct_bin2html); + DECLARE_CONVERT_FUNC(doct_bin2html_zip); + + // mht + DECLARE_CONVERT_FUNC(mht2docx_dir); + + // epub + DECLARE_CONVERT_FUNC(epub2docx_dir); + DECLARE_CONVERT_FUNC(doct_bin2epub); + + // fb2 + DECLARE_CONVERT_FUNC(fb2docx_dir); + DECLARE_CONVERT_FUNC(fb2docx); + DECLARE_CONVERT_FUNC(doct_bin2fb); + + // ppt + DECLARE_CONVERT_FUNC(ppt2pptx); + DECLARE_CONVERT_FUNC(ppt2pptx_dir); + DECLARE_CONVERT_FUNC(ppt2pptt_bin); + DECLARE_CONVERT_FUNC(ppt2pptt); + DECLARE_CONVERT_FUNC(ppt2pptm); + DECLARE_CONVERT_FUNC(ppt2pptm_dir); + + // csv + DECLARE_CONVERT_FUNC(csv2xlst); + DECLARE_CONVERT_FUNC(csv2xlsx); + DECLARE_CONVERT_FUNC(csv2xlsx_dir); + DECLARE_CONVERT_FUNC(csv2xlst_bin); + DECLARE_CONVERT_FUNC(xlst2csv); + DECLARE_CONVERT_FUNC(xlsx_dir2csv); + DECLARE_CONVERT_FUNC(xlsx2csv); + DECLARE_CONVERT_FUNC(xlst_bin2csv); + + // xls + DECLARE_CONVERT_FUNC(xls2xlsx); + DECLARE_CONVERT_FUNC(xls2xlsx_dir); + DECLARE_CONVERT_FUNC(xls2xlst); + DECLARE_CONVERT_FUNC(xls2xlst_bin); + DECLARE_CONVERT_FUNC(xls2xlsm); + DECLARE_CONVERT_FUNC(xls2xlsm_dir); + + // xml => xlsx + DECLARE_CONVERT_FUNC(xml2xlsx); + DECLARE_CONVERT_FUNC(xml2xlsx_dir); + + // odf + DECLARE_CONVERT_FUNC(odf2oox); + DECLARE_CONVERT_FUNC(odf2oox_dir); + DECLARE_CONVERT_FUNC(odf2oot); + DECLARE_CONVERT_FUNC(odf2oot_bin); + + DECLARE_CONVERT_FUNC(odf_flat2oox); + DECLARE_CONVERT_FUNC(odf_flat2oox_dir); + DECLARE_CONVERT_FUNC(odf_flat2oot); + DECLARE_CONVERT_FUNC(odf_flat2oot_bin); + + DECLARE_CONVERT_FUNC(docx2odt); + DECLARE_CONVERT_FUNC(docx_dir2odt); + DECLARE_CONVERT_FUNC(xlsx2ods); + DECLARE_CONVERT_FUNC(xlsx_dir2ods); + DECLARE_CONVERT_FUNC(pptx2odp); + DECLARE_CONVERT_FUNC(pptx_dir2odp); + + DECLARE_CONVERT_FUNC(otf2odf); + + // pdf/image + DECLARE_CONVERT_FUNC(bin2pdf); + _UINT32 bin2Image(unsigned char* pBuffer, long lBufferLen, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams); + DECLARE_CONVERT_FUNC(bin2imageBase64); + + // using NSDoctRenderer::DoctRendererFormat::FormatFile + // DECLARE_CONVERT_FUNC(doct_bin2pdf); + // DECLARE_CONVERT_FUNC(doct_bin2image); + + //------------------------------------------------------------------------------------------------------------------------------------------------- + _UINT32 convertmailmerge(const InputParamsMailMerge& oMailMergeSend, const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams); + + _UINT32 fromDocxDir(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams); + _UINT32 fromDoctBin(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams); + _UINT32 fromDocument(const std::wstring &sFrom, int nFormatFrom, InputParams& params, ConvertParams& convertParams); + + _UINT32 fromXlsxDir (const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams); + _UINT32 fromXlsbXlsxDir(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams); + _UINT32 fromXlstBin (const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams); + _UINT32 fromSpreadsheet(const std::wstring &sFrom, int nFormatFrom, InputParams& params, ConvertParams& convertParams); + + _UINT32 fromPptxDir(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams); + _UINT32 fromPpttBin(const std::wstring &sFrom, const std::wstring &sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams); + _UINT32 fromPresentation(const std::wstring &sFrom, int nFormatFrom, InputParams& params, ConvertParams& convertParams); + + _UINT32 fromT(const std::wstring &sFrom, int nFormatFrom, const std::wstring &sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams); + + _UINT32 fromCrossPlatform(const std::wstring& sFrom, int nFormatFrom, const std::wstring& sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams); + _UINT32 fromCanvasPdf(const std::wstring& sFrom, int nFormatFrom, const std::wstring& sTo, int nFormatTo, InputParams& params, ConvertParams& convertParams); + + _UINT32 fromDraw(const std::wstring& sFrom, int nFormatFrom, InputParams& params, ConvertParams& convertParams); + + _UINT32 fromInputParams(InputParams& oInputParams); + _UINT32 detectMacroInFile(InputParams& oInputParams); void createJSCaches(); - X2T_DECL_EXPORT _UINT32 FromFile(const std::wstring &file); - X2T_DECL_EXPORT _UINT32 FromXml(const std::wstring &xml); + X2T_DECL_EXPORT _UINT32 FromFile(const std::wstring& file); + X2T_DECL_EXPORT _UINT32 FromXml(const std::wstring& xml); } // namespace NExtractTools #endif // ASCCONVERTERS_H diff --git a/X2tConverter/src/cextracttools.cpp b/X2tConverter/src/cextracttools.cpp index ca7b75be36..bf2accd590 100644 --- a/X2tConverter/src/cextracttools.cpp +++ b/X2tConverter/src/cextracttools.cpp @@ -539,7 +539,8 @@ namespace NExtractTools return oBuilder.GetData(); } std::wstring getDoctXml( - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType, NSDoctRenderer::DoctRendererFormat::FormatFile eToType, const std::wstring& sTFileSrc, const std::wstring& sPdfBinFile, + NSDoctRenderer::DoctRendererFormat::FormatFile eFromType, NSDoctRenderer::DoctRendererFormat::FormatFile eToType, + const std::wstring& sTFileSrc, const std::wstring& sPdfBinFile, const std::wstring& sImagesDirectory, const std::wstring& sThemeDir, int nTopIndex, const std::wstring& sMailMerge, const InputParams& params) { NSStringUtils::CStringBuilder oBuilder; @@ -621,8 +622,8 @@ namespace NExtractTools return oBuilder.GetData(); } _UINT32 apply_changes( - const std::wstring& sBinFrom, const std::wstring& sToResult, NSDoctRenderer::DoctRendererFormat::FormatFile eType, const std::wstring& sThemeDir, std::wstring& sBinTo, - const InputParams& params) + const std::wstring& sBinFrom, const std::wstring& sToResult, NSDoctRenderer::DoctRendererFormat::FormatFile eType, std::wstring& sBinTo, + const InputParams& params, const ConvertParams& convertParams) { std::wstring sBinDir = NSDirectory::GetFolderPath(sBinFrom); std::wstring sChangesDir = sBinDir + FILE_SEPARATOR_STR + L"changes"; @@ -637,7 +638,7 @@ namespace NExtractTools int nChangeIndex = -1; while (true) { - std::wstring sXml = getDoctXml(eType, eType, sBinFrom, sBinTo, sImagesDirectory, sThemeDir, nChangeIndex, L"", params); + std::wstring sXml = getDoctXml(eType, eType, sBinFrom, sBinTo, sImagesDirectory, convertParams.m_sThemesDir, nChangeIndex, L"", params); std::wstring sResult; oDoctRenderer.Execute(sXml, sResult); bool bContinue = false; diff --git a/X2tConverter/src/cextracttools.h b/X2tConverter/src/cextracttools.h index c1ba4a1787..e467572f6e 100644 --- a/X2tConverter/src/cextracttools.h +++ b/X2tConverter/src/cextracttools.h @@ -457,6 +457,32 @@ namespace NExtractTools } }; + class ConvertParams + { + public: + std::wstring m_sTempDir; + std::wstring m_sThemesDir; + + std::wstring m_sEditorWithChanges; + + // [docx_dir2doct_bin, docx_dir2doct, pptx_dir2pptt_bin, pptx_dir2ppt] methods + std::wstring m_sTempParamOOXMLFile; + + // for doct_bin2docx_dir, xlst_bin2xlsx_dir + std::wstring m_sTempResultOOXMLDirectory; + + // xlsx_dir2xlst_bin + bool m_bTempIsXmlOptions = false; + + bool m_bIsTemplate = false; + bool m_bIsPaid = false; + + std::wstring m_sMediaDirectory; + std::wstring m_sInternalMediaDirectory; + + std::string m_sPrintPages; + }; + class InputParams { public: @@ -1440,7 +1466,7 @@ namespace NExtractTools NSDoctRenderer::DoctRendererFormat::FormatFile eFromType, NSDoctRenderer::DoctRendererFormat::FormatFile eToType, const std::wstring& sTFileSrc, const std::wstring& sPdfBinFile, const std::wstring& sImagesDirectory, const std::wstring& sThemeDir, int nTopIndex, const std::wstring& sMailMerge, const InputParams& params); _UINT32 apply_changes( - const std::wstring& sBinFrom, const std::wstring& sToResult, NSDoctRenderer::DoctRendererFormat::FormatFile eType, const std::wstring& sThemeDir, std::wstring& sBinTo, - const InputParams& params); + const std::wstring& sBinFrom, const std::wstring& sToResult, NSDoctRenderer::DoctRendererFormat::FormatFile eType, std::wstring& sBinTo, + const InputParams& params, const ConvertParams& convertParams); } // namespace NExtractTools #endif // CEXTRACTTOOLS_H