mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-10 18:05:41 +08:00
Support images on recognize
This commit is contained in:
@ -45,7 +45,11 @@
|
||||
"_DestroyTextInfo",
|
||||
"_IsNeedCMap",
|
||||
"_SetCMapData",
|
||||
"_ScanPage"
|
||||
"_ScanPage",
|
||||
"_GetImageBase64",
|
||||
"_GetImageBase64Len",
|
||||
"_GetImageBase64Ptr",
|
||||
"_GetImageBase64Free"
|
||||
],
|
||||
"include_path": [
|
||||
"wasm/src/lib",
|
||||
|
||||
@ -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"];
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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_
|
||||
|
||||
@ -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>");
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -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() {}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user