fix page annotations

This commit is contained in:
Kulikova Svetlana
2022-04-04 18:38:26 +03:00
parent f2dd9d1a5f
commit 9dd175bb82
6 changed files with 107 additions and 53 deletions

View File

@ -533,7 +533,6 @@ CPdfRenderer::CPdfRenderer(NSFonts::IApplicationFonts* pAppFonts, bool isPDFA) :
m_pFont = NULL;
m_nCounter = 0;
m_nPagesCount = 0;
m_bNeedUpdateTextFont = true;
m_bNeedUpdateTextColor = true;
@ -646,19 +645,7 @@ HRESULT CPdfRenderer::NewPage()
m_pPage->SetWidth(m_dPageWidth);
m_pPage->SetHeight(m_dPageHeight);
m_oPen.Reset();
m_oBrush.Reset();
m_oFont.Reset();
m_oPath.Clear();
// clear font!!!
m_oFont.SetName(L"");
m_oFont.SetSize(-1);
m_oFont.SetStyle(1 << 5);
m_lClipDepth = 0;
m_nPagesCount++;//printf("Page %d\n", m_nPagesCount++);
Reset();
return S_OK;
}
@ -1180,9 +1167,9 @@ HRESULT CPdfRenderer::EndCommand(const DWORD& dwType)
for (int nIndex = 0, nCount = m_vDestinations.size(); nIndex < nCount; ++nIndex)
{
TDestinationInfo& oInfo = m_vDestinations.at(nIndex);
if (m_nPagesCount > oInfo.unDestPage && m_nPagesCount > oInfo.unPage)
if (m_pDocument->GetPagesCount() > oInfo.unDestPage)
{
AddLink(oInfo.unPage, oInfo.dX, oInfo.dY, oInfo.dW, oInfo.dH, oInfo.dDestX, oInfo.dDestY, oInfo.unDestPage);
AddLink(oInfo.pPage, oInfo.dX, oInfo.dY, oInfo.dW, oInfo.dH, oInfo.dDestX, oInfo.dDestY, oInfo.unDestPage);
m_vDestinations.erase(m_vDestinations.begin() + nIndex);
nIndex--;
nCount--;
@ -1507,13 +1494,14 @@ HRESULT CPdfRenderer::AddLink(const double& dX, const double& dY, const double&
if (unPagesCount == 0)
return S_OK;
if (!m_pDocument->GetPage(nPage))
CPage* pPage = m_pDocument->GetPage(nPage);
if (!pPage)
{
m_vDestinations.push_back(TDestinationInfo(unPagesCount - 1, dX, dY, dW, dH, dDestX, dDestY, nPage));
m_vDestinations.push_back(TDestinationInfo(m_pPage, dX, dY, dW, dH, dDestX, dDestY, nPage));
}
else
{
AddLink(unPagesCount - 1, dX, dY, dW, dH, dDestX, dDestY, nPage);
AddLink(m_pPage, dX, dY, dW, dH, dDestX, dDestY, nPage);
}
return S_OK;
@ -2071,6 +2059,7 @@ bool CPdfRenderer::EditPage(const std::wstring& sPage, const std::pair<int, int>
{
m_dPageWidth = PT_2_MM(m_pPage->GetWidth());
m_dPageHeight = PT_2_MM(m_pPage->GetHeight());
Reset();
return true;
}
return false;
@ -2086,6 +2075,7 @@ bool CPdfRenderer::AddPage(int nPageIndex)
{
m_pPage->SetWidth(MM_2_PT(m_dPageWidth));
m_pPage->SetHeight(MM_2_PT(m_dPageHeight));
Reset();
return true;
}
return false;
@ -2100,6 +2090,19 @@ bool CPdfRenderer::EditClose(const std::wstring& wsPath, const std::wstring& sTr
return false;
m_oCommandManager.Flush();
unsigned int nPagesCount = m_pDocument->GetPagesCount();
for (int nIndex = 0, nCount = m_vDestinations.size(); nIndex < nCount; ++nIndex)
{
TDestinationInfo& oInfo = m_vDestinations.at(nIndex);
if (nPagesCount > oInfo.unDestPage)
{
AddLink(oInfo.pPage, oInfo.dX, oInfo.dY, oInfo.dW, oInfo.dH, oInfo.dDestX, oInfo.dDestY, oInfo.unDestPage);
m_vDestinations.erase(m_vDestinations.begin() + nIndex);
nIndex--;
nCount--;
}
}
return m_pDocument->AddToFile(wsPath, sTrailer);
}
void CPdfRenderer::PageRotate(int nRotate)
@ -2578,6 +2581,20 @@ void CPdfRenderer::UpdateBrush()
m_pPage->SetFillAlpha((unsigned char)m_oBrush.GetAlpha1());
}
}
void CPdfRenderer::Reset()
{
m_oPen.Reset();
m_oBrush.Reset();
m_oFont.Reset();
m_oPath.Clear();
// clear font!!!
m_oFont.SetName(L"");
m_oFont.SetSize(-1);
m_oFont.SetStyle(1 << 5);
m_lClipDepth = 0;
}
HRESULT CPdfRenderer::OnlineWordToPdf (const std::wstring& wsSrcFile, const std::wstring& wsDstFile, const bool& bIsUsePicker, const bool& bIsUsePageCommands)
{
if (!NSOnlineOfficeBinToPdf::ConvertBinToPdf(this, wsSrcFile, wsDstFile, false, bIsUsePicker, bIsUsePageCommands))
@ -2759,9 +2776,9 @@ void CPdfRenderer::CBrushState::Reset()
m_pShadingPoints = NULL;
m_lShadingPointsCount = 0;
}
void CPdfRenderer::AddLink(const unsigned int& unPage, const double& dX, const double& dY, const double& dW, const double& dH, const double& dDestX, const double& dDestY, const unsigned int& unDestPage)
void CPdfRenderer::AddLink(PdfWriter::CPage* pPage, const double& dX, const double& dY, const double& dW, const double& dH, const double& dDestX, const double& dDestY, const unsigned int& unDestPage)
{
CPage* pCurPage = m_pDocument->GetPage(unPage);
CPage* pCurPage = pPage;
CPage* pDestPage = m_pDocument->GetPage(unDestPage);
if (!pCurPage || !pDestPage)
return;

View File

@ -254,6 +254,7 @@ private:
void UpdateTransform();
void UpdatePen();
void UpdateBrush();
void Reset();
bool IsValid()
{
return m_bValid;
@ -269,7 +270,7 @@ private:
{
m_bValid = false;;
}
void AddLink(const unsigned int& unPage, const double& dX, const double& dY, const double& dW, const double& dH, const double& dDestX, const double& dDestY, const unsigned int& unDestPage);
void AddLink(PdfWriter::CPage* pPage, const double& dX, const double& dY, const double& dW, const double& dH, const double& dDestX, const double& dDestY, const unsigned int& unDestPage);
private:
@ -1559,9 +1560,9 @@ private:
};
struct TDestinationInfo
{
TDestinationInfo(const unsigned int& page, const double& x, const double& y, const double& w, const double& h, const double& dx, const double& dy, const unsigned int& undpage)
TDestinationInfo(PdfWriter::CPage* page, const double& x, const double& y, const double& w, const double& h, const double& dx, const double& dy, const unsigned int& undpage)
{
unPage = page;
pPage = page;
dX = x;
dY = y;
dW = w;
@ -1571,7 +1572,7 @@ private:
unDestPage = undpage;
}
unsigned int unPage;
PdfWriter::CPage* pPage;
double dX;
double dY;
double dW;
@ -1873,7 +1874,6 @@ private:
bool m_bValid;
int m_nPagesCount;
int m_nCounter; // TODO: для теста, убрать потом
};

View File

@ -146,7 +146,6 @@ namespace PdfWriter
m_nCurPageNum = -1;
m_vPages.clear();
m_vExtGrStates.clear();
m_vFillAlpha.clear();
m_vStrokeAlpha.clear();
@ -180,7 +179,6 @@ namespace PdfWriter
memset((void*)m_sTTFontTag, 0x00, 8);
m_pDefaultCheckBoxFont = NULL;
m_vPages.clear();
m_vExtGrStates.clear();
m_vStrokeAlpha.clear();
m_vFillAlpha.clear();
@ -279,8 +277,6 @@ namespace PdfWriter
CPage* pPage = new CPage(m_pXref, m_pPageTree, this);
m_pPageTree->AddPage(pPage);
m_pCurPage = pPage;
m_vPages.push_back(pPage);
#ifndef FILTER_FLATE_DECODE_DISABLED
if (m_unCompressMode & COMP_TEXT)
@ -292,14 +288,14 @@ namespace PdfWriter
}
CPage* CDocument::GetPage(const unsigned int &unPage)
{
if (unPage >= m_vPages.size())
if (unPage >= m_pPageTree->GetCount())
return NULL;
return m_vPages.at(unPage);
return m_pPageTree->GetPage(unPage);
}
unsigned int CDocument::GetPagesCount() const
{
return m_vPages.size();
return m_pPageTree->GetCount();
}
void CDocument::SetDocumentID(const std::wstring & documentID)
{
@ -390,11 +386,13 @@ namespace PdfWriter
}
CDestination* CDocument::CreateDestination(unsigned int unPageIndex)
{
if (unPageIndex >= m_vPages.size())
if (unPageIndex >= m_pPageTree->GetCount())
return NULL;
CPage* pPage = m_vPages.at(unPageIndex);
return new CDestination(pPage, m_pXref);
CPage* pPage = m_pPageTree->GetPage(unPageIndex);
if (pPage)
return new CDestination(pPage, m_pXref);
return NULL;
}
CExtGrState* CDocument::FindExtGrState(double dAlphaStroke, double dAlphaFill, EBlendMode eMode, int nStrokeAdjustment)
{
@ -501,8 +499,9 @@ namespace PdfWriter
CAnnotation* pAnnot = new CTextAnnotation(m_pXref, oRect, sText);
if (pAnnot)
{
CPage* pPage = m_vPages.at(unPageNum);
pPage->AddAnnotation(pAnnot);
CPage* pPage = m_pPageTree->GetPage(unPageNum);
if (pPage)
pPage->AddAnnotation(pAnnot);
}
return pAnnot;
@ -513,8 +512,9 @@ namespace PdfWriter
if (pAnnot)
{
CPage* pPage = m_vPages.at(unPageNum);
pPage->AddAnnotation(pAnnot);
CPage* pPage = m_pPageTree->GetPage(unPageNum);
if (pPage)
pPage->AddAnnotation(pAnnot);
}
return pAnnot;
@ -534,8 +534,9 @@ namespace PdfWriter
if (pAnnot)
{
CPage* pPage = m_vPages.at(unPageNum);
pPage->AddAnnotation(pAnnot);
CPage* pPage = m_pPageTree->GetPage(unPageNum);
if (pPage)
pPage->AddAnnotation(pAnnot);
}
return pAnnot;
@ -1064,6 +1065,10 @@ namespace PdfWriter
m_pXref->SetPrevAddr(nPosLastXRef);
m_pLastXref = m_pXref;
m_pTrailer = m_pXref->GetTrailer();
if (!m_pTrailer)
return false;
SetCompressionMode(COMP_ALL);
if (!sEncrypt.empty())
@ -1103,8 +1108,7 @@ namespace PdfWriter
if (!m_pPageTree)
return pRes;
int nI = 0;
CObjectBase* pObj = m_pPageTree->GetPage(nPageIndex, nI);
CObjectBase* pObj = m_pPageTree->GetObj(nPageIndex);
if (pObj)
{
pRes.first = pObj->GetObjId();
@ -1135,10 +1139,9 @@ namespace PdfWriter
if (!m_pPageTree)
return NULL;
int nI = 0;
CPage* pNewPage = new CPage(m_pXref, NULL, this);
CObjectBase* pObj = m_pPageTree->GetPage(nPageIndex, nI, false, true, pNewPage);
if (!pObj)
bool bRes = m_pPageTree->InsertPage(nPageIndex, pNewPage);
if (!bRes)
return NULL;
#ifndef FILTER_FLATE_DECODE_DISABLED
@ -1153,8 +1156,7 @@ namespace PdfWriter
if (!m_pPageTree)
return false;
int nI = 0;
CObjectBase* pObj = m_pPageTree->GetPage(nPageIndex, nI, true);
CObjectBase* pObj = m_pPageTree->RemovePage(nPageIndex);
if (pObj)
{
CXref* pXref = new CXref(this, pObj->GetObjId(), pObj->GetGenNo());

View File

@ -199,7 +199,6 @@ namespace PdfWriter
bool m_bEncrypt;
CEncryptDict* m_pEncryptDict;
unsigned int m_unCompressMode;
std::vector<CPage*> m_vPages;
std::vector<CExtGrState*> m_vExtGrStates;
std::vector<CExtGrState*> m_vStrokeAlpha;
std::vector<CExtGrState*> m_vFillAlpha;

View File

@ -225,14 +225,40 @@ namespace PdfWriter
m_pPages->Add(pPage);
(*m_pCount)++;
}
CObjectBase* CPageTree::GetPage(int nPageIndex, int& nI, bool bRemove, bool bInsert, CDictObject* pPage)
CObjectBase* CPageTree::GetObj(int nPageIndex)
{
int nI = 0;
return GetFromPageTree(nPageIndex, nI);
}
CPage* CPageTree::GetPage(int nPageIndex)
{
int nI = 0;
CObjectBase* pObj = GetFromPageTree(nPageIndex, nI);
if (pObj && pObj->GetType() == object_type_DICT && ((CDictObject*)pObj)->GetDictType() == dict_type_PAGE)
return (CPage*)pObj;
return NULL;
}
CObjectBase* CPageTree::RemovePage(int nPageIndex)
{
int nI = 0;
return GetFromPageTree(nPageIndex, nI, true);
}
bool CPageTree::InsertPage(int nPageIndex, CPage* pPage)
{
int nI = 0;
CObjectBase* pObj = GetFromPageTree(nPageIndex, nI, false, true, pPage);
if (pObj)
return true;
return false;
}
CObjectBase* CPageTree::GetFromPageTree(int nPageIndex, int& nI, bool bRemove, bool bInsert, CPage* pPage)
{
for (int i = 0, count = m_pPages->GetCount(); i < count; ++i)
{
CObjectBase* pObj = m_pPages->Get(i);
CObjectBase* pRes = NULL;
if (pObj->GetType() == object_type_DICT && ((CDictObject*)pObj)->GetDictType() == dict_type_PAGES)
pRes = ((CPageTree*)pObj)->GetPage(nPageIndex, nI, bRemove, bInsert, pPage);
pRes = ((CPageTree*)pObj)->GetFromPageTree(nPageIndex, nI, bRemove, bInsert, pPage);
else
{
if (nPageIndex == nI)

View File

@ -54,6 +54,7 @@ namespace PdfWriter
class CTextLine;
class CTextWord;
class CFieldBase;
class CPage;
//----------------------------------------------------------------------------------------
// CPageTree
//----------------------------------------------------------------------------------------
@ -63,13 +64,22 @@ namespace PdfWriter
CPageTree(CXref* pXref);
CPageTree(CXref* pXref, const std::wstring& sPageTree);
void AddPage(CDictObject* pPage);
CObjectBase* GetPage(int nPageIndex, int& nI, bool bRemove = false, bool bInsert = false, CDictObject* pPage = NULL);
CObjectBase* GetObj(int nPageIndex);
CPage* GetPage(int nPageIndex);
CObjectBase* RemovePage(int nPageIndex);
bool InsertPage(int nPageIndex, CPage* pPage);
bool Join(CPageTree* pPageTree);
unsigned int GetCount()
{
return m_pCount ? m_pCount->Get() : 0;
}
EDictType GetDictType() const
{
return dict_type_PAGES;
}
private:
CObjectBase* GetFromPageTree(int nPageIndex, int& nI, bool bRemove = false, bool bInsert = false, CPage* pPage = NULL);
CNumberObject* m_pCount;
CArrayObject* m_pPages;
CXref* m_pXref;