mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-20 11:47:00 +08:00
fix page annotations
This commit is contained in:
@ -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;
|
||||
|
||||
@ -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: для теста, убрать потом
|
||||
};
|
||||
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user