From 608c5df9fc40542896ccebf4a3226787a341fef5 Mon Sep 17 00:00:00 2001 From: "Ilya.Kirillov" Date: Tue, 30 Jun 2015 14:57:26 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B5=D1=86=D0=B8=D0=B0=D0=BB=D1=8C=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D1=80=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20Djvu=20=D0=B2=20Pdf,=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D0=BE=D0=B9=20=D1=87/=D0=B1=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=80=D1=82=D0=B8=D0=BD=D0=BA=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D1=81=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BD=D1=8B=D0=B5=20=D0=BA?= =?UTF-8?q?=D0=B0=D1=80=D1=82=D0=B8=D0=BD=D0=BA=D0=B8=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=20=D1=81=D0=BF=D0=B5=D1=86=D0=B8=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=B4=D0=BE=D1=81=D1=82=D0=B8=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=B9?= =?UTF-8?q?=20=D1=81=D0=BA=D0=BE=D1=80=D0=BE=D1=81=D1=82=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=B3=D0=BE=20=D1=84=D0=B8=D0=BD?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=D0=B0=20pdf-=D1=84=D0=B0=D0=B9=D0=BB=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@63314 954022d7-b5bf-4e40-9824-e11837661b57 --- .gitignore | 11 + DjVuFile/DjVu.cpp | 5 + DjVuFile/DjVu.h | 1 + DjVuFile/DjVuFile.sln | 3 +- DjVuFile/DjVuFile.vcxproj | 4 +- DjVuFile/DjVuFileImplementation.cpp | 297 ++++++++++++++++++++- DjVuFile/DjVuFileImplementation.h | 7 +- DjVuFile/DjVuFileTest/DjVuFileTest.cpp | 39 ++- DjVuFile/DjVuFileTest/DjVuFileTest.vcxproj | 9 +- DjVuFile/DjVuFileTest/stdafx.h | 5 +- 10 files changed, 364 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index dec8a989b8..fbc1da3143 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,14 @@ ASCOfficePPTXFile/PPTXFormat/!_ ASCOfficePPTXFile/PPTXFormat/_ ASCOfficePPTXFile/Release DesktopEditor/build +DjVuFile/Debug +DjVuFile/DjVuFile.pro.user +DjVuFile/DjVuFile.sdf +DjVuFile/DjVuFile.vcxproj.filters +DjVuFile/DjVuFile.vcxproj.user +DjVuFile/DjVuFileTest/Debug +DjVuFile/DjVuFileTest/DjVuFileTest.vcxproj.filters +DjVuFile/DjVuFileTest/DjVuFileTest.vcxproj.user +DjVuFile/DjVuFileTest/x64 +DjVuFile/ipch +DjVuFile/x64 diff --git a/DjVuFile/DjVu.cpp b/DjVuFile/DjVu.cpp index 14c57bc1ae..2f56cda643 100644 --- a/DjVuFile/DjVu.cpp +++ b/DjVuFile/DjVu.cpp @@ -57,3 +57,8 @@ void CDjVuFile::ConvertToRaster(CApplicationFonts* pAppFonts, int if (m_pImplementation) m_pImplementation->ConvertToRaster(pAppFonts, nPageIndex, wsDstPath, nImageType); } +void CDjVuFile::ConvertToPdf(CApplicationFonts* pAppFonts, const std::wstring& wsDstPath) +{ + if (m_pImplementation) + m_pImplementation->ConvertToPdf(pAppFonts, wsDstPath); +} diff --git a/DjVuFile/DjVu.h b/DjVuFile/DjVu.h index 4581f7f365..328d31ed7a 100644 --- a/DjVuFile/DjVu.h +++ b/DjVuFile/DjVu.h @@ -27,4 +27,5 @@ public: void GetPageInfo(int nPageIndex, double* pdWidth, double* pdHeight, double* pdDpiX, double* pdDpiY) const; void DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pBreak); void ConvertToRaster(CApplicationFonts* pAppFonts, int nPageIndex, const std::wstring& wsDstPath, int nImageType); + void ConvertToPdf(CApplicationFonts* pAppFonts, const std::wstring& wsDstPath); }; \ No newline at end of file diff --git a/DjVuFile/DjVuFile.sln b/DjVuFile/DjVuFile.sln index 7ba8b9eb94..b729764c4b 100644 --- a/DjVuFile/DjVuFile.sln +++ b/DjVuFile/DjVuFile.sln @@ -42,7 +42,8 @@ Global {6D3BC8A8-93A8-468E-90CE-BCEAC28B8788}.Release|Mixed Platforms.Build.0 = Release|Win32 {6D3BC8A8-93A8-468E-90CE-BCEAC28B8788}.Release|Win32.ActiveCfg = Release|Win32 {6D3BC8A8-93A8-468E-90CE-BCEAC28B8788}.Release|Win32.Build.0 = Release|Win32 - {6D3BC8A8-93A8-468E-90CE-BCEAC28B8788}.Release|x64.ActiveCfg = Release|Win32 + {6D3BC8A8-93A8-468E-90CE-BCEAC28B8788}.Release|x64.ActiveCfg = Release|x64 + {6D3BC8A8-93A8-468E-90CE-BCEAC28B8788}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/DjVuFile/DjVuFile.vcxproj b/DjVuFile/DjVuFile.vcxproj index 75bf41f146..4ffab67b25 100644 --- a/DjVuFile/DjVuFile.vcxproj +++ b/DjVuFile/DjVuFile.vcxproj @@ -90,7 +90,7 @@ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;HAVE_NAMESPACES true 4267;4244 - D:\Subversion\AVS\Sources\TeamlabOffice\trunk\ServerComponents\Common\DocxFormat\Source\XML\libxml2\XML\include;D:\Subversion\AVS\Sources\TeamlabOffice\trunk\ServerComponents\DesktopEditor\freetype-2.5.2\include;D:\Subversion\AVS\Sources\TeamlabOffice\trunk\ServerComponents\DesktopEditor\agg-2.4\include;%(AdditionalIncludeDirectories) + ..\..\ServerComponents\Common\DocxFormat\Source\XML\libxml2\XML\include;..\..\ServerComponents\DesktopEditor\freetype-2.5.2\include;..\..\ServerComponents\DesktopEditor\agg-2.4\include;%(AdditionalIncludeDirectories) Windows @@ -126,7 +126,7 @@ WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;HAVE_NAMESPACES true 4267; - D:\Subversion\AVS\Sources\TeamlabOffice\trunk\ServerComponents\DesktopEditor\freetype-2.5.2\include;%(AdditionalIncludeDirectories) + ..\..\ServerComponents\Common\DocxFormat\Source\XML\libxml2\XML\include;..\..\ServerComponents\DesktopEditor\freetype-2.5.2\include;..\..\ServerComponents\DesktopEditor\agg-2.4\include;%(AdditionalIncludeDirectories) Windows diff --git a/DjVuFile/DjVuFileImplementation.cpp b/DjVuFile/DjVuFileImplementation.cpp index 0883204a08..3aec0958c3 100644 --- a/DjVuFile/DjVuFileImplementation.cpp +++ b/DjVuFile/DjVuFileImplementation.cpp @@ -12,6 +12,10 @@ #include "../DesktopEditor/raster/BgraFrame.h" #include "../DesktopEditor/graphics/GraphicsRenderer.h" +#include "../PdfWriter/PdfRenderer.h" +#include "../DesktopEditor/raster/JBig2/source/Encoder/jbig2enc.h" +#include "../DesktopEditor/raster/JBig2/source/LeptonLib/allheaders.h" + #define VER_DPI 96 #define HOR_DPI 96 @@ -58,7 +62,7 @@ namespace NSDjvu CDjVuFileImplementation::CDjVuFileImplementation() { m_pDoc = NULL; - std::wstring wsTempPath = NSFile::CFileBinary::GetTempPathW(); + std::wstring wsTempPath = NSFile::CFileBinary::GetTempPath(); wsTempPath += L"DJVU\\"; m_wsTempDirectory = wsTempPath; NSDirectory::CreateDirectory(m_wsTempDirectory); @@ -145,10 +149,15 @@ void CDjVuFileImplementation::DrawPageOnRenderer(IRenderer* pRende { CreateGrFrame(pRenderer, pPage, pBreak); } + else if (c_nPDFWriter == lRendererType) + { + XmlUtils::CXmlNode oText = ParseText(pPage); + CreatePdfFrame(pRenderer, pPage, nPageIndex, oText); + } else { - XmlUtils::CXmlNode text = ParseText(pPage); - CreateFrame(pRenderer, pPage, nPageIndex, text); + XmlUtils::CXmlNode oText = ParseText(pPage); + CreateFrame(pRenderer, pPage, nPageIndex, oText); } } catch (...) @@ -195,6 +204,31 @@ void CDjVuFileImplementation::ConvertToRaster(CApplicationFonts* p oFrame.SaveFile(wsDstPath, nImageType); RELEASEINTERFACE(pFontManager); } +void CDjVuFileImplementation::ConvertToPdf(CApplicationFonts* pAppFonts, const std::wstring& wsDstPath) +{ + CPdfRenderer oPdf(pAppFonts); + + bool bBreak = false; + for (int nPageIndex = 0, nPagesCount = GetPagesCount(); nPageIndex < nPagesCount; nPageIndex++) + { + oPdf.NewPage(); + + double dPageDpiX, dPageDpiY; + double dWidth, dHeight; + GetPageInfo(nPageIndex, &dWidth, &dHeight, &dPageDpiX, &dPageDpiY); + dWidth *= 25.4 / dPageDpiX; + dHeight *= 25.4 / dPageDpiY; + oPdf.put_Width(dWidth); + oPdf.put_Height(dHeight); + + DrawPageOnRenderer(&oPdf, nPageIndex, &bBreak); +#ifdef _DEBUG + printf("%d of %d pages\n", nPageIndex + 1, nPagesCount); +#endif + } + + oPdf.SaveToFile(wsDstPath); +} void CDjVuFileImplementation::CreateFrame(IRenderer* pRenderer, GP& pPage, int nPage, XmlUtils::CXmlNode& text) { int nWidth = pPage->get_real_width(); @@ -398,6 +432,257 @@ void CDjVuFileImplementation::CreateFrame(IRenderer* pRenderer, GP pRenderer->DrawImage((IGrObject*)&oImage, 0, 0, dRendWidth, dRendHeight); pRenderer->EndCommand(c_nPageType); } +void CDjVuFileImplementation::CreatePdfFrame(IRenderer* pRenderer, GP& pPage, int nPageIndex, XmlUtils::CXmlNode& oText) +{ + double dPageDpiX, dPageDpiY; + double dWidth, dHeight; + GetPageInfo(nPageIndex, &dWidth, &dHeight, &dPageDpiX, &dPageDpiY); + dWidth *= 25.4 / dPageDpiX; + dHeight *= 25.4 / dPageDpiY; + + pRenderer->BeginCommand(c_nPageType); + + TextToRenderer(pRenderer, oText, 25.4 / pPage->get_dpi()); + + LONG lImageWidth = pPage->get_real_width(); + LONG lImageHeight = pPage->get_real_height(); + + CPdfRenderer* pPdf = (CPdfRenderer*)pRenderer; + + if (pPage->is_legal_photo()) + { + BYTE* pBufferDst = new BYTE[4 * lImageHeight * lImageWidth]; + if (!pBufferDst) + return; + + Aggplus::CImage oImage; + oImage.Create(pBufferDst, lImageWidth, lImageHeight, 4 * lImageWidth); + + GRect oRectAll(0, 0, lImageWidth, lImageHeight); + GP pImage = pPage->get_pixmap(oRectAll, oRectAll); + + BYTE* pBuffer = pBufferDst; + for (int j = lImageHeight - 1; j >= 0; --j) + { + GPixel* pLine = pImage->operator [](j); + + for (int i = 0; i < lImageWidth; ++i, pBuffer += 4, ++pLine) + { + pBuffer[0] = pLine->b; + pBuffer[1] = pLine->g; + pBuffer[2] = pLine->r; + pBuffer[3] = 255; + } + } + pRenderer->DrawImage((IGrObject*)&oImage, 0, 0, dWidth, dHeight); + } + else if (pPage->is_legal_compound()) + { + GRect oRectAll(0, 0, lImageWidth, lImageHeight); + GP pIW44Image = pPage->get_bg44(); + if (NULL != pIW44Image) + { + int nBgWidth = pIW44Image->get_width(); + int nBgHeight = pIW44Image->get_height(); + + GP pBgImage = pIW44Image->get_pixmap(); + if (NULL != pBgImage) + { + BYTE* pBgBuffer = new BYTE[4 * nBgWidth * nBgHeight]; + if (!pBgBuffer) + return; + + Aggplus::CImage oBgImage; + oBgImage.Create(pBgBuffer, nBgWidth, nBgHeight, 4 * nBgWidth); + + BYTE* pBuffer = pBgBuffer; + for (int j = nBgHeight - 1; j >= 0; --j) + { + GPixel* pLine = pBgImage->operator [](j); + + for (int i = 0; i < nBgWidth; ++i, pBuffer += 4, ++pLine) + { + pBuffer[0] = pLine->b; + pBuffer[1] = pLine->g; + pBuffer[2] = pLine->r; + pBuffer[3] = 255; + } + } + pRenderer->DrawImage((IGrObject*)&oBgImage, 0, 0, dWidth, dHeight); + } + } + + GP pImage = pPage->get_fgpm(); + if (NULL == pImage) + pImage = pPage->get_fg_pixmap(oRectAll); + + if (NULL != pImage) + { + unsigned int unPixmapH = pImage->rows(); + unsigned int unPixmapW = pImage->columns(); + BYTE* pBufferDst = new BYTE[4 * unPixmapH * unPixmapW]; + if (!pBufferDst) + return; + + Aggplus::CImage oImage; + oImage.Create(pBufferDst, unPixmapW, unPixmapH, 4 * unPixmapW); + + BYTE* pBuffer = pBufferDst; + for (int j = unPixmapH - 1; j >= 0; --j) + { + GPixel* pLine = pImage->operator [](j); + + for (int i = 0; i < unPixmapW; ++i, pBuffer += 4, ++pLine) + { + pBuffer[0] = pLine->b; + pBuffer[1] = pLine->g; + pBuffer[2] = pLine->r; + pBuffer[3] = 255; + } + } + + GP pBitmap = pPage->get_bitmap(oRectAll, oRectAll, 4); + Pix* pPix = pixCreate(lImageWidth, lImageHeight, 1); + if (pPix) + { + for (int nY = 0; nY < lImageHeight; nY++) + { + BYTE* pLine = pBitmap->operator [](nY); + for (int nX = 0; nX < lImageWidth; nX++, pLine++) + { + pixSetPixel(pPix, nX, lImageHeight - 1 - nY, *pLine); + } + } + + pPdf->DrawImageWith1bppMask((IGrObject*)&oImage, pPix, lImageWidth, lImageHeight, 0, 0, dWidth, dHeight); + pixDestroy(&pPix); + } + } + } + else if (pPage->is_legal_bilevel()) + { + GRect oRectAll(0, 0, lImageWidth, lImageHeight); + GP pBitmap = pPage->get_bitmap(oRectAll, oRectAll, 4); + + Pix* pPix = pixCreate(lImageWidth, lImageHeight, 1); + if (pPix) + { + for (int nY = 0; nY < lImageHeight; nY++) + { + BYTE* pLine = pBitmap->operator [](nY); + for (int nX = 0; nX < lImageWidth; nX++, pLine++) + { + pixSetPixel(pPix, nX, lImageHeight - 1 - nY, *pLine); + } + } + + pPdf->DrawImage1bpp(pPix, lImageWidth, lImageHeight, 0, 0, dWidth, dHeight); + pixDestroy(&pPix); + } + } + else + { + // белый фрейм?? + //memset(pBufferDst, 0xFF, 4 * lImageWidth * lImageHeight); + GRect oRectAll(0, 0, lImageWidth, lImageHeight); + GP pImage = pPage->get_pixmap(oRectAll, oRectAll); + + if (NULL != pImage) + { + BYTE* pBufferDst = new BYTE[4 * lImageHeight * lImageWidth]; + if (pBufferDst) + { + Aggplus::CImage oImage; + oImage.Create(pBufferDst, lImageWidth, lImageHeight, 4 * lImageWidth); + + BYTE* pBuffer = pBufferDst; + for (int j = lImageHeight - 1; j >= 0; --j) + { + GPixel* pLine = pImage->operator [](j); + + for (int i = 0; i < lImageWidth; ++i, pBuffer += 4, ++pLine) + { + pBuffer[0] = pLine->b; + pBuffer[1] = pLine->g; + pBuffer[2] = pLine->r; + pBuffer[3] = 255; + } + } + pRenderer->DrawImage((IGrObject*)&oImage, 0, 0, dWidth, dHeight); + } + } + else + { + GP pBitmap = pPage->get_bitmap(oRectAll, oRectAll, 4); + if (NULL != pBitmap) + { + int nPaletteEntries = pBitmap->get_grays(); + if (nPaletteEntries <= 2) + { + Pix* pPix = pixCreate(lImageWidth, lImageHeight, 1); + if (pPix) + { + for (int nY = 0; nY < lImageHeight; nY++) + { + BYTE* pLine = pBitmap->operator [](nY); + for (int nX = 0; nX < lImageWidth; nX++, pLine++) + { + pixSetPixel(pPix, nX, lImageHeight - 1 - nY, *pLine); + } + } + + pPdf->DrawImage1bpp(pPix, lImageWidth, lImageHeight, 0, 0, dWidth, dHeight); + pixDestroy(&pPix); + } + } + else + { + BYTE* pBufferDst = new BYTE[4 * lImageHeight * lImageWidth]; + if (!pBufferDst) + return; + + Aggplus::CImage oImage; + oImage.Create(pBufferDst, lImageWidth, lImageHeight, 4 * lImageWidth); + + DWORD* palette = new DWORD[nPaletteEntries]; + + // Create palette for the bitmap + int color = 0xff0000; + int decrement = color / (nPaletteEntries - 1); + for (int i = 0; i < nPaletteEntries; ++i) + { + BYTE level = (BYTE)(color >> 16); + palette[i] = (0xFF000000 | level << 16 | level << 8 | level); + color -= decrement; + } + + DWORD* pBuffer = (DWORD*)pBufferDst; + for (int j = lImageHeight - 1; j >= 0; --j) + { + BYTE* pLine = pBitmap->operator [](j); + + for (int i = 0; i < lImageWidth; ++i, ++pBuffer, ++pLine) + { + if (*pLine < nPaletteEntries) + { + *pBuffer = palette[*pLine]; + } + else + { + *pBuffer = palette[0]; + } + } + } + + RELEASEARRAYOBJECTS(palette); + pRenderer->DrawImage((IGrObject*)&oImage, 0, 0, dWidth, dHeight); + } + } + } + } + + pRenderer->EndCommand(c_nPageType); +} void CDjVuFileImplementation::CreateGrFrame(IRenderer* pRenderer, GP& pPage, bool* pBreak) { int nWidth = pPage->get_real_width(); @@ -580,7 +865,7 @@ XmlUtils::CXmlNode CDjVuFileImplementation::ParseText(GP pPage) void CDjVuFileImplementation::TextToRenderer(IRenderer* pRenderer, XmlUtils::CXmlNode oTextNode, double dKoef, bool isView) { // Выставим шрифт пустой (чтобы растягивать по всему ректу) - pRenderer->put_FontName(L"AVSEmptyFont"); + pRenderer->put_FontName(L"DjvuEmptyFont"); CString csText = oTextNode.GetXml(); XmlUtils::CXmlNodes oLinesNodes; oTextNode.GetNodes(L"LINE", oLinesNodes); @@ -598,11 +883,11 @@ void CDjVuFileImplementation::TextToRenderer(IRenderer* pRenderer, CString csCoords = oWordNode.GetAttribute(L"coords"); double arrCoords[4]; ParseCoords(csCoords.GetBuffer(), arrCoords, dKoef); - DrawText(pRenderer, arrCoords, csWord.GetBuffer()); + DrawPageText(pRenderer, arrCoords, csWord.GetBuffer()); } } } -void CDjVuFileImplementation::DrawText(IRenderer* pRenderer, double* pdCoords, const std::wstring& wsText) +void CDjVuFileImplementation::DrawPageText(IRenderer* pRenderer, double* pdCoords, const std::wstring& wsText) { pRenderer->put_FontSize(pdCoords[1] - pdCoords[3]); pRenderer->CommandDrawText(wsText, diff --git a/DjVuFile/DjVuFileImplementation.h b/DjVuFile/DjVuFileImplementation.h index 31e8b31ad4..5958e60f52 100644 --- a/DjVuFile/DjVuFileImplementation.h +++ b/DjVuFile/DjVuFileImplementation.h @@ -9,6 +9,7 @@ #include "libdjvu/DataPool.h" #include "libdjvu/DjVuText.h" #include "libdjvu/DjVmNav.h" +#include "libdjvu/IW44Image.h" #define ZIP_NO_COMPRESSION 0 #define ZIP_BEST_SPEED 1 @@ -45,13 +46,15 @@ public: void GetPageInfo(int nPageIndex, double* pdWidth, double* pdHeight, double* pdDpiX, double* pdDpiY) const; void DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pBreak); void ConvertToRaster(CApplicationFonts* pAppFonts, int nPageIndex, const std::wstring& wsDstPath, int nImageType); + void ConvertToPdf(CApplicationFonts* pAppFonts, const std::wstring& wsDstPath); private: - void CreateFrame(IRenderer* pRenderer, GP& pImage, int nPage, XmlUtils::CXmlNode& text); + void CreateFrame(IRenderer* pRenderer, GP& pImage, int nPage, XmlUtils::CXmlNode& oText); + void CreatePdfFrame(IRenderer* pRenderer, GP& pImage, int nPage, XmlUtils::CXmlNode& oText); void CreateGrFrame(IRenderer* pRenderer, GP& pImage, bool* pBreak); XmlUtils::CXmlNode ParseText(GP pPage); void TextToRenderer(IRenderer* pRenderer, XmlUtils::CXmlNode text, double koef, bool isView = true); - void DrawText(IRenderer* pRenderer, double* pdCoords, const std::wstring& wsText); + void DrawPageText(IRenderer* pRenderer, double* pdCoords, const std::wstring& wsText); void ParseCoords(const std::wstring& wsCoordsStr, double* pdCoords, double dKoef); }; diff --git a/DjVuFile/DjVuFileTest/DjVuFileTest.cpp b/DjVuFile/DjVuFileTest/DjVuFileTest.cpp index 988e41ea8d..9f282a2844 100644 --- a/DjVuFile/DjVuFileTest/DjVuFileTest.cpp +++ b/DjVuFile/DjVuFileTest/DjVuFileTest.cpp @@ -8,7 +8,10 @@ #include #include "windows.h" +#include "../../DesktopEditor/common/String.h" #include "../../DesktopEditor/fontengine/ApplicationFonts.h" +#include +#include std::vector GetAllFilesInFolder(std::wstring wsFolder, std::wstring wsExt) { @@ -33,7 +36,7 @@ std::vector GetAllFilesInFolder(std::wstring wsFolder, std::wstrin } return vwsNames; } -void ConvertFolder(CDjVuFile& oReader, std::wstring wsFolderPath) +void ConvertFolderToRaster(CDjVuFile& oReader, std::wstring wsFolderPath) { CApplicationFonts oFonts; oFonts.Initialize(); @@ -64,9 +67,41 @@ void ConvertFolder(CDjVuFile& oReader, std::wstring wsFolderPath) } } } +void ConvertFolderToPdf(CDjVuFile& oReader, std::wstring wsFolderPath) +{ + CApplicationFonts oFonts; + oFonts.Initialize(); + oReader.Close(); + + clock_t oBeginTime = clock(); + std::vector vFiles = GetAllFilesInFolder(wsFolderPath, L"djvu"); + for (int nIndex = 0; nIndex < vFiles.size(); nIndex++) + { + std::wstring wsFilePath = wsFolderPath; + wsFilePath.append(vFiles.at(nIndex)); + std::wstring wsFilePathName = (wsFilePath.substr(0, wsFilePath.size() - 5)); + if (oReader.LoadFromFile(wsFilePath.c_str())) + { + std::wstring wsDstFilePath = wsFilePathName + L".pdf"; + oReader.ConvertToPdf(&oFonts, wsDstFilePath); + printf("%d of %d converted\n", nIndex, vFiles.size()); + } + else + { + printf("%d of %d %S error\n", nIndex, vFiles.size(), vFiles.at(nIndex).c_str()); + } + } + clock_t oEndTime = clock(); + double dElapsedSecs = double(oEndTime - oBeginTime) / CLOCKS_PER_SEC; + printf("%f\n", dElapsedSecs); +} void main() { CDjVuFile oFile; - ConvertFolder(oFile, L"D:/Test Files//"); + //ConvertFolderToRaster(oFile, L"D:/Test Files//"); + ConvertFolderToPdf(oFile, L"D:/Test Files//djvu//"); + + char q; + std::cin >> q; } diff --git a/DjVuFile/DjVuFileTest/DjVuFileTest.vcxproj b/DjVuFile/DjVuFileTest/DjVuFileTest.vcxproj index 3e9e0f95c8..9522070b5f 100644 --- a/DjVuFile/DjVuFileTest/DjVuFileTest.vcxproj +++ b/DjVuFile/DjVuFileTest/DjVuFileTest.vcxproj @@ -99,7 +99,7 @@ Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;HAVE_NAMESPACES;UNICODE;_UNICODE;_USE_LIBXML2_READER_;LIBXML_READER_ENABLED true - D:\Subversion\AVS\Sources\TeamlabOffice\trunk\ServerComponents\DesktopEditor\freetype-2.5.2\include;D:\Subversion\AVS\Sources\TeamlabOffice\trunk\ServerComponents\DesktopEditor\agg-2.4\include;D:\Subversion\AVS\Sources\TeamlabOffice\trunk\ServerComponents\Common\DocxFormat\Source\XML\libxml2\XML\include;%(AdditionalIncludeDirectories) + ..\..\..\ServerComponents\Common\DocxFormat\Source\XML\libxml2\XML\include;..\..\..\ServerComponents\DesktopEditor\freetype-2.5.2\include;..\..\..\ServerComponents\DesktopEditor\agg-2.4\include;%(AdditionalIncludeDirectories) Console @@ -131,9 +131,9 @@ MaxSpeed true true - WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;HAVE_NAMESPACES + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;HAVE_NAMESPACES;UNICODE;_UNICODE;_USE_LIBXML2_READER_;LIBXML_READER_ENABLED true - D:\Subversion\AVS\Sources\TeamlabOffice\trunk\ServerComponents\DesktopEditor\freetype-2.5.2\include;%(AdditionalIncludeDirectories) + ..\..\..\ServerComponents\Common\DocxFormat\Source\XML\libxml2\XML\include;..\..\..\ServerComponents\DesktopEditor\freetype-2.5.2\include;..\..\..\ServerComponents\DesktopEditor\agg-2.4\include;%(AdditionalIncludeDirectories) Console @@ -152,12 +152,15 @@ NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing diff --git a/DjVuFile/DjVuFileTest/stdafx.h b/DjVuFile/DjVuFileTest/stdafx.h index df30986d85..6f65fa6f37 100644 --- a/DjVuFile/DjVuFileTest/stdafx.h +++ b/DjVuFile/DjVuFileTest/stdafx.h @@ -12,11 +12,14 @@ #ifdef _DEBUG -#pragma comment(lib, "../../Common/DocxFormat/Source/XML/libxml2/win_build/x64/Debug/libxml2.lib") #pragma comment(lib, "../x64/Debug/DjVuFile.lib") +#pragma comment(lib, "../../PdfWriter/x64/Debug/PdfWriter.lib") +#pragma comment(lib, "../../Common/DocxFormat/Source/XML/libxml2/win_build/x64/Debug/libxml2.lib") #pragma comment(lib, "../../DesktopEditor/Qt_build/graphics/project/debug/graphics.lib") #else #pragma comment(lib, "../x64/Release/DjVuFile.lib") +#pragma comment(lib, "../../PdfWriter/x64/Release/PdfWriter.lib") +#pragma comment(lib, "../../Common/DocxFormat/Source/XML/libxml2/win_build/x64/Release/libxml2.lib") #pragma comment(lib, "../../DesktopEditor/Qt_build/graphics/project/release/graphics.lib") #endif