diff --git a/ASCOfficeDocFile/DocDocxConverter/Converter.cpp b/ASCOfficeDocFile/DocDocxConverter/Converter.cpp index 3287387003..3715d76c64 100644 --- a/ASCOfficeDocFile/DocDocxConverter/Converter.cpp +++ b/ASCOfficeDocFile/DocDocxConverter/Converter.cpp @@ -50,7 +50,7 @@ namespace DocFileFormat { - Converter::Converter() + Converter::Converter() : m_nUserLCID(-1) { } @@ -204,7 +204,7 @@ namespace DocFileFormat _UINT32 Converter::LoadAndConvert(const std::wstring& strSrcFile, const std::wstring& strDstDirectory, const std::wstring& password, const ProgressCallback* progress, bool &bMacros) { - WordDocument doc(progress, m_sTempFolder); + WordDocument doc(progress, m_sTempFolder, m_nUserLCID); WordprocessingDocument docx(strDstDirectory, &doc); _UINT32 result = doc.LoadDocument(strSrcFile, password); diff --git a/ASCOfficeDocFile/DocDocxConverter/Converter.h b/ASCOfficeDocFile/DocDocxConverter/Converter.h index c4d28851f8..d42bb1efbf 100644 --- a/ASCOfficeDocFile/DocDocxConverter/Converter.h +++ b/ASCOfficeDocFile/DocDocxConverter/Converter.h @@ -48,6 +48,7 @@ namespace DocFileFormat ~Converter(); std::wstring m_sTempFolder; + int m_nUserLCID; _UINT32 LoadAndConvert(const std::wstring & strSrcFile, const std::wstring & strDstDirectory, const std::wstring & password, const ProgressCallback* progress, bool &bMacros); diff --git a/ASCOfficeDocFile/DocDocxConverter/WordDocument.cpp b/ASCOfficeDocFile/DocDocxConverter/WordDocument.cpp index 3059ab610d..3d37195bc6 100644 --- a/ASCOfficeDocFile/DocDocxConverter/WordDocument.cpp +++ b/ASCOfficeDocFile/DocDocxConverter/WordDocument.cpp @@ -33,6 +33,7 @@ #include "WordDocument.h" #include "../../Common/OfficeFileErrorDescription.h" +#include "../../Common/MS-LCID.h" #include "../../ASCOfficeXlsFile2/source/XlsFormat/Logic/SummaryInformationStream/SummaryInformation.h" #include "../../ASCOfficeXlsFile2/source/XlsFormat/Binary/CFStream.h" @@ -79,7 +80,7 @@ namespace DocFileFormat 254, 437,//PC 437 255, 850//OEM }; - WordDocument::WordDocument (const ProgressCallback* pCallFunc, const std::wstring & sTempFolder ) : + WordDocument::WordDocument (const ProgressCallback* pCallFunc, const std::wstring & sTempFolder, const int userLCID) : m_PieceTable(NULL), WordDocumentStream(NULL), TableStream(NULL), DataStream(NULL), FIB(NULL), Text(NULL), RevisionAuthorTable(NULL), FontTable(NULL), BookmarkNames(NULL), AutoTextNames(NULL), IndividualFootnotesPlex(NULL), FootnoteReferenceCharactersPlex(NULL), IndividualEndnotesPlex(NULL), @@ -94,6 +95,7 @@ namespace DocFileFormat { m_pCallFunc = pCallFunc; m_sTempFolder = sTempFolder; + m_nUserLCID = userLCID; m_pStorage = NULL; officeArtContent = NULL; @@ -276,6 +278,17 @@ namespace DocFileFormat } FIB->m_CodePage = nDocumentCodePage; + + if (!bDocumentCodePage && m_nUserLCID > 0) + { + int user_codepage = msLCID2DefCodePage(m_nUserLCID); + + if (user_codepage > 0) + { + bDocumentCodePage = true; + nDocumentCodePage = user_codepage; + } + } //------------------------------------------------------------------------------------------------- try { diff --git a/ASCOfficeDocFile/DocDocxConverter/WordDocument.h b/ASCOfficeDocFile/DocDocxConverter/WordDocument.h index 4d5167d492..be5cd5556d 100644 --- a/ASCOfficeDocFile/DocDocxConverter/WordDocument.h +++ b/ASCOfficeDocFile/DocDocxConverter/WordDocument.h @@ -92,7 +92,7 @@ namespace DocFileFormat public: - WordDocument (const ProgressCallback* pCallFunc, const std::wstring & tempFolder ); + WordDocument (const ProgressCallback* pCallFunc, const std::wstring & tempFolder, const int userLCID); virtual ~WordDocument(); _UINT32 LoadDocument(const std::wstring & fileName, const std::wstring & password); @@ -153,6 +153,7 @@ namespace DocFileFormat std::wstring m_sPassword; std::wstring m_sTempFolder; std::wstring m_sTempDecryptFileName; + int m_nUserLCID; const ProgressCallback* m_pCallFunc; diff --git a/ASCOfficeDocFile/DocFormatLib/DocFormatLib.cpp b/ASCOfficeDocFile/DocFormatLib/DocFormatLib.cpp index fc1aad45b8..5a593b3e38 100644 --- a/ASCOfficeDocFile/DocFormatLib/DocFormatLib.cpp +++ b/ASCOfficeDocFile/DocFormatLib/DocFormatLib.cpp @@ -39,7 +39,9 @@ _UINT32 COfficeDocFile::LoadFromFile(const std::wstring & docFile, const std::w _UINT32 hr = 0; DocFileFormat::Converter docToDocx; + docToDocx.m_sTempFolder = m_sTempFolder; + docToDocx.m_nUserLCID = m_nUserLCID; hr= docToDocx.LoadAndConvert(docFile, docxDirectory, password, ffCallBack, bMacros); diff --git a/ASCOfficeDocFile/DocFormatLib/DocFormatLib.h b/ASCOfficeDocFile/DocFormatLib/DocFormatLib.h index 29920d9af8..a6b1e3d9d7 100644 --- a/ASCOfficeDocFile/DocFormatLib/DocFormatLib.h +++ b/ASCOfficeDocFile/DocFormatLib/DocFormatLib.h @@ -43,15 +43,11 @@ struct ProgressCallback; class COfficeDocFile { public: - COfficeDocFile() - { - } + COfficeDocFile() : m_nUserLCID(-1) {} + virtual ~COfficeDocFile() {} - virtual ~COfficeDocFile() - { - } - - std::wstring m_sTempFolder; + std::wstring m_sTempFolder; + int m_nUserLCID; _UINT32 LoadFromFile(const std::wstring & sSrcFileName, const std::wstring & sDstFileName, const std::wstring & password, bool &bMacros, ProgressCallback *ffCallBack = NULL); _UINT32 SaveToFile(const std::wstring & sDstFileName, const std::wstring & sSrcFileName, ProgressCallback *ffCallBack = NULL); diff --git a/ASCOfficeDocFile/DocFormatTest/DocFormatTest.cpp b/ASCOfficeDocFile/DocFormatTest/DocFormatTest.cpp index 33309bf515..2c90c6e52e 100644 --- a/ASCOfficeDocFile/DocFormatTest/DocFormatTest.cpp +++ b/ASCOfficeDocFile/DocFormatTest/DocFormatTest.cpp @@ -77,6 +77,7 @@ HRESULT convert_single(std::wstring srcFileName) COfficeDocFile docFile; docFile.m_sTempFolder = outputDir; + docFile.m_nUserLCID = 1049; bool bMacros = true; HRESULT hRes = docFile.LoadFromFile( srcFileName, dstTempPath, L"password", bMacros, NULL); diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index ea90223214..9706fc05fc 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -2107,8 +2107,10 @@ namespace NExtractTools _UINT32 doc2docx_dir (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) { COfficeDocFile docFile; - docFile.m_sTempFolder = sTemp; + docFile.m_sTempFolder = sTemp; + docFile.m_nUserLCID = (NULL != params.m_nLcid) ? *params.m_nLcid : -1; + bool bMacros = false; _UINT32 hRes = docFile.LoadFromFile( sFrom, sTo, params.getPassword(), bMacros, NULL);