diff --git a/PdfFile/PdfEditor.cpp b/PdfFile/PdfEditor.cpp index faa8f89605..cc06285bf1 100644 --- a/PdfFile/PdfEditor.cpp +++ b/PdfFile/PdfEditor.cpp @@ -969,11 +969,7 @@ void CPdfEditor::SetMode(Mode nMode) PdfWriter::CPageTree* pPageTree = pDoc->GetPageTree(); m_mObjManager.SetDoc(pDoc); int nPages = m_pReader->GetNumPages(); - for (int i = 0; i < nPages; ++i) - { - PdfWriter::CPage* pPage = new PdfWriter::CPage(pDoc); - pPageTree->AddPage(pPage); - } + pPageTree->CreateFakePages(nPages); } } bool CPdfEditor::IncrementalUpdates() @@ -1226,8 +1222,8 @@ void CPdfEditor::Close() int nPages = pPageTree->GetCount(); for (int i = 0; i < nPages; ++i) { - PdfWriter::CPage* pPage = pPageTree->GetPage(i); - if (pPage->IsFakePage()) + PdfWriter::CObjectBase* pObj = pPageTree->GetObj(i); + if (pObj && pObj->GetType() != PdfWriter::object_type_DICT) EditPage(i, false, true); } @@ -1634,14 +1630,11 @@ bool CPdfEditor::EditPage(int _nPageIndex, bool bSet, bool bActualPos) PDFDoc* pPDFDocument = NULL; PdfReader::CPdfFontList* pFontList = NULL; int nStartRefID = 0; - int nPageIndex = m_pReader->GetPageIndex(_nPageIndex, &pPDFDocument, &pFontList, &nStartRefID); - if (nPageIndex < 0 || !pPDFDocument) - return NULL; - PdfWriter::CDocument* pDoc = m_pWriter->GetDocument(); - if (!pPDFDocument || !pDoc) + if (!pDoc) return false; + PdfWriter::CPageTree* pPageTree = pDoc->GetPageTree(); PdfWriter::CPage* pEditPage = NULL; pEditPage = bActualPos ? pDoc->GetPage(_nPageIndex) : pDoc->GetEditPage(_nPageIndex); if (m_nMode == Mode::Split && !pEditPage) @@ -1657,12 +1650,25 @@ bool CPdfEditor::EditPage(int _nPageIndex, bool bSet, bool bActualPos) return true; } + int nOriginIndex = _nPageIndex; if (m_nMode == Mode::WriteNew) { - PdfWriter::CPageTree* pPageTree = pDoc->GetPageTree(); - PdfWriter::CPage* pPage = pPageTree->GetPage(_nPageIndex); + PdfWriter::CObjectBase* pObj = pPageTree->GetObj(_nPageIndex); + PdfWriter::CFakePage* pFakePage = NULL; + if (pObj) + pFakePage = dynamic_cast(pObj); + if (pFakePage) + nOriginIndex = pFakePage->GetOriginIndex(); + } + int nPageIndex = m_pReader->GetPageIndex(nOriginIndex, &pPDFDocument, &pFontList, &nStartRefID); + if (nPageIndex < 0 || !pPDFDocument) + return NULL; + + if (m_nMode == Mode::WriteNew) + { + PdfWriter::CPage* pPage = new PdfWriter::CPage(pDoc); pDoc->AddObject(pPage); - pPage->SetFakePage(false); + pPageTree->ReplacePage(_nPageIndex, pPage); pDoc->AddEditPage(pPage, _nPageIndex); // Получение объекта страницы @@ -1725,6 +1731,12 @@ bool CPdfEditor::EditPage(int _nPageIndex, bool bSet, bool bActualPos) pageObj.dictGetValNF(nIndex, &oTemp); } } + else if (strcmp("Parent", chKey) == 0) + { + // Поля родителей страниц переносятся к самим страницам + oTemp.free(); + continue; + } else if (strcmp("MediaBox", chKey) == 0) { bMediaBox = true; @@ -1808,8 +1820,8 @@ bool CPdfEditor::EditPage(int _nPageIndex, bool bSet, bool bActualPos) if (bSet) { - pDoc->SetCurPage(pEditPage); - m_pWriter->EditPage(pEditPage); + pDoc->SetCurPage(pPage); + m_pWriter->EditPage(pPage); m_nEditPage = _nPageIndex; if (bCropBox) @@ -2158,7 +2170,7 @@ bool CPdfEditor::SplitPages(const int* arrPageIndex, unsigned int unLength, PDFD pageObj.dictGetValNF(nIndex, &oTemp); } } - else if (strcmp("Parent", chKey) == 0) // TODO может ли родитель страницы обладать важными для неё полями + else if (strcmp("Parent", chKey) == 0) { oTemp.free(); continue; @@ -2729,7 +2741,7 @@ bool CPdfEditor::AddPage(int nPageIndex) } bool CPdfEditor::MovePage(int nPageIndex, int nPos) { - if (EditPage(nPageIndex, true, true) || m_nMode == Mode::Split) + if (m_nMode == Mode::Split || m_nMode == Mode::WriteNew || EditPage(nPageIndex, true, true)) return m_pWriter->GetDocument()->MovePage(nPageIndex, nPos); return false; } diff --git a/PdfFile/SrcWriter/Document.cpp b/PdfFile/SrcWriter/Document.cpp index 04a0355cee..185ad221b4 100644 --- a/PdfFile/SrcWriter/Document.cpp +++ b/PdfFile/SrcWriter/Document.cpp @@ -1708,7 +1708,7 @@ namespace PdfWriter { if (pObj->IsIndirect()) return true; - if (pObj && pObj->GetType() == object_type_DICT && ((CDictObject*)pObj)->GetDictType() == dict_type_PAGE && ((CPage*)pObj)->IsFakePage()) + if (!pObj->GetObjId()) { delete pObj; return true; diff --git a/PdfFile/SrcWriter/Pages.cpp b/PdfFile/SrcWriter/Pages.cpp index 9b7b667b01..819608b53d 100644 --- a/PdfFile/SrcWriter/Pages.cpp +++ b/PdfFile/SrcWriter/Pages.cpp @@ -350,11 +350,16 @@ namespace PdfWriter { for (int i = 0; i < nPages; ++i) { - CObjectBase* pTarget = GetObj(nPageIndex); - if (pTarget) - m_pPages->Insert(pTarget, new CObjectBase()); + if (nPageIndex < 0) + m_pPages->Add(new CFakePage(i)); else - m_pPages->Add(new CObjectBase()); + { + CObjectBase* pTarget = GetObj(nPageIndex); + if (pTarget) + m_pPages->Insert(pTarget, new CFakePage(nPageIndex)); + else + m_pPages->Add(new CFakePage(m_pPages->GetCount())); + } (*m_pCount)++; } } @@ -376,7 +381,6 @@ namespace PdfWriter //---------------------------------------------------------------------------------------- CPage::CPage(CDocument* pDocument) { - m_bFakePage = true; Init(pDocument); } void CPage::Fix() @@ -474,7 +478,6 @@ namespace PdfWriter } CPage::CPage(CXref* pXref, CPageTree* pParent, CDocument* pDocument) { - m_bFakePage = false; pXref->Add(this); Init(pDocument); @@ -499,14 +502,6 @@ namespace PdfWriter pGrState = pPrev; } } - void CPage::SetFakePage(bool bFakePage) - { - m_bFakePage = bFakePage; - } - bool CPage::IsFakePage() - { - return m_bFakePage; - } void CPage::Init(CDocument* pDocument) { m_pDocument = pDocument; @@ -1587,6 +1582,14 @@ namespace PdfWriter m_pStream->WriteStr("EMC\012"); } + + CFakePage::CFakePage(int nOriginIndex) : m_nOriginIndex(nOriginIndex) + { + } + int CFakePage::GetOriginIndex() + { + return m_nOriginIndex; + } //---------------------------------------------------------------------------------------- // CTextWord //---------------------------------------------------------------------------------------- diff --git a/PdfFile/SrcWriter/Pages.h b/PdfFile/SrcWriter/Pages.h index 4124d732d1..92e0ef9dfe 100644 --- a/PdfFile/SrcWriter/Pages.h +++ b/PdfFile/SrcWriter/Pages.h @@ -73,7 +73,7 @@ namespace PdfWriter bool ReplacePage(int nPageIndex, CPage* pPage); bool Join(CPageTree* pPageTree); bool Find(CPage* pPage, int& nI); - void CreateFakePages(int nPages, int nPageIndex = 0); + void CreateFakePages(int nPages, int nPageIndex = -1); void ClearFakePages(); unsigned int GetCount() { @@ -100,8 +100,6 @@ namespace PdfWriter ~CPage(); void Fix(); - void SetFakePage(bool bFakePage); - bool IsFakePage(); void SetHeight(double dHeight); void SetWidth(double dWidth); double GetWidth(); @@ -201,7 +199,6 @@ namespace PdfWriter private: - bool m_bFakePage; CDocument* m_pDocument; CPageTree* m_pParent; CPoint m_oStartPos; // Позиция начала текущего пата @@ -219,6 +216,20 @@ namespace PdfWriter CDictObject* m_pPatterns; unsigned int m_unPatternsCount; }; + class CFakePage : public CObjectBase + { + public: + CFakePage(int nOriginIndex); + virtual CObjectBase* Copy(CObjectBase* pOut = NULL) const + { + return pOut ? pOut : new CFakePage(m_nOriginIndex); + } + + int GetOriginIndex(); + + private: + int m_nOriginIndex; + }; //---------------------------------------------------------------------------------------- // CTextWord //----------------------------------------------------------------------------------------