This commit is contained in:
Kulikova Svetlana
2020-08-12 14:46:06 +03:00
parent 430f85d141
commit 8560152cd4
2 changed files with 145 additions and 105 deletions

View File

@ -18,6 +18,8 @@
#include "../DesktopEditor/common/Path.h"
#include "../DesktopEditor/xml/include/xmlutils.h"
#include "../DesktopEditor/raster/BgraFrame.h"
#include "../DesktopEditor/graphics/pro/Fonts.h"
#include "../DesktopEditor/graphics/pro/Graphics.h"
#ifndef VALUE2STR
#define VALUE_TO_STRING(x) #x
@ -687,7 +689,7 @@ private:
bWasP = true;
}
// Картинки
else if(sName == L"img" || sName == L"image")
else if(sName == L"img")
{
readImage();
bWasP = false;
@ -904,112 +906,114 @@ private:
{
while(m_oLightReader.MoveToNextAttribute())
{
std::wstring sAName = m_oLightReader.GetName();
if(sAName == L"src" || sAName == L"href")
if(m_oLightReader.GetName() != L"src")
continue;
bool bRes = false;
std::wstring sSrcM = m_oLightReader.GetText();
std::wstring sImageName = L"";
std::wstring sImageId = std::to_wstring(m_nImageId);
size_t nLen = (sSrcM.length() > 4 ? 4 : 0);
// Картинка Base64
if(sSrcM.substr(0, nLen) == L"data")
{
bool bRes = false;
std::wstring sSrcM = m_oLightReader.GetText();
std::wstring sImageName = L"";
std::wstring sImageId = std::to_wstring(m_nImageId);
size_t nLen = (sSrcM.length() > 4 ? 4 : 0);
// Картинка Base64
if(sSrcM.substr(0, nLen) == L"data")
size_t nBase = sSrcM.find(L"/", nLen) + 1;
std::wstring sType = sSrcM.substr(nBase, sSrcM.find(L";", nBase) - nBase);
sImageName = sImageId + L"." + sType;
NSFile::CFileBinary oImageWriter;
if(oImageWriter.CreateFileW(m_sDst + L"/word/media/i" + sImageName))
{
size_t nBase = sSrcM.find(L"/", nLen) + 1;
std::wstring sType = sSrcM.substr(nBase, sSrcM.find(L";", nBase) - nBase);
sImageName = sImageId + L"." + sType;
NSFile::CFileBinary oImageWriter;
if(oImageWriter.CreateFileW(m_sDst + L"/word/media/" + sImageName))
{
bRes = true;
size_t nBase = sSrcM.find(L"base64", nLen) + 7;
std::string sBase64 = m_oLightReader.GetTextA().substr(nBase);
int nSrcLen = (int)sBase64.length();
int nDecodeLen = NSBase64::Base64DecodeGetRequiredLength(nSrcLen);
BYTE* pImageData = new BYTE[nDecodeLen];
if (TRUE == NSBase64::Base64Decode(sBase64.c_str(), nSrcLen, pImageData, &nDecodeLen))
oImageWriter.WriteFile(pImageData, (DWORD)nDecodeLen);
RELEASEARRAYOBJECTS(pImageData);
oImageWriter.CloseFile();
}
}
// Картинка в сети
else if(sSrcM.substr(0, nLen) == L"http" || !m_sBase.empty())
{
sImageName = NSFile::GetFileName(sSrcM);
CFileDownloader oDownloadImg(m_sBase + sSrcM, false);
oDownloadImg.SetFilePath(m_sDst + L"/word/media/" + sImageName);
bRes = oDownloadImg.DownloadSync();
}
// Картинка по относительному пути
else
{
size_t nSrcM = sSrcM.rfind(L"/") + 1;
sImageName = sSrcM.substr(nSrcM);
bRes = NSFile::CFileBinary::Copy(m_sSrc + L"/" + sSrcM, m_sDst + L"/word/media/" + sImageName);
if(!bRes)
bRes = NSFile::CFileBinary::Copy(m_sSrc + L"/" + sImageName, m_sDst + L"/word/media/" + sImageName);
}
if(bRes)
{
m_nImageId++;
// Прописать рельсы
m_oDocXmlRels += L"<Relationship Id=\"rPic";
m_oDocXmlRels += sImageId;
m_oDocXmlRels += L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/";
m_oDocXmlRels += sImageName;
m_oDocXmlRels += L"\"/>";
// Получаем размеры картинки
CBgraFrame oBgraFrame;
oBgraFrame.OpenFile(m_sDst + L"/word/media/" + sImageName);
int nHy = oBgraFrame.get_Height();
int nWx = oBgraFrame.get_Width();
if(nWx > nHy)
{
int nW = nWx * 9525;
nW = (nW > 7000000 ? 7000000 : nW);
nHy = (int)((double)nHy * (double)nW / (double)nWx);
nWx = nW;
}
else
{
int nH = nHy * 9525;
nH = (nH > 9000000 ? 9000000 : nH);
int nW = (int)((double)nWx * (double)nH / (double)nHy);
if(nW > 7000000)
{
nW = 7000000;
nHy = (int)((double)nHy * (double)nW / (double)nWx);
}
else
nHy = nH;
nWx = nW;
}
// Пишем в document.xml
m_oDocXml += L"<w:r><w:drawing><wp:inline distT=\"0\" distB=\"0\" distL=\"0\" distR=\"0\"><wp:extent cx=\"";
m_oDocXml += std::to_wstring(nWx);
m_oDocXml += L"\" cy=\"";
m_oDocXml += std::to_wstring(nHy);
m_oDocXml += L"\"/><wp:docPr id=\"";
m_oDocXml += sImageId;
m_oDocXml += L"\" name=\"\"/><a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:nvPicPr><pic:cNvPr id=\"";
m_oDocXml += sImageId;
m_oDocXml += L"\" name=\"\"/><pic:cNvPicPr></pic:cNvPicPr></pic:nvPicPr><pic:blipFill><a:blip r:embed=\"rPic";
m_oDocXml += sImageId;
m_oDocXml += L"\"/><a:stretch/></pic:blipFill><pic:spPr bwMode=\"auto\"><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"";
m_oDocXml += std::to_wstring(nWx);
m_oDocXml += L"\" cy=\"";
m_oDocXml += std::to_wstring(nHy);
m_oDocXml += L"\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r>";
bRes = true;
size_t nBase = sSrcM.find(L"base64", nLen) + 7;
std::string sBase64 = m_oLightReader.GetTextA().substr(nBase);
int nSrcLen = (int)sBase64.length();
int nDecodeLen = NSBase64::Base64DecodeGetRequiredLength(nSrcLen);
BYTE* pImageData = new BYTE[nDecodeLen];
if (TRUE == NSBase64::Base64Decode(sBase64.c_str(), nSrcLen, pImageData, &nDecodeLen))
oImageWriter.WriteFile(pImageData, (DWORD)nDecodeLen);
RELEASEARRAYOBJECTS(pImageData);
oImageWriter.CloseFile();
}
}
// Картинка в сети
else if(sSrcM.substr(0, nLen) == L"http" || !m_sBase.empty())
{
sImageName = NSFile::GetFileName(sSrcM);
CFileDownloader oDownloadImg(m_sBase + sSrcM, false);
oDownloadImg.SetFilePath(m_sDst + L"/word/media/i" + sImageName);
bRes = oDownloadImg.DownloadSync();
}
// Картинка по относительному пути
else
{
size_t nSrcM = sSrcM.rfind(L"/") + 1;
sImageName = sSrcM.substr(nSrcM);
bRes = NSFile::CFileBinary::Copy(m_sSrc + L"/" + sSrcM, m_sDst + L"/word/media/i" + sImageName);
if(!bRes)
bRes = NSFile::CFileBinary::Copy(m_sSrc + L"/" + sImageName, m_sDst + L"/word/media/i" + sImageName);
}
if(bRes)
ImageRels(sImageId, L"i" + sImageName);
}
m_oLightReader.MoveToElement();
}
void ImageRels(const std::wstring& sImageId, const std::wstring& sImageName)
{
m_nImageId++;
// Прописать рельсы
m_oDocXmlRels += L"<Relationship Id=\"rPic";
m_oDocXmlRels += sImageId;
m_oDocXmlRels += L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/";
m_oDocXmlRels += sImageName;
m_oDocXmlRels += L"\"/>";
// Получаем размеры картинки
CBgraFrame oBgraFrame;
oBgraFrame.OpenFile(m_sDst + L"/word/media/" + sImageName);
int nHy = oBgraFrame.get_Height();
int nWx = oBgraFrame.get_Width();
if(nWx > nHy)
{
int nW = nWx * 9525;
nW = (nW > 7000000 ? 7000000 : nW);
nHy = (int)((double)nHy * (double)nW / (double)nWx);
nWx = nW;
}
else
{
int nH = nHy * 9525;
nH = (nH > 9000000 ? 9000000 : nH);
int nW = (int)((double)nWx * (double)nH / (double)nHy);
if(nW > 7000000)
{
nW = 7000000;
nHy = (int)((double)nHy * (double)nW / (double)nWx);
}
else
nHy = nH;
nWx = nW;
}
// Пишем в document.xml
m_oDocXml += L"<w:r><w:drawing><wp:inline distT=\"0\" distB=\"0\" distL=\"0\" distR=\"0\"><wp:extent cx=\"";
m_oDocXml += std::to_wstring(nWx);
m_oDocXml += L"\" cy=\"";
m_oDocXml += std::to_wstring(nHy);
m_oDocXml += L"\"/><wp:docPr id=\"";
m_oDocXml += sImageId;
m_oDocXml += L"\" name=\"\"/><a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:nvPicPr><pic:cNvPr id=\"";
m_oDocXml += sImageId;
m_oDocXml += L"\" name=\"\"/><pic:cNvPicPr></pic:cNvPicPr></pic:nvPicPr><pic:blipFill><a:blip r:embed=\"rPic";
m_oDocXml += sImageId;
m_oDocXml += L"\"/><a:stretch/></pic:blipFill><pic:spPr bwMode=\"auto\"><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"";
m_oDocXml += std::to_wstring(nWx);
m_oDocXml += L"\" cy=\"";
m_oDocXml += std::to_wstring(nHy);
m_oDocXml += L"\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r>";
}
void readSVG()
{
// Сохранить как .svg картинку
@ -1029,19 +1033,55 @@ private:
if(bNeedXmlns)
oSVG += L"xmlns=\"http://www.w3.org/2000/svg\"";
oSVG += L">";
oSVG += m_oLightReader.GetInnerXml();
std::wstring sSVG = m_oLightReader.GetInnerXml();
size_t nRef = sSVG.find(L"image");
while(nRef != std::wstring::npos)
{
size_t nHRef = sSVG.find(L"href", nRef);
if(nHRef == std::wstring::npos)
break;
nHRef += 6;
if(sSVG.compare(nHRef, 4, L"http") == 0)
{
nRef = sSVG.find(L"image", nRef + 5);
continue;
}
size_t nHRefLen = sSVG.find(L"\"", nHRef);
std::wstring sImageName = sSVG.substr(nHRef, nHRefLen - nHRef);
bool bRes = NSFile::CFileBinary::Copy(m_sSrc + L"/" + sImageName, m_sDst + L"/word/media/" + NSFile::GetFileName(sImageName));
if(!bRes)
bRes = NSFile::CFileBinary::Copy(m_sSrc + L"/" + NSFile::GetFileName(sImageName), m_sDst + L"/word/media/" + NSFile::GetFileName(sImageName));
if(bRes)
sSVG.replace(nHRef, nHRefLen - nHRef, NSFile::GetFileName(sImageName));
nRef = sSVG.find(L"image", nRef + 5);
}
oSVG += sSVG;
oSVG += L"</svg>";
std::wstring sImageId = std::to_wstring(m_nImageId);
NSFile::CFileBinary oSVGWriter;
std::wstring sImageId = std::to_wstring(m_nImageId++);
if (oSVGWriter.CreateFileW(m_sDst + L"/word/media/" + sImageId + L".svg"))
std::wstring sImageFile = m_sDst + L"/word/media/" + sImageId + L".svg";
if (oSVGWriter.CreateFileW(sImageFile))
{
oSVGWriter.WriteStringUTF8(oSVG.GetData());
oSVGWriter.CloseFile();
}
// Прописать рельсы
// Прописать в document.xml
// Конвертация из svg в png
NSFonts::IApplicationFonts* pFonts = NSFonts::NSApplication::Create();
MetaFile::IMetaFile* pMetafile = MetaFile::Create(pFonts);
bool bLoad = pMetafile->LoadFromFile(sImageFile.data());
if(bLoad)
{
std::wstring sPngFile = m_sDst + L"/word/media/" + sImageId + L".png";
pMetafile->ConvertToRaster(sPngFile.data(), 4, 1000);
}
pMetafile->Release();
pFonts->Release();
ImageRels(sImageId, sImageId + L".png");
}
std::wstring content()

View File

@ -36,7 +36,7 @@ int main()
else
{
// Файл, который открываем
std::wstring sFile = NSFile::GetProcessDirectory() + L"/../../../examples/test.xhtml";
std::wstring sFile = NSFile::GetProcessDirectory() + L"/../../../examples/test4.xhtml";
nResConvert = oFile.Open(sFile, sOutputDirectory, &oParams);
}