Commit 2470bfd3 authored by Ilya Kirillov's avatar Ilya Kirillov

Fixed bug with caching fonts for different pages. Fixed bug with drawing a text.

parent 3ae52bd2
...@@ -262,9 +262,9 @@ namespace PdfReader ...@@ -262,9 +262,9 @@ namespace PdfReader
} }
void CPdfReader::ConvertToRaster(int nPageIndex, const std::wstring& wsDstPath, int nImageType, const int nRasterW, const int nRasterH) void CPdfReader::ConvertToRaster(int nPageIndex, const std::wstring& wsDstPath, int nImageType, const int nRasterW, const int nRasterH)
{ {
CFontManager *pFontManager = m_pInternal->m_pAppFonts->GenerateFontManager(); CFontManager *pFontManager = m_pInternal->m_pAppFonts->GenerateFontManager();
CFontsCache* pFontCache = new CFontsCache(); CFontsCache* pFontCache = new CFontsCache();
pFontCache->SetStreams(m_pInternal->m_pAppFonts->GetStreams()); pFontCache->SetStreams(m_pInternal->m_pAppFonts->GetStreams());
pFontManager->SetOwnerCache(pFontCache); pFontManager->SetOwnerCache(pFontCache);
CGraphicsRenderer oRenderer; CGraphicsRenderer oRenderer;
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#include "GFont.h" #include "GFont.h"
#include "File.h" #include "File.h"
#include "Stream.h" #include "Stream.h"
#include "XRef.h"
namespace PdfReader namespace PdfReader
{ {
...@@ -1945,12 +1946,10 @@ namespace PdfReader ...@@ -1945,12 +1946,10 @@ namespace PdfReader
} }
else else
{ {
// Нет ссылки на данный шрифт, но ссылка нам нужна как идентефикатор, поэтому выбираем некотый уникальный номер
// (поскольку корректное версионное число состоит из 5 цифр, поэтому любое 6-циферное число будет безопасным решением)
oRef.nNum = nIndex; oRef.nNum = nIndex;
if (pFontDictRef) if (pXref)
{ {
oRef.nGen = 100000 + pFontDictRef->nNum; oRef.nGen = pXref->GenerateUniqueRefGen();
} }
else else
{ {
...@@ -1998,4 +1997,4 @@ namespace PdfReader ...@@ -1998,4 +1997,4 @@ namespace PdfReader
} }
return NULL; return NULL;
} }
} }
\ No newline at end of file
...@@ -69,25 +69,35 @@ namespace PdfReader ...@@ -69,25 +69,35 @@ namespace PdfReader
} }
bool operator <(const Ref& oRight)const bool operator <(const Ref& oRight)const
{ {
return nNum < oRight.nNum; if (nNum < oRight.nNum)
return true;
else if (nNum == oRight.nNum)
return nGen < oRight.nGen;
else
return false;
} }
bool operator >(const Ref& oRight)const bool operator >(const Ref& oRight)const
{ {
return nNum > oRight.nNum; if (nNum > oRight.nNum)
return true;
else if (nNum == oRight.nNum)
return nGen > oRight.nGen;
else
return false;
} }
bool operator <=(const Ref& oRight)const bool operator <=(const Ref& oRight)const
{ {
if (*this == oRight) if (*this == oRight)
return true; return true;
return nNum < oRight.nNum; return (*this < oRight);
} }
bool operator >=(const Ref& oRight)const bool operator >=(const Ref& oRight)const
{ {
if (*this == oRight) if (*this == oRight)
return true; return true;
return nNum > oRight.nNum; return (*this > oRight);
} }
}; };
......
...@@ -345,7 +345,7 @@ namespace PdfReader ...@@ -345,7 +345,7 @@ namespace PdfReader
m_bTransparentGroupSoftMask = false; m_bTransparentGroupSoftMask = false;
m_pTransparentGroupSoftMask = NULL; m_pTransparentGroupSoftMask = NULL;
m_bDrawOnlyText = false; m_bDrawOnlyText = false;
//m_oFontList.LoadFromFile( m_pGlobalParams->GetTempFolder() ); //m_oFontList.LoadFromFile( m_pGlobalParams->GetTempFolder() );
//// Тестовый пример //// Тестовый пример
...@@ -461,7 +461,7 @@ namespace PdfReader ...@@ -461,7 +461,7 @@ namespace PdfReader
if (c_nHtmlRendrerer2 == m_lRendererType) if (c_nHtmlRendrerer2 == m_lRendererType)
m_bDrawOnlyText = ((NSHtmlRenderer::CASCHTMLRenderer3*)m_pRenderer)->GetOnlyTextMode(); m_bDrawOnlyText = ((NSHtmlRenderer::CASCHTMLRenderer3*)m_pRenderer)->GetOnlyTextMode();
else else
m_bDrawOnlyText = false; m_bDrawOnlyText = false;
} }
void RendererOutputDev::EndPage() void RendererOutputDev::EndPage()
{ {
...@@ -3003,7 +3003,7 @@ namespace PdfReader ...@@ -3003,7 +3003,7 @@ namespace PdfReader
//m_oFont.Size *= dTextScale; //m_oFont.Size *= dTextScale;
double dOldSize = 10.0; double dOldSize = 10.0;
m_pRenderer->get_FontSize(&dOldSize); m_pRenderer->get_FontSize(&dOldSize);
m_pRenderer->put_FontSize(dOldSize * dTextScale); m_pRenderer->put_FontSize(std::fabs(dOldSize * dTextScale));
pNewTm[0] = pTm[0] * dITextScale; pNewTm[0] = pTm[0] * dITextScale;
pNewTm[1] = pTm[1] * dITextScale; pNewTm[1] = pTm[1] * dITextScale;
...@@ -3032,22 +3032,24 @@ namespace PdfReader ...@@ -3032,22 +3032,24 @@ namespace PdfReader
if (true) if (true)
{ {
double dDet = sqrt(arrMatrix[0] * arrMatrix[3] - arrMatrix[1] * arrMatrix[2]); double dNorma = min(sqrt(arrMatrix[0] * arrMatrix[0] + arrMatrix[1] * arrMatrix[1]), sqrt(arrMatrix[2] * arrMatrix[2] + arrMatrix[3] * arrMatrix[3]));
arrMatrix[0] /= dDet; if (dNorma > 0.001)
arrMatrix[1] /= dDet; {
arrMatrix[2] /= dDet; arrMatrix[0] /= dNorma;
arrMatrix[3] /= dDet; arrMatrix[1] /= dNorma;
arrMatrix[2] /= dNorma;
double dSize = 1; arrMatrix[3] /= dNorma;
m_pRenderer->get_FontSize(&dSize);
m_pRenderer->put_FontSize(dSize * dDet); double dSize = 1;
m_pRenderer->get_FontSize(&dSize);
m_pRenderer->put_FontSize(dSize * dNorma);
}
} }
double dShiftX = 0, dShiftY = 0; double dShiftX = 0, dShiftY = 0;
DoTransform(arrMatrix, &dShiftX, &dShiftY, true); DoTransform(arrMatrix, &dShiftX, &dShiftY, true);
// Здесь мы посылаем координаты текста в пунктах // Здесь мы посылаем координаты текста в пунктах
double dPageHeight = pGState->GetPageHeight(); double dPageHeight = pGState->GetPageHeight();
std::wstring wsUnicodeText; std::wstring wsUnicodeText;
......
...@@ -241,6 +241,10 @@ namespace PdfReader ...@@ -241,6 +241,10 @@ namespace PdfReader
m_nPermissionFlags = DefaultPermissionFlags; m_nPermissionFlags = DefaultPermissionFlags;
m_bOwnerPassword = false; m_bOwnerPassword = false;
// Если нет ссылки на данный объект, а ссылка нам нужна как идентефикатор, то выбираем некотый уникальный номер
// (поскольку корректное версионное число состоит из 5 цифр, поэтому любое 6-циферное число будет безопасным решением)
m_unRefGenCounter = 100000;
// Читаем Trailer // Читаем Trailer
m_pStream = pStream; m_pStream = pStream;
m_nStart = m_pStream->GetStartPos(); m_nStart = m_pStream->GetStartPos();
...@@ -1066,4 +1070,4 @@ namespace PdfReader ...@@ -1066,4 +1070,4 @@ namespace PdfReader
} }
return unRes; return unRes;
} }
} }
\ No newline at end of file
...@@ -142,6 +142,10 @@ namespace PdfReader ...@@ -142,6 +142,10 @@ namespace PdfReader
{ {
return &m_oTrailerDict; return &m_oTrailerDict;
} }
unsigned int GenerateUniqueRefGen()
{
return m_unRefGenCounter++;
}
private: private:
...@@ -181,6 +185,8 @@ namespace PdfReader ...@@ -181,6 +185,8 @@ namespace PdfReader
int m_nEncryptVersion; // Версия шифровки int m_nEncryptVersion; // Версия шифровки
CryptAlgorithm m_eEncryptAlgorithm; // Алгоритм шифрования CryptAlgorithm m_eEncryptAlgorithm; // Алгоритм шифрования
unsigned int m_unRefGenCounter; // Специальный счетчик для генерации уникальных ссылок для встроенных объектов
NSCriticalSection::CRITICAL_SECTION m_oCS; NSCriticalSection::CRITICAL_SECTION m_oCS;
}; };
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment