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); }