Support images on recognize

This commit is contained in:
Oleg Korshul
2024-05-14 21:43:21 +03:00
parent 6af44146e5
commit d85b3dd7f0
8 changed files with 104 additions and 8 deletions

View File

@ -45,7 +45,11 @@
"_DestroyTextInfo",
"_IsNeedCMap",
"_SetCMapData",
"_ScanPage"
"_ScanPage",
"_GetImageBase64",
"_GetImageBase64Len",
"_GetImageBase64Ptr",
"_GetImageBase64Free"
],
"include_path": [
"wasm/src/lib",

View File

@ -158,6 +158,8 @@
this.fontPageIndex = -1;
this.fontPageUpdateType = UpdateFontsSource.Undefined;
this.fontStreams = {};
this.scannedImages = {};
}
CFile.prototype["loadFromData"] = function(arrayBuffer)
@ -1641,6 +1643,28 @@
return shapes;
};
CFile.prototype["getImageBase64"] = function(rId)
{
let strId = "" + rId;
if (this.scannedImages[strId])
return this.scannedImages[strId];
let strPtr = Module["_GetImageBase64"](this.nativeFile, rId);
if (0 == strPtr)
{
this.scannedImages[strId] = "error";
return this.scannedImages[strId];
}
let len = Module["_GetImageBase64Len"](strPtr);
let ptr = Module["_GetImageBase64Ptr"](strPtr);
var buffer = new Uint8Array(Module["HEAP8"].buffer, ptr, len);
this.scannedImages[strId] = String.prototype.fromUtf8(buffer, 0, len);
Module["_GetImageBase64Free"](strPtr);
return this.scannedImages[strId];
};
CFile.prototype.memory = function()
{
return Module["HEAP8"];

View File

@ -267,6 +267,23 @@ WASM_EXPORT BYTE* ScanPage(CGraphicsFileDrawing* pGraphics, int nPageIndex, int
return pGraphics->GetPageShapes(nPageIndex, mode);
}
WASM_EXPORT void* GetImageBase64(CGraphicsFileDrawing* pGraphics, int rId)
{
return pGraphics->GetImageBase64(rId);
}
WASM_EXPORT int GetImageBase64Len(std::string* p)
{
return (int)p->length();
}
WASM_EXPORT char* GetImageBase64Ptr(std::string* p)
{
return (char*)p->c_str();
}
WASM_EXPORT void GetImageBase64Free(std::string* p)
{
*p = "";
}
#ifdef __cplusplus
}
#endif

View File

@ -220,6 +220,13 @@ public:
oRes.ClearWithoutAttack();
return res;
}
std::string* GetImageBase64(int nRId)
{
if (NULL == pImageStorage)
return NULL;
return pImageStorage->GetBase64(nRId);
}
};
#endif // _WASM_GRAPHICS_

View File

@ -944,6 +944,38 @@ namespace NSDocxRenderer
}
void CShape::ToXmlPptx(NSStringUtils::CStringBuilder &oWriter) const
{
if (m_eType == eShapeType::stPicture)
{
// TODO:
oWriter.WriteString(L"<p:pic>");
oWriter.WriteString(L"<p:nvPicPr>");
oWriter.WriteString(L"<p:cNvPr id=\"");
oWriter.AddUInt(m_pImageInfo->m_nId);
oWriter.WriteString(L"\" name=\"Picture ");
oWriter.AddUInt(m_pImageInfo->m_nId);
oWriter.WriteString(L"\"/>");
oWriter.WriteString(L"<p:cNvPicPr><a:picLocks noChangeAspect=\"1\"/></p:cNvPicPr>");
oWriter.WriteString(L"<p:nvPr/>");
oWriter.WriteString(L"</p:nvPicPr>");
oWriter.WriteString(L"<p:blipFill>");
oWriter.WriteString(L"<a:blip r:embed=\"rId");
oWriter.AddUInt(c_iStartingIdForImages + m_pImageInfo->m_nId);
oWriter.WriteString(L"\">");
oWriter.WriteString(L"</a:blip>");
oWriter.WriteString(L"<a:stretch><a:fillRect/></a:stretch>");
oWriter.WriteString(L"</p:blipFill>");
oWriter.WriteString(L"<p:spPr>");
BuildForm(oWriter, true);
oWriter.WriteString(L"<a:prstGeom prst=\"rect\">");
oWriter.WriteString(L"<a:avLst/>");
oWriter.WriteString(L"</a:prstGeom>");
oWriter.WriteString(L"</p:spPr>");
oWriter.WriteString(L"</p:pic>");
return;
}
oWriter.WriteString(L"<p:sp>");
oWriter.WriteString(L"<p:spPr>");

View File

@ -21,7 +21,7 @@ namespace NSDocxRenderer
public:
virtual std::shared_ptr<CImageInfo> GenerateImageID(Aggplus::CImage* pImage) = 0;
virtual std::map<std::wstring, std::string>* GetImages() = 0;
virtual std::string* GetBase64(const int& nRId) = 0;
};
DOCXRENDERER_DECL_EXPORT IImageStorage* CreateWasmImageStorage();

View File

@ -1,5 +1,6 @@
#include "ImageManager.h"
#include "../../../../DesktopEditor/common/Directory.h"
#include "../../resources/Constants.h"
namespace NSDocxRenderer
{
@ -10,7 +11,7 @@ namespace NSDocxRenderer
{
private:
std::map<DWORD, std::shared_ptr<CImageInfo>> m_mapImageData;
std::map<std::wstring, std::string> m_mapImages;
std::map<int, std::string> m_mapImages;
int m_lMaxSizeImage{1200};
int m_lNextIDImage{0};
@ -87,21 +88,31 @@ namespace NSDocxRenderer
oBgraFrame.put_Data(NULL);
int nBase64DataSize = NSBase64::Base64EncodeGetRequiredLength(nEncodeBufferSize);
char* pBase64Data = new char[nBase64DataSize];
int nHeaderSize = (pInfo->m_eType == CImageInfo::itPNG) ? 22 : 23;
NSBase64::Base64Encode(pEncodeBuffer, nEncodeBufferSize, (BYTE*)pBase64Data, &nBase64DataSize, NSBase64::B64_BASE64_FLAG_NOCRLF);
char* pBase64Data = new char[nBase64DataSize + nHeaderSize];
if (pInfo->m_eType == CImageInfo::itPNG)
memcpy(pBase64Data, "data:image/png;base64,", nHeaderSize);
else
memcpy(pBase64Data, "data:image/jpeg;base64,", nHeaderSize);
NSBase64::Base64Encode(pEncodeBuffer, nEncodeBufferSize, (BYTE*)pBase64Data + nHeaderSize, &nBase64DataSize, NSBase64::B64_BASE64_FLAG_NOCRLF);
RELEASEARRAYOBJECTS(pEncodeBuffer);
m_mapImages.insert(std::pair<std::wstring, std::string>(pInfo->m_strFileName, std::string(pBase64Data, nBase64DataSize)));
m_mapImages.insert(std::pair<int, std::string>((int)pInfo->m_nId, std::string(pBase64Data, nHeaderSize + nBase64DataSize)));
RELEASEARRAYOBJECTS(pBase64Data);
m_mapImageData.insert(std::pair<DWORD, std::shared_ptr<CImageInfo>>(dwSum, pInfo));
return pInfo;
}
virtual std::map<std::wstring, std::string>* GetImages()
virtual std::string* GetBase64(const int& nRId)
{
return &m_mapImages;
std::map<int, std::string>::iterator iter = m_mapImages.find(nRId - c_iStartingIdForImages);
if (iter == m_mapImages.end())
return NULL;
return &iter->second;
}
};

View File

@ -55,6 +55,7 @@ public:
int GetRotate(int nPageIndex) { return 0; }
void GetPageInfo(int nPageIndex, double* pdWidth, double* pdHeight, double* pdDpiX, double* pdDpiY) {}
bool IsEditPage() { return false; }
bool EditPage(int nPageIndex) { return false; }
void AddShapeXML(const std::string& sXML) {}
void EndMarkedContent() {}
};