vsdx in ole

This commit is contained in:
ElenaSubbotina
2025-05-21 19:27:10 +03:00
parent 5067d33c84
commit 31e5d626ca
5 changed files with 133 additions and 32 deletions

View File

@ -548,6 +548,7 @@ namespace NSBinPptxRW
std::wstring m_strFolderThemes;
std::wstring m_strFolderExternalThemes;
_INT32 m_nCountImage = 1;
_INT32 m_nCountEmbedded = 1;
_INT32 m_nCountCharts = 1;
_INT32 m_nCountDiagram = 1;

View File

@ -40,8 +40,13 @@
#include "../../Binary/Document/BinReader/FileWriter.h"
#include "../../Binary/Document/DocWrapper/FontProcessor.h"
#include "../../Binary/Document/DocWrapper/XlsxSerializer.h"
#include "../../Binary/Document/DocWrapper/VsdxSerializer.h"
#include "../../Binary/Sheets/Reader/BinaryWriterS.h"
#include "../../Binary/Sheets/Writer/BinaryReaderS.h"
#include "../../Binary/Draw/BinaryWriterV.h"
#include "../../Binary/Draw/BinaryReaderV.h"
#include "../../Binary/MathEquation/MathEquation.h"
#include "SpTree.h"
@ -401,11 +406,11 @@ namespace PPTX
oDrawingConverter.SetFontPicker(pWriter->m_pCommon->m_pFontPicker);
int type = 0;
BYTE embedded_type = 0;
if (office_checker.nFileType == AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX ||
office_checker.nFileType == AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM)
{
type = 1;
embedded_type = 1;
BinDocxRW::CDocxSerializer* old_serializer = pWriter->m_pMainDocument;
BinDocxRW::CDocxSerializer oDocxSerializer;
@ -421,7 +426,7 @@ namespace PPTX
office_checker.nFileType == AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSM ||
office_checker.nFileType == AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB)
{
type = 2;
embedded_type = 2;
BinXlsxRW::BinaryFileWriter xlsxBinaryWriter(oFontProcessor);
OOX::Spreadsheet::CXlsx *pXlsxEmbedded = NULL;
@ -464,7 +469,26 @@ namespace PPTX
}
//else if (office_checker.nFileType == AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX)
//{ todooo
// embedded_type = 3;
//}
else if (office_checker.nFileType == AVS_OFFICESTUDIO_FILE_DRAW_VSDX ||
office_checker.nFileType == AVS_OFFICESTUDIO_FILE_DRAW_VSDM ||
office_checker.nFileType == AVS_OFFICESTUDIO_FILE_DRAW_VSTX)
{
embedded_type = 5;
BinVsdxRW::BinaryFileWriter oBinaryFileWriter(oFontProcessor);
NSBinPptxRW::CBinaryFileWriter& oBufferedStream = *oDrawingConverter.m_pBinaryWriter;
oBufferedStream.m_strMainFolder = oDrawingConverter.m_pImageManager->GetDstFolder();
OOX::Draw::CVsdx* pVsdx = new OOX::Draw::CVsdx(oox_unpacked);
oBinaryFileWriter.WriteMainTableStart(oBufferedStream);
oBinaryFileWriter.WriteContent(pVsdx, &oDrawingConverter);
oBinaryFileWriter.WriteMainTableEnd();
RELEASEOBJECT(pVsdx);
}
else
{//unknown ms package
oDrawingConverter.m_pBinaryWriter->WriteString1(2, ole_file->filename().GetFilename());
@ -475,7 +499,7 @@ namespace PPTX
oDrawingConverter.m_pBinaryWriter->m_pCommon->m_pMediaManager = old_manager;
//---------------------------------------------------------------------------------------------------------------------
pWriter->StartRecord(1);
pWriter->WriteBYTE(type);
pWriter->WriteBYTE(embedded_type);
pWriter->EndRecord();
pWriter->StartRecord(2);
@ -487,13 +511,14 @@ namespace PPTX
}
else if ( std::wstring::npos != sProgID.find(L"Equation"))
{
BYTE embedded_type = 4;
pWriter->StartRecord(1);
pWriter->WriteBYTE(4);
pWriter->WriteBYTE(embedded_type);
pWriter->EndRecord();
MathEquation::CEquationReader oReader (ole_file->filename().GetPath().c_str());
MathEquation::BinaryEquationWriter oBinEqWriter(pWriter);
MathEquation::CEquationReader oReader (ole_file->filename().GetPath().c_str());
MathEquation::BinaryEquationWriter oBinEqWriter(pWriter);
oReader.SetOutputDev(&oBinEqWriter);
@ -613,8 +638,12 @@ namespace PPTX
}
else if (embedded_type == 5)
{
ReadOoxmlZip(pReader, sDstEmbedded, pReader->GetData() + pReader->GetPos(), _embed_data_size);
ReadVsdxBin(pReader, sDstEmbedded, pReader->GetData() + pReader->GetPos(), _embed_data_size);
}
else if (embedded_type == 6) //???
{
ReadOoxmlZip(pReader, sDstEmbedded, pReader->GetData() + pReader->GetPos(), _embed_data_size);
}
}
pReader->Seek(_end_embed_data);
}break;
@ -1771,6 +1800,12 @@ namespace PPTX
case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTX: sTrueFilename = L"Microsoft_PowerPoint" + std::to_wstring(id) + L".potx"; break;
case AVS_OFFICESTUDIO_FILE_PRESENTATION_POTM: sTrueFilename = L"Microsoft_PowerPoint" + std::to_wstring(id) + L".potm"; break;
case AVS_OFFICESTUDIO_FILE_PRESENTATION_PPSM: sTrueFilename = L"Microsoft_PowerPoint" + std::to_wstring(id) + L".ppsm"; break;
case AVS_OFFICESTUDIO_FILE_DRAW_VSDX: sTrueFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + L".vsdx"; break;
case AVS_OFFICESTUDIO_FILE_DRAW_VSDM: sTrueFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + L".vsdm"; break;
case AVS_OFFICESTUDIO_FILE_DRAW_VSSX: sTrueFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + L".vssx"; break;
case AVS_OFFICESTUDIO_FILE_DRAW_VSTX: sTrueFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + L".vstx"; break;
case AVS_OFFICESTUDIO_FILE_DRAW_VSSM: sTrueFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + L".vssm"; break;
case AVS_OFFICESTUDIO_FILE_DRAW_VSTM: sTrueFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + L".vstm"; break;
}
}
if (false == sTrueFilename.empty())
@ -1903,6 +1938,50 @@ namespace PPTX
m_OleObjectFile->set_filename(sDstEmbedded + FILE_SEPARATOR_STR + sXlsxFilename, false);
NSDirectory::DeleteDirectory(sDstEmbeddedTemp);
return true;
}
bool COLEObject::ReadVsdxBin(NSBinPptxRW::CBinaryFileReader* pReader, const std::wstring& sDstEmbedded, BYTE* pData, long length)
{
m_OleObjectFile = new OOX::OleObject(NULL, true, pReader->m_nDocumentType == XMLWRITER_DOC_TYPE_DOCX);
int id = pReader->m_nCountEmbedded++; //todoooo -> countEmbeddedObjects
std::wstring sDstEmbeddedTemp = sDstEmbedded + FILE_SEPARATOR_STR + L"Temp";
NSDirectory::CreateDirectory(sDstEmbeddedTemp);
NSBinPptxRW::CDrawingConverter oDrawingConverter;
oDrawingConverter.m_pReader->Init(pData, 0, length);
std::wstring sXmlOptions, sMediaPath, sEmbedPath;
BinVsdxRW::CVsdxSerializer::CreateVsdxFolders(sDstEmbeddedTemp, sMediaPath, sEmbedPath);
oDrawingConverter.SetDstPath(sDstEmbeddedTemp + FILE_SEPARATOR_STR + L"visio");
oDrawingConverter.SetSrcPath(pReader->m_strFolder + FILE_SEPARATOR_STR, XMLWRITER_DOC_TYPE_VSDX);
oDrawingConverter.SetMediaDstPath(sMediaPath);
oDrawingConverter.SetEmbedDstPath(sEmbedPath);
OOX::Draw::CVsdx oVsdx;
boost::unordered_map<std::wstring, size_t> old_enum_map = oVsdx.m_mapEnumeratedGlobal;
BinVsdxRW::BinaryFileReader oEmbeddedReader;
BinVsdxRW::SaveParams oSaveParams(true);
oEmbeddedReader.ReadContent(oVsdx, *oDrawingConverter.m_pReader, pReader->m_strFolder, sDstEmbeddedTemp, oSaveParams);
OOX::CContentTypes oContentTypes;
oVsdx.Write(sDstEmbeddedTemp, oContentTypes);
COfficeUtils oOfficeUtils(NULL);
std::wstring sVsdxFilename = L"Microsoft_Visio_Drawing" + std::to_wstring(id) + (oSaveParams.bMacroEnabled ? L".vsdm" : L".vsdx");
oOfficeUtils.CompressFileOrDirectory(sDstEmbeddedTemp, sDstEmbedded + FILE_SEPARATOR_STR + sVsdxFilename, true);
oVsdx.m_mapEnumeratedGlobal = old_enum_map;
pReader->m_pRels->m_pManager->m_pContentTypes->AddDefault(oSaveParams.bMacroEnabled ? L"vsdm" : L"vsdx");
m_OleObjectFile->set_filename(sDstEmbedded + FILE_SEPARATOR_STR + sVsdxFilename, false);
NSDirectory::DeleteDirectory(sDstEmbeddedTemp);
return true;
}

View File

@ -100,6 +100,7 @@ namespace PPTX
nullable_string m_sAlternateContenteXml;
private:
bool ReadVsdxBin(NSBinPptxRW::CBinaryFileReader* pReader, const std::wstring& sDstEmbedded, BYTE* pData, long length);
bool ReadXlsxBin(NSBinPptxRW::CBinaryFileReader* pReader, const std::wstring& sDstEmbedded, BYTE* pData, long length);
bool ReadDocxBin(NSBinPptxRW::CBinaryFileReader* pReader, const std::wstring& sDstEmbedded, BYTE* pData, long length);
bool ReadOoxmlZip(NSBinPptxRW::CBinaryFileReader* pReader, const std::wstring& sDstEmbedded, BYTE* pData, long length);

View File

@ -154,23 +154,17 @@ namespace OOX
if (Rel.IsInit() && Rel->Rid.IsInit())
{
CPath out = pWriter->m_strMainFolder + FILE_SEPARATOR_STR + L"media";
CPath out = pWriter->m_pCommon->m_pMediaManager->m_strDstMedia;
smart_ptr<OOX::File> pFile = pWriter->GetRels()->Find(Rel->Rid->GetValue());
OOX::OleObject* pOleObject = dynamic_cast<OOX::OleObject*>(pFile.GetPointer());
CPath image_path;
CPath ole_path;
if (pOleObject)
{
image_path = pOleObject->filename_cache();
CPath ole = pOleObject->filename();
//todooo check correct path inside container
NSFile::CFileBinary::Copy(ole.GetPath(), out.GetPath() + FILE_SEPARATOR_STR + ole.GetFilename());
pWriter->StartRecord(2);
pWriter->WriteString(ole.GetFilename());
pWriter->EndRecord();
ole_path = pOleObject->filename();
}
else
{
@ -180,11 +174,11 @@ namespace OOX
image_path = pMedia->filename();
}
}
std::wstring image_name_new;
if (false == image_path.GetPath().empty())
{
//todooo check correct path inside container
std::wstring image_name_new = image_path.GetFilename();
image_name_new = image_path.GetFilename();
std::wstring image_ext_new = image_path.GetExtention();
std::map<std::wstring, NSShapeImageGen::CMediaInfo>::iterator pFind = pWriter->m_pCommon->m_pMediaManager->m_mapMediaFiles.find(image_path.GetFilename());
@ -193,8 +187,7 @@ namespace OOX
NSShapeImageGen::CMediaInfo oInfo;
oInfo.m_lID = ++pWriter->m_pCommon->m_pMediaManager->m_lNextIDImage;
oInfo.m_sExt = image_path.GetExtention();
oInfo.m_sName = L"image" + std::to_wstring(oInfo.m_lID);
image_name_new = oInfo.m_sName;
image_name_new = oInfo.m_sName = L"image" + std::to_wstring(oInfo.m_lID);
pWriter->m_pCommon->m_pMediaManager->m_mapMediaFiles.insert(std::make_pair(image_path.GetFilename(), oInfo));
}
@ -248,11 +241,29 @@ namespace OOX
}
}
}
if (false == ole_path.GetPath().empty())
{
if (image_name_new.empty())
{
NSShapeImageGen::CMediaInfo oInfo;
oInfo.m_lID = ++pWriter->m_pCommon->m_pMediaManager->m_lNextIDImage;
image_name_new = oInfo.m_sName = L"image" + std::to_wstring(oInfo.m_lID);
pWriter->m_pCommon->m_pMediaManager->m_mapMediaFiles.insert(std::make_pair(image_path.GetFilename(), oInfo));
}
std::wstring ole_name_new = image_name_new + ole_path.GetExtention();
//todooo check correct path inside container
NSFile::CFileBinary::Copy(ole_path.GetPath(), out.GetPath() + FILE_SEPARATOR_STR + ole_name_new);
pWriter->StartRecord(2);
pWriter->WriteString(ole_name_new);
pWriter->EndRecord();
}
}
}
void CForeignData::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
std::wstring media_filename, ole_filename;
std::wstring image_filename, ole_filename;
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
pReader->Skip(1); // start attributes
@ -311,7 +322,7 @@ namespace OOX
case 1:
{
pReader->Skip(4);
media_filename = pReader->GetString2();
image_filename = pReader->GetString2();
}break;
case 2:
{
@ -328,14 +339,20 @@ namespace OOX
if (ole_filename.empty() == false)
{
int idOle = pReader->m_nCountEmbedded++; //todoooo -> countEmbeddedObjects
int idImage = pReader->m_nCountImage++;
std::wstring ole_filename_dst = L"oleObject" + std::to_wstring(idOle) + CPath(ole_filename).GetExtention();
std::wstring image_filename_dst = L"image" + std::to_wstring(idImage) + CPath(image_filename).GetExtention();
std::wstring srcMedia = pReader->m_strFolder + FILE_SEPARATOR_STR + L"media" + FILE_SEPARATOR_STR;
NSFile::CFileBinary::Copy(srcMedia + ole_filename, pReader->m_pRels->m_pManager->GetDstEmbed() + FILE_SEPARATOR_STR + ole_filename);
NSFile::CFileBinary::Copy(srcMedia + media_filename, pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + media_filename);
NSFile::CFileBinary::Copy(srcMedia + ole_filename, pReader->m_pRels->m_pManager->GetDstEmbed() + FILE_SEPARATOR_STR + ole_filename_dst);
NSFile::CFileBinary::Copy(srcMedia + image_filename, pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + image_filename_dst);
OleObject* pOle = new OleObject(NULL, false, false);
pOle->set_filename(pReader->m_pRels->m_pManager->GetDstEmbed() + FILE_SEPARATOR_STR + ole_filename, false);
pOle->set_filename_cache(pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + media_filename);
pOle->set_filename(pReader->m_pRels->m_pManager->GetDstEmbed() + FILE_SEPARATOR_STR + ole_filename_dst, false);
pOle->set_filename_cache(pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + image_filename_dst);
COfficeFileFormatChecker checker;
if (checker.isOOXFormatFile(pOle->filename().GetPath()))
@ -348,10 +365,10 @@ namespace OOX
Rel.Init(); Rel->Rid.Init();
Rel->Rid->SetValue(pReader->GetRels()->Add(oFile).get());
if (media_filename.empty() == false)
if (image_filename_dst.empty() == false)
{
Image* pImage = new Image(NULL, false);
pImage->set_filename(pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + media_filename, false);
pImage->set_filename(pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + image_filename_dst, false);
smart_ptr<OOX::File> oFileCache(pImage);
pOle->Add(oFileCache);
@ -360,11 +377,14 @@ namespace OOX
else
{
std::wstring srcMedia = pReader->m_strFolder + FILE_SEPARATOR_STR + L"media" + FILE_SEPARATOR_STR;
int idImage = pReader->m_nCountImage++;
std::wstring image_filename_dst = L"image" + std::to_wstring(idImage) + CPath(image_filename).GetExtention();
NSFile::CFileBinary::Copy(srcMedia + media_filename, pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + media_filename);
NSFile::CFileBinary::Copy(srcMedia + image_filename, pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + image_filename_dst);
Image* pImage = new Image(NULL, false);
pImage->set_filename(pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + media_filename, false);
pImage->set_filename(pReader->m_pRels->m_pManager->GetDstMedia() + FILE_SEPARATOR_STR + image_filename_dst, false);
smart_ptr<OOX::File> oFile(pImage);
Rel.Init(); Rel->Rid.Init();

View File

@ -1731,7 +1731,7 @@ namespace Draw
if (pJsaProject->IsExist() && !pJsaProject->IsExternal())
{
std::wstring pathJsa = pJsaProject->filename().GetPath();
if (std::wstring::npos != pathJsa.find(pWriter->m_strMainFolder))
//if (std::wstring::npos != pathJsa.find(pWriter->m_strMainFolder)) //out path
{
BYTE* pData = NULL;
DWORD nBytesCount;