mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
Refactoring and support binary shapes inside own pdf
This commit is contained in:
@ -209,7 +209,6 @@ HRESULT CDocxRenderer::IsSupportAdvancedCommand(const IAdvancedCommand::Advanced
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
// TODO Bin Shapes
|
||||
HRESULT CDocxRenderer::AdvancedCommand(IAdvancedCommand* command)
|
||||
{
|
||||
if (NULL == command)
|
||||
@ -221,14 +220,33 @@ HRESULT CDocxRenderer::AdvancedCommand(IAdvancedCommand* command)
|
||||
{
|
||||
CShapeStart* pShape = (CShapeStart*)command;
|
||||
std::string& sUtf8Shape = pShape->GetShapeXML();
|
||||
UINT nImageId = 0xFFFFFFFF;
|
||||
|
||||
Aggplus::CImage* pImage = pShape->GetShapeImage();
|
||||
if (pImage)
|
||||
{
|
||||
std::shared_ptr<NSDocxRenderer::CImageInfo> pInfo = m_pInternal->m_oDocument.m_oImageManager.GenerateImageID(pImage);
|
||||
std::string sNewId = "r:embed=\"rId" + std::to_string(pInfo->m_nId + c_iStartingIdForImages) + "\"";
|
||||
NSStringUtils::string_replaceA(sUtf8Shape, "r:embed=\"\"", sNewId);
|
||||
nImageId = pInfo->m_nId;
|
||||
}
|
||||
m_pInternal->m_oDocument.m_oCurrentPage.AddCompleteXml(UTF8_TO_U(sUtf8Shape));
|
||||
|
||||
if (!sUtf8Shape.empty() && '<' == sUtf8Shape.at(0))
|
||||
{
|
||||
if (0xFFFFFFFF != nImageId)
|
||||
{
|
||||
std::string sNewId = "r:embed=\"rId" + std::to_string(nImageId + c_iStartingIdForImages) + "\"";
|
||||
NSStringUtils::string_replaceA(sUtf8Shape, "r:embed=\"\"", sNewId);
|
||||
}
|
||||
m_pInternal->m_oDocument.m_oCurrentPage.AddCompleteXml(UTF8_TO_U(sUtf8Shape));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (0xFFFFFFFF != nImageId)
|
||||
{
|
||||
// TODO:
|
||||
}
|
||||
m_pInternal->m_oDocument.m_oCurrentPage.AddCompleteBinBase64(sUtf8Shape);
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
case IAdvancedCommand::AdvancedCommandType::ShapeEnd:
|
||||
|
||||
@ -474,61 +474,24 @@ namespace NSDocxRenderer
|
||||
shape->ToBin(writer);
|
||||
}
|
||||
|
||||
/*
|
||||
// testing m_arCompleteObjectsBinBase64
|
||||
NSWasm::CData test_writer;
|
||||
test_writer.SkipLen();
|
||||
test_writer.AddInt(static_cast<unsigned int>(m_arShapes.size()));
|
||||
for (const auto& shape : m_arShapes)
|
||||
{
|
||||
if (!shape) continue;
|
||||
shape->ToBin(test_writer);
|
||||
|
||||
int size = test_writer.GetSize();
|
||||
BYTE* data = test_writer.GetBuffer();
|
||||
|
||||
int size_base64 = NSBase64::Base64EncodeGetRequiredLength(size);
|
||||
char* data_base64 = new char[size_base64];
|
||||
|
||||
NSBase64::Base64Encode(data, size, (BYTE*)data_base64, &size_base64, NSBase64::B64_BASE64_FLAG_NOCRLF);
|
||||
m_arCompleteObjectsBinBase64.push_back(std::string(data_base64, size_base64));
|
||||
|
||||
delete[] data_base64;
|
||||
}
|
||||
*/
|
||||
|
||||
/* comment it if testing */
|
||||
if (!m_arCompleteObjectsBinBase64.empty())
|
||||
{
|
||||
for (const auto& elem : m_arCompleteObjectsBinBase64)
|
||||
{
|
||||
int buff_len = NSBase64::Base64DecodeGetRequiredLength(elem.size());
|
||||
BYTE* buff = new BYTE[buff_len];
|
||||
bool is_ok = NSBase64::Base64Decode(elem.c_str(), elem.size(), buff, &buff_len);
|
||||
|
||||
if (!is_ok)
|
||||
continue;
|
||||
if (NSBase64::Base64Decode(elem.c_str(), (int)elem.length(), buff, &buff_len))
|
||||
{
|
||||
writer.Write(buff, buff_len);
|
||||
}
|
||||
|
||||
writer.Write(buff, buff_len);
|
||||
delete[] buff;
|
||||
}
|
||||
}
|
||||
|
||||
writer.WriteLen();
|
||||
|
||||
/*
|
||||
test_writer.WriteLen();
|
||||
size_t size = writer.GetSize();
|
||||
size_t test_size = test_writer.GetSize();
|
||||
|
||||
assert(size == test_size);
|
||||
|
||||
auto buffer = writer.GetBuffer();
|
||||
auto test_buffer = writer.GetBuffer();
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
assert(buffer[i] == test_buffer[i]);
|
||||
*/
|
||||
|
||||
return writer;
|
||||
}
|
||||
void CPage::AddCompleteXml(const std::wstring& oXml)
|
||||
|
||||
Reference in New Issue
Block a user