add page by index

This commit is contained in:
Kulikova Svetlana
2022-04-01 16:41:02 +03:00
parent 9220b65861
commit f2dd9d1a5f
8 changed files with 60 additions and 32 deletions

View File

@ -585,7 +585,7 @@ return 0;
if (!m_pInternal->m_pPdfWriter || !m_pInternal->m_pPDFDocument)
return false;
return m_pInternal->m_pPdfWriter->NewPage();
return m_pInternal->m_pPdfWriter->AddPage(nPageIndex);
}
bool CPdfReader::EditClose(const std::wstring& wsPath)
{

View File

@ -2071,7 +2071,21 @@ 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());
return true;
}
return false;
}
bool CPdfRenderer::AddPage(int nPageIndex)
{
if (!IsValid())
return false;
m_oCommandManager.Flush();
m_pPage = m_pDocument->AddPage(nPageIndex);
if (m_pPage)
{
m_pPage->SetWidth(MM_2_PT(m_dPageWidth));
m_pPage->SetHeight(MM_2_PT(m_dPageHeight));
return true;
}
return false;

View File

@ -233,6 +233,7 @@ public:
bool CreatePageTree(const std::wstring& sPageTree, const std::pair<int, int>& pPageTree);
std::pair<int, int> GetPageRef(int nPageIndex);
bool EditPage(const std::wstring& sPage, const std::pair<int, int>& pPage);
bool AddPage(int nPageIndex);
bool DeletePage(int nPageIndex);
bool EditClose(const std::wstring& wsPath, const std::wstring& sTrailer);
void PageRotate(int nRotate);

View File

@ -1116,7 +1116,6 @@ namespace PdfWriter
CPage* CDocument::EditPage(const std::wstring& sPage, const std::pair<int, int>& pPage)
{
CXref* pXref = new CXref(this, pPage.first);
// pNewPage Освобождается в деструкторе pXref
CPage* pNewPage = new CPage(pXref, this, sPage);
pNewPage->SetRef(pPage.first, pPage.second);
@ -1131,6 +1130,24 @@ namespace PdfWriter
m_pCurPage = pNewPage;
return pNewPage;
}
CPage* CDocument::AddPage(int nPageIndex)
{
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)
return NULL;
#ifndef FILTER_FLATE_DECODE_DISABLED
if (m_unCompressMode & COMP_TEXT)
pNewPage->SetFilter(STREAM_FILTER_FLATE_DECODE);
#endif
m_pCurPage = pNewPage;
return pNewPage;
}
bool CDocument::DeletePage(int nPageIndex)
{
if (!m_pPageTree)

View File

@ -152,6 +152,7 @@ namespace PdfWriter
bool CreatePageTree(const std::wstring& sPageTree, const std::pair<int, int>& pPageTree);
std::pair<int, int> GetPageRef(int nPageIndex);
CPage* EditPage(const std::wstring& sPage, const std::pair<int, int>& pPage);
CPage* AddPage(int nPageIndex);
bool DeletePage(int nPageIndex);
bool AddToFile(const std::wstring& wsPath, const std::wstring& sTrailer);
private:

View File

@ -225,14 +225,14 @@ namespace PdfWriter
m_pPages->Add(pPage);
(*m_pCount)++;
}
CObjectBase* CPageTree::GetPage(int nPageIndex, int& nI, bool bRemove)
CObjectBase* CPageTree::GetPage(int nPageIndex, int& nI, bool bRemove, bool bInsert, CDictObject* 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);
pRes = ((CPageTree*)pObj)->GetPage(nPageIndex, nI, bRemove, bInsert, pPage);
else
{
if (nPageIndex == nI)
@ -240,6 +240,11 @@ namespace PdfWriter
pRes = pObj;
if (bRemove)
pRes = m_pPages->Remove(i);
if (bInsert)
{
m_pPages->Insert(pObj, pPage);
pPage->Add("Parent", this);
}
}
nI++;
}
@ -247,15 +252,13 @@ namespace PdfWriter
{
if (bRemove)
(*m_pCount)--;
if (bInsert)
(*m_pCount)++;
return pRes;
}
}
return NULL;
}
void CPageTree::Reduce()
{
(*m_pCount)--;
}
bool CPageTree::Join(CPageTree* pPageTree)
{
for (int i = 0, count = m_pPages->GetCount(); i < count; ++i)

View File

@ -63,8 +63,7 @@ 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);
void Reduce();
CObjectBase* GetPage(int nPageIndex, int& nI, bool bRemove = false, bool bInsert = false, CDictObject* pPage = NULL);
bool Join(CPageTree* pPageTree);
EDictType GetDictType() const
{

View File

@ -57,6 +57,14 @@ int main()
pReader->LoadFromFile(sSrcFile, L"", sPassword, sPassword);
bResult = pReader->GetError() == 0;
}
double dPageDpiX, dPageDpiY;
double dWidth, dHeight;
pReader->GetPageInfo(0, &dWidth, &dHeight, &dPageDpiX, &dPageDpiY);
dWidth *= 25.4 / dPageDpiX;
dHeight *= 25.4 / dPageDpiY;
/*
pdfWriter.SetPassword(L"123456");
pdfWriter.NewPage();
@ -81,39 +89,24 @@ int main()
pdfWriter.PageRotate(90);
}
/*
pReader->DeletePage(1);
pReader->DeletePage(1);
pReader->DeletePage(1);
pReader->DeletePage(1);
if (pReader->EditPage(1))
{
TEST2(&pdfWriter);
pdfWriter.PageRotate(90);
TEST(&pdfWriter);
}
if (pdfWriter.NewPage() == S_OK)
if (pReader->AddPage(1))
{
// Новой странице необходимо выставить длину и ширину
double dPageDpiX, dPageDpiY;
double dWidth, dHeight;
pReader->GetPageInfo(0, &dWidth, &dHeight, &dPageDpiX, &dPageDpiY);
dWidth *= 25.4 / dPageDpiX;
dHeight *= 25.4 / dPageDpiY;
pdfWriter.put_Width(dWidth);
pdfWriter.put_Height(dHeight);
TEST(&pdfWriter);
}
*/
pReader->DeletePage(1);
pReader->DeletePage(1);
pReader->DeletePage(1);
pReader->DeletePage(1);
if (pReader->EditPage(1))
{
TEST(&pdfWriter);
}
NSFile::CFileBinary::Copy(sSrcFile, sDstFile);
pReader->EditClose(sDstFile);