diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp
index eb15d91336..596f243793 100644
--- a/HtmlFile2/htmlfile2.cpp
+++ b/HtmlFile2/htmlfile2.cpp
@@ -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"";
-
- // Получаем размеры картинки
- 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"";
+ 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"";
+
+ // Получаем размеры картинки
+ 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"";
+
+ }
+
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"";
+ 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()
diff --git a/HtmlFile2/test/main.cpp b/HtmlFile2/test/main.cpp
index a21bbfc816..158daf93cb 100644
--- a/HtmlFile2/test/main.cpp
+++ b/HtmlFile2/test/main.cpp
@@ -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);
}