From 846caf6bcf741a7c5f000ad3b58a80e891bcffca Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Sun, 10 Apr 2016 15:15:31 +0300 Subject: [PATCH] DocFormat - embedded docx elements as docx (xml) parts --- .../DocDocxConverter/ContentTypes.h | 3 +++ .../DocDocxConverter/OleObjectMapping.h | 21 +++++++++++++++---- .../DocDocxConverter/OpenXmlPackage.cpp | 15 +++++++++++-- .../DocDocxConverter/OpenXmlPackage.h | 1 + 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/ASCOfficeDocFile/DocDocxConverter/ContentTypes.h b/ASCOfficeDocFile/DocDocxConverter/ContentTypes.h index 166723da9a..b8acbee5fd 100644 --- a/ASCOfficeDocFile/DocDocxConverter/ContentTypes.h +++ b/ASCOfficeDocFile/DocDocxConverter/ContentTypes.h @@ -27,6 +27,8 @@ namespace OpenXmlContentTypes static const TCHAR* OleObject = _T("application/vnd.openxmlformats-officedocument.oleObject"); static const TCHAR* Vml = _T("application/vnd.openxmlformats-officedocument.vmlDrawing"); static const TCHAR* Drawing = _T("application/vnd.openxmlformats-officedocument.drawing+xml"); + + static const TCHAR* MSWordDocx = _T("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); static const TCHAR* MSExcel = _T("application/vnd.ms-excel"); static const TCHAR* MSWord = _T("application/msword"); @@ -124,6 +126,7 @@ namespace OpenXmlRelationshipTypes static const TCHAR* Image = _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"); static const TCHAR* OleObject = _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject"); static const TCHAR* GlossaryDocument = _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/glossaryDocument"); + static const TCHAR* Package = _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"); } namespace MicrosoftWordRelationshipTypes diff --git a/ASCOfficeDocFile/DocDocxConverter/OleObjectMapping.h b/ASCOfficeDocFile/DocDocxConverter/OleObjectMapping.h index b8af7f2638..43de09192e 100644 --- a/ASCOfficeDocFile/DocDocxConverter/OleObjectMapping.h +++ b/ASCOfficeDocFile/DocDocxConverter/OleObjectMapping.h @@ -35,7 +35,9 @@ namespace DocFileFormat //type if ( ole->fLinked ) { - int relID = m_context->_docx->RegisterExternalOLEObject(_caller, ole->ClipboardFormat, ole->Link); + int relID = -1; + + m_context->_docx->RegisterExternalOLEObject(_caller, ole->ClipboardFormat, ole->Link); m_pXmlWriter->WriteAttribute( _T( "r:id" ), ( wstring( _T( "rId" ) ) + FormatUtils::IntToWideString( relID ) ).c_str() ); m_pXmlWriter->WriteAttribute( _T( "Type" ), _T( "Link" ) ); @@ -43,7 +45,11 @@ namespace DocFileFormat } else { - int relID = m_context->_docx->RegisterOLEObject(_caller, ole->ClipboardFormat); + int relID = -1; + if (ole->isEquation || ole->isEmbedded) + relID = m_context->_docx->RegisterPackage(_caller, ole->ClipboardFormat); + else + relID = m_context->_docx->RegisterOLEObject(_caller, ole->ClipboardFormat); m_pXmlWriter->WriteAttribute( _T( "r:id" ), ( wstring( _T( "rId" ) ) + FormatUtils::IntToWideString( relID ) ).c_str() ); m_pXmlWriter->WriteAttribute( _T( "Type" ), _T( "Embed" ) ); @@ -86,7 +92,7 @@ namespace DocFileFormat { objectExt = _T( ".ppt" ); } - else if ( objectType == _T( "MSWordDocx" ) )//??? + else if ( objectType == _T( "MSWordDocx" ) ) { objectExt = _T( ".docx" ); } @@ -113,7 +119,14 @@ namespace DocFileFormat { objectContentType = OpenXmlContentTypes::MSPowerpoint; } - + else if ( objectType == _T( "MSWordDocx" ) ) + { + objectContentType = OpenXmlContentTypes::MSWordDocx; + } + else if ( objectType == _T( "Equation" ) ) + { + objectContentType = OpenXmlContentTypes::Xml; + } return objectContentType; } diff --git a/ASCOfficeDocFile/DocDocxConverter/OpenXmlPackage.cpp b/ASCOfficeDocFile/DocDocxConverter/OpenXmlPackage.cpp index 5713b1d56a..6b0f10602f 100644 --- a/ASCOfficeDocFile/DocDocxConverter/OpenXmlPackage.cpp +++ b/ASCOfficeDocFile/DocDocxConverter/OpenXmlPackage.cpp @@ -364,7 +364,14 @@ namespace DocFileFormat return AddPart( mapping, _T( "word" ), fileName, OleObjectMapping::GetContentType( objectType ), OpenXmlRelationshipTypes::OleObject ); } + int OpenXmlPackage::RegisterPackage(const IMapping* mapping, const std::wstring& objectType) + { + std::wstring fileName = ( std::wstring( _T( "embeddings/oleObject" ) ) + FormatUtils::IntToWideString( ++_oleCounter ) + OleObjectMapping::GetTargetExt(objectType)); + DocumentContentTypesFile._defaultTypes.insert( make_pair( OleObjectMapping::GetTargetExt( objectType ).erase( 0, 1 ), OleObjectMapping::GetContentType(objectType))); + + return AddPart( mapping, _T( "word" ), fileName, OleObjectMapping::GetContentType( objectType ), OpenXmlRelationshipTypes::Package); + } int OpenXmlPackage::RegisterExternalOLEObject(const IMapping* mapping, const std::wstring& objectType, const std::wstring& uri) { std::wstring fullUri = std::wstring(_T("file:///")) + uri; @@ -377,8 +384,12 @@ namespace DocFileFormat int OpenXmlPackage::AddPart( const std::wstring& packageDir, const std::wstring& fileName, const std::wstring& contentType, const std::wstring& relationshipType, const std::wstring& targetMode ) { - if ( ( contentType != _T( "" ) ) && ( contentType != OpenXmlContentTypes::OleObject ) && - ( contentType != OpenXmlContentTypes::MSExcel ) && ( contentType != OpenXmlContentTypes::MSWord ) && + if (( contentType != _T( "" ) ) && + ( contentType != OpenXmlContentTypes::Xml ) && + ( contentType != OpenXmlContentTypes::MSWordDocx ) && + ( contentType != OpenXmlContentTypes::OleObject ) && + ( contentType != OpenXmlContentTypes::MSExcel ) && + ( contentType != OpenXmlContentTypes::MSWord ) && ( contentType != OpenXmlContentTypes::MSPowerpoint ) ) { std::wstring partOverride; diff --git a/ASCOfficeDocFile/DocDocxConverter/OpenXmlPackage.h b/ASCOfficeDocFile/DocDocxConverter/OpenXmlPackage.h index d54b6676e6..30c9d31030 100644 --- a/ASCOfficeDocFile/DocDocxConverter/OpenXmlPackage.h +++ b/ASCOfficeDocFile/DocDocxConverter/OpenXmlPackage.h @@ -147,6 +147,7 @@ namespace DocFileFormat int RegisterComments(); int RegisterImage( const IMapping* mapping, Global::BlipType blipType ); int RegisterOLEObject( const IMapping* mapping, const wstring& objectType ); + int RegisterPackage(const IMapping* mapping, const std::wstring& objectType); int RegisterExternalOLEObject( const IMapping* mapping, const wstring& objectType, const wstring& uri ); }; }