1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdf_ppo.h"
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <memory>
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "fpdfsdk/include/fsdk_define.h"
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CPDF_PageOrganizer {
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public:
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  using ObjectNumberMap = std::map<FX_DWORD, FX_DWORD>;
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_PageOrganizer();
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ~CPDF_PageOrganizer();
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL PDFDocInit(CPDF_Document* pDestPDFDoc, CPDF_Document* pSrcPDFDoc);
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL ExportPage(CPDF_Document* pSrcPDFDoc,
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                     CFX_WordArray* nPageNum,
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                     CPDF_Document* pDestPDFDoc,
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                     int nIndex);
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* PageDictGetInheritableTag(CPDF_Dictionary* pDict,
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         CFX_ByteString nSrctag);
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL UpdateReference(CPDF_Object* pObj,
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          CPDF_Document* pDoc,
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          ObjectNumberMap* pObjNumberMap);
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD GetNewObjId(CPDF_Document* pDoc,
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       ObjectNumberMap* pObjNumberMap,
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       CPDF_Reference* pRef);
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_PageOrganizer::CPDF_PageOrganizer() {}
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_PageOrganizer::~CPDF_PageOrganizer() {}
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_PageOrganizer::PDFDocInit(CPDF_Document* pDestPDFDoc,
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       CPDF_Document* pSrcPDFDoc) {
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pDestPDFDoc || !pSrcPDFDoc)
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pNewRoot = pDestPDFDoc->GetRoot();
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pNewRoot)
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  // Set the document information
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* DInfoDict = pDestPDFDoc->GetInfo();
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!DInfoDict)
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString producerstr;
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  producerstr.Format("PDFium");
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  DInfoDict->SetAt("Producer", new CPDF_String(producerstr, FALSE));
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  // Set type
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString cbRootType = pNewRoot->GetString("Type", "");
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (cbRootType.Equal("")) {
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pNewRoot->SetAt("Type", new CPDF_Name("Catalog"));
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pElement = pNewRoot->GetElement("Pages");
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pNewPages =
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pElement ? ToDictionary(pElement->GetDirect()) : nullptr;
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pNewPages) {
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pNewPages = new CPDF_Dictionary;
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD NewPagesON = pDestPDFDoc->AddIndirectObject(pNewPages);
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pNewRoot->SetAt("Pages", new CPDF_Reference(pDestPDFDoc, NewPagesON));
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString cbPageType = pNewPages->GetString("Type", "");
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (cbPageType.Equal("")) {
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pNewPages->SetAt("Type", new CPDF_Name("Pages"));
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pKeysArray = pNewPages->GetArray("Kids");
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pKeysArray) {
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Array* pNewKids = new CPDF_Array;
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD Kidsobjnum = -1;
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    Kidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids);
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pNewPages->SetAt("Kids", new CPDF_Reference(pDestPDFDoc, Kidsobjnum));
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pNewPages->SetAt("Count", new CPDF_Number(0));
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_PageOrganizer::ExportPage(CPDF_Document* pSrcPDFDoc,
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       CFX_WordArray* nPageNum,
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       CPDF_Document* pDestPDFDoc,
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       int nIndex) {
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int curpage = nIndex;
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  std::unique_ptr<ObjectNumberMap> pObjNumberMap(new ObjectNumberMap);
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < nPageNum->GetSize(); ++i) {
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Dictionary* pCurPageDict = pDestPDFDoc->CreateNewPage(curpage);
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Dictionary* pSrcPageDict = pSrcPDFDoc->GetPage(nPageNum->GetAt(i) - 1);
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pSrcPageDict || !pCurPageDict)
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    // Clone the page dictionary
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (const auto& it : *pSrcPageDict) {
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CFX_ByteString& cbSrcKeyStr = it.first;
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pObj = it.second;
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (cbSrcKeyStr.Compare(("Type")) && cbSrcKeyStr.Compare(("Parent"))) {
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pCurPageDict->KeyExist(cbSrcKeyStr))
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCurPageDict->RemoveAt(cbSrcKeyStr);
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pCurPageDict->SetAt(cbSrcKeyStr, pObj->Clone());
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    // inheritable item
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Object* pInheritable = nullptr;
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    // 1 MediaBox  //required
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pCurPageDict->KeyExist("MediaBox")) {
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pInheritable = PageDictGetInheritableTag(pSrcPageDict, "MediaBox");
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!pInheritable) {
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        // Search the "CropBox" from source page dictionary,
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        // if not exists,we take the letter size.
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox");
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pInheritable) {
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCurPageDict->SetAt("MediaBox", pInheritable->Clone());
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          // Make the default size to be letter size (8.5'x11')
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CPDF_Array* pArray = new CPDF_Array;
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pArray->AddNumber(0);
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pArray->AddNumber(0);
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pArray->AddNumber(612);
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pArray->AddNumber(792);
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCurPageDict->SetAt("MediaBox", pArray);
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pCurPageDict->SetAt("MediaBox", pInheritable->Clone());
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    // 2 Resources //required
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pCurPageDict->KeyExist("Resources")) {
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Resources");
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!pInheritable)
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return FALSE;
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pCurPageDict->SetAt("Resources", pInheritable->Clone());
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    // 3 CropBox  //Optional
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pCurPageDict->KeyExist("CropBox")) {
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox");
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pInheritable)
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pCurPageDict->SetAt("CropBox", pInheritable->Clone());
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    // 4 Rotate  //Optional
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pCurPageDict->KeyExist("Rotate")) {
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Rotate");
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pInheritable)
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pCurPageDict->SetAt("Rotate", pInheritable->Clone());
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    // Update the reference
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD dwOldPageObj = pSrcPageDict->GetObjNum();
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD dwNewPageObj = pCurPageDict->GetObjNum();
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    (*pObjNumberMap)[dwOldPageObj] = dwNewPageObj;
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    UpdateReference(pCurPageDict, pDestPDFDoc, pObjNumberMap.get());
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ++curpage;
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_PageOrganizer::PageDictGetInheritableTag(
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Dictionary* pDict,
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_ByteString nSrctag) {
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pDict || nSrctag.IsEmpty())
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pDict->KeyExist("Parent") || !pDict->KeyExist("Type"))
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pType = pDict->GetElement("Type")->GetDirect();
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!ToName(pType))
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pType->GetString().Compare("Page"))
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pp = ToDictionary(pDict->GetElement("Parent")->GetDirect());
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pp)
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pDict->KeyExist((const char*)nSrctag))
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pDict->GetElement((const char*)nSrctag);
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (pp) {
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pp->KeyExist((const char*)nSrctag))
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pp->GetElement((const char*)nSrctag);
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pp->KeyExist("Parent"))
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pp = ToDictionary(pp->GetElement("Parent")->GetDirect());
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return nullptr;
200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_PageOrganizer::UpdateReference(CPDF_Object* pObj,
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            CPDF_Document* pDoc,
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            ObjectNumberMap* pObjNumberMap) {
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (pObj->GetType()) {
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_REFERENCE: {
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Reference* pReference = pObj->AsReference();
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD newobjnum = GetNewObjId(pDoc, pObjNumberMap, pReference);
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (newobjnum == 0)
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return FALSE;
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pReference->SetRef(pDoc, newobjnum);
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_DICTIONARY: {
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Dictionary* pDict = pObj->AsDictionary();
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      auto it = pDict->begin();
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      while (it != pDict->end()) {
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        const CFX_ByteString& key = it->first;
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_Object* pNextObj = it->second;
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ++it;
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!FXSYS_strcmp(key, "Parent") || !FXSYS_strcmp(key, "Prev") ||
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            !FXSYS_strcmp(key, "First")) {
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          continue;
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pNextObj) {
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (!UpdateReference(pNextObj, pDoc, pObjNumberMap))
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pDict->RemoveAt(key);
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_ARRAY: {
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Array* pArray = pObj->AsArray();
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD count = pArray->GetCount();
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (FX_DWORD i = 0; i < count; ++i) {
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_Object* pNextObj = pArray->GetElement(i);
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!pNextObj)
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!UpdateReference(pNextObj, pDoc, pObjNumberMap))
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STREAM: {
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Stream* pStream = pObj->AsStream();
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Dictionary* pDict = pStream->GetDict();
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pDict) {
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!UpdateReference(pDict, pDoc, pObjNumberMap))
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return FALSE;
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_PageOrganizer::GetNewObjId(CPDF_Document* pDoc,
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         ObjectNumberMap* pObjNumberMap,
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         CPDF_Reference* pRef) {
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pRef)
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwObjnum = pRef->GetRefObjNum();
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwNewObjNum = 0;
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const auto it = pObjNumberMap->find(dwObjnum);
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it != pObjNumberMap->end())
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwNewObjNum = it->second;
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwNewObjNum)
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return dwNewObjNum;
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pDirect = pRef->GetDirect();
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pDirect)
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pClone = pDirect->Clone();
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pClone)
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Dictionary* pDictClone = pClone->AsDictionary()) {
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pDictClone->KeyExist("Type")) {
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_ByteString strType = pDictClone->GetString("Type");
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!FXSYS_stricmp(strType, "Pages")) {
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDictClone->Release();
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return 4;
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!FXSYS_stricmp(strType, "Page")) {
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDictClone->Release();
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return 0;
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  dwNewObjNum = pDoc->AddIndirectObject(pClone);
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  (*pObjNumberMap)[dwObjnum] = dwNewObjNum;
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!UpdateReference(pClone, pDoc, pObjNumberMap)) {
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pClone->Release();
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return dwNewObjNum;
306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFPDF_BOOL ParserPageRangeString(CFX_ByteString rangstring,
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                CFX_WordArray* pageArray,
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                int nCount) {
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (rangstring.GetLength() != 0) {
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rangstring.Remove(' ');
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int nLength = rangstring.GetLength();
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_ByteString cbCompareString("0123456789-,");
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int i = 0; i < nLength; ++i) {
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (cbCompareString.Find(rangstring[i]) == -1)
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return FALSE;
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_ByteString cbMidRange;
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int nStringFrom = 0;
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int nStringTo = 0;
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (nStringTo < nLength) {
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      nStringTo = rangstring.Find(',', nStringFrom);
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (nStringTo == -1)
325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        nStringTo = nLength;
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      cbMidRange = rangstring.Mid(nStringFrom, nStringTo - nStringFrom);
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int nMid = cbMidRange.Find('-');
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (nMid == -1) {
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        long lPageNum = atol(cbMidRange);
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (lPageNum <= 0 || lPageNum > nCount)
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pageArray->Add((FX_WORD)lPageNum);
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int nStartPageNum = atol(cbMidRange.Mid(0, nMid));
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (nStartPageNum == 0)
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ++nMid;
339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int nEnd = cbMidRange.GetLength() - nMid;
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (nEnd == 0)
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int nEndPageNum = atol(cbMidRange.Mid(nMid, nEnd));
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (nStartPageNum < 0 || nStartPageNum > nEndPageNum ||
345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            nEndPageNum > nCount) {
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        for (int i = nStartPageNum; i <= nEndPageNum; ++i) {
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pageArray->Add(i);
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      nStringFrom = nStringTo + 1;
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc,
359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                             FPDF_DOCUMENT src_doc,
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                             FPDF_BYTESTRING pagerange,
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                             int index) {
362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Document* pDestDoc = CPDFDocumentFromFPDFDocument(dest_doc);
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!dest_doc)
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Document* pSrcDoc = CPDFDocumentFromFPDFDocument(src_doc);
367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pSrcDoc)
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_WordArray pageArray;
371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nCount = pSrcDoc->GetPageCount();
372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pagerange) {
373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!ParserPageRangeString(pagerange, &pageArray, nCount))
374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int i = 1; i <= nCount; ++i) {
377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pageArray.Add(i);
378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_PageOrganizer pageOrg;
382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pageOrg.PDFDocInit(pDestDoc, pSrcDoc);
383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pageOrg.ExportPage(pSrcDoc, &pageArray, pDestDoc, index);
384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc,
387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                       FPDF_DOCUMENT src_doc) {
388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Document* pDstDoc = CPDFDocumentFromFPDFDocument(dest_doc);
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pDstDoc)
390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Document* pSrcDoc = CPDFDocumentFromFPDFDocument(src_doc);
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pSrcDoc)
394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pSrcDict = pSrcDoc->GetRoot();
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pSrcDict = pSrcDict->GetDict("ViewerPreferences");
398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pSrcDict)
399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pDstDict = pDstDoc->GetRoot();
402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pDstDict)
403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pDstDict->SetAt("ViewerPreferences", pSrcDict->Clone(TRUE));
406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
408