OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../public/fpdf_ppo.h" | 7 #include "../../public/fpdf_ppo.h" |
8 #include "../include/fsdk_define.h" | 8 #include "../include/fsdk_define.h" |
9 #include "../include/fpdfxfa/fpdfxfa_doc.h" | 9 #include "../include/fpdfxfa/fpdfxfa_doc.h" |
10 | 10 |
11 class CPDF_PageOrganizer | 11 class CPDF_PageOrganizer |
12 { | 12 { |
13 public: | 13 public: |
14 » CPDF_PageOrganizer(); | 14 CPDF_PageOrganizer(); |
15 » ~CPDF_PageOrganizer(); | 15 ~CPDF_PageOrganizer(); |
16 | 16 |
17 public: | 17 public: |
18 » FX_BOOL»» » » PDFDocInit(CPDF_Document *pDestPDFDoc, C
PDF_Document *pSrcPDFDoc); | 18 FX_BOOL PDFDocInit(CPDF_Document *pDestPDFDoc, CPDF_Document *pS
rcPDFDoc); |
19 » FX_BOOL»» » » ExportPage(CPDF_Document *pSrcPDFDoc, CF
X_WordArray* nPageNum, CPDF_Document *pDestPDFDoc, int nIndex); | 19 FX_BOOL ExportPage(CPDF_Document *pSrcPDFDoc, CFX_WordArray* nPa
geNum, CPDF_Document *pDestPDFDoc, int nIndex); |
20 » CPDF_Object*» » PageDictGetInheritableTag(CPDF_Dictionary *pDict
, CFX_ByteString nSrctag); | 20 CPDF_Object* PageDictGetInheritableTag(CPDF_Dictionary *pDict, CFX_By
teString nSrctag); |
21 » FX_BOOL»» » » UpdateReference(CPDF_Object *pObj, CPDF_
Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr); | 21 FX_BOOL UpdateReference(CPDF_Object *pObj, CPDF_Document *pDoc,
CFX_MapPtrToPtr* pMapPtrToPtr); |
22 » int» » » » » GetNewObjId(CPDF_Document *pDoc,
CFX_MapPtrToPtr* pMapPtrToPtr, CPDF_Reference *pRef); | 22 int GetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPt
rToPtr, CPDF_Reference *pRef); |
23 | 23 |
24 }; | 24 }; |
25 | 25 |
26 | 26 |
27 CPDF_PageOrganizer::CPDF_PageOrganizer() | 27 CPDF_PageOrganizer::CPDF_PageOrganizer() |
28 { | 28 { |
29 | 29 |
30 } | 30 } |
31 | 31 |
32 CPDF_PageOrganizer::~CPDF_PageOrganizer() | 32 CPDF_PageOrganizer::~CPDF_PageOrganizer() |
33 { | 33 { |
34 | 34 |
35 } | 35 } |
36 | 36 |
37 FX_BOOL CPDF_PageOrganizer::PDFDocInit(CPDF_Document *pDestPDFDoc, CPDF_Document
*pSrcPDFDoc) | 37 FX_BOOL CPDF_PageOrganizer::PDFDocInit(CPDF_Document *pDestPDFDoc, CPDF_Document
*pSrcPDFDoc) |
38 { | 38 { |
39 » if(!pDestPDFDoc || !pSrcPDFDoc) | 39 if(!pDestPDFDoc || !pSrcPDFDoc) |
40 » » return false; | 40 return false; |
41 | 41 |
42 » CPDF_Dictionary* pNewRoot = pDestPDFDoc->GetRoot(); | 42 CPDF_Dictionary* pNewRoot = pDestPDFDoc->GetRoot(); |
43 » if(!pNewRoot)» return FALSE; | 43 if(!pNewRoot) return FALSE; |
44 | 44 |
45 » //Set the document information//////////////////////////////////////////
// | 45 //Set the document information//////////////////////////////////////////// |
46 | 46 |
47 » CPDF_Dictionary* DInfoDict = pDestPDFDoc->GetInfo(); | 47 CPDF_Dictionary* DInfoDict = pDestPDFDoc->GetInfo(); |
48 | 48 |
49 » if(!DInfoDict) | 49 if(!DInfoDict) |
50 » » return FALSE; | 50 return FALSE; |
51 | 51 |
52 » CFX_ByteString producerstr; | 52 CFX_ByteString producerstr; |
53 » producerstr.Format("PDFium"); | 53 producerstr.Format("PDFium"); |
54 » DInfoDict->SetAt("Producer", new CPDF_String(producerstr)); | 54 DInfoDict->SetAt("Producer", new CPDF_String(producerstr)); |
55 | 55 |
56 » //Set type//////////////////////////////////////////////////////////////
// | 56 //Set type//////////////////////////////////////////////////////////////// |
57 » CFX_ByteString cbRootType = pNewRoot->GetString("Type",""); | 57 CFX_ByteString cbRootType = pNewRoot->GetString("Type",""); |
58 » if( cbRootType.Equal("") ) | 58 if( cbRootType.Equal("") ) |
59 » { | 59 { |
60 » » pNewRoot->SetAt("Type", new CPDF_Name("Catalog")); | 60 pNewRoot->SetAt("Type", new CPDF_Name("Catalog")); |
61 » } | 61 } |
62 | 62 |
63 » CPDF_Dictionary* pNewPages = (CPDF_Dictionary*)(pNewRoot->GetElement("Pa
ges")? pNewRoot->GetElement("Pages")->GetDirect() : NULL); | 63 CPDF_Dictionary* pNewPages = (CPDF_Dictionary*)(pNewRoot->GetElement("Pages"
)? pNewRoot->GetElement("Pages")->GetDirect() : NULL); |
64 » if(!pNewPages) | 64 if(!pNewPages) |
65 » { | 65 { |
66 » » pNewPages = new CPDF_Dictionary; | 66 pNewPages = new CPDF_Dictionary; |
67 » » FX_DWORD NewPagesON = pDestPDFDoc->AddIndirectObject(pNewPages); | 67 FX_DWORD NewPagesON = pDestPDFDoc->AddIndirectObject(pNewPages); |
68 » » pNewRoot->SetAt("Pages", new CPDF_Reference(pDestPDFDoc, NewPage
sON)); | 68 pNewRoot->SetAt("Pages", new CPDF_Reference(pDestPDFDoc, NewPagesON)); |
69 » } | 69 } |
70 | 70 |
71 » CFX_ByteString cbPageType = pNewPages->GetString("Type",""); | 71 CFX_ByteString cbPageType = pNewPages->GetString("Type",""); |
72 » if(cbPageType.Equal("")) | 72 if(cbPageType.Equal("")) |
73 » { | 73 { |
74 » » pNewPages->SetAt("Type", new CPDF_Name("Pages")); | 74 pNewPages->SetAt("Type", new CPDF_Name("Pages")); |
75 » } | 75 } |
76 | 76 |
77 » CPDF_Array* pKeysArray = pNewPages->GetArray("Kids"); | 77 CPDF_Array* pKeysArray = pNewPages->GetArray("Kids"); |
78 » if(pKeysArray == NULL) | 78 if(pKeysArray == NULL) |
79 » { | 79 { |
80 » » CPDF_Array* pNewKids = new CPDF_Array; | 80 CPDF_Array* pNewKids = new CPDF_Array; |
81 » » FX_DWORD Kidsobjnum = -1; | 81 FX_DWORD Kidsobjnum = -1; |
82 » » Kidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids);//, Kidsob
jnum, Kidsgennum); | 82 Kidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids);//, Kidsobjnum, Ki
dsgennum); |
83 | 83 |
84 » » pNewPages->SetAt("Kids", new CPDF_Reference(pDestPDFDoc, Kidsobj
num));//, Kidsgennum)); | 84 pNewPages->SetAt("Kids", new CPDF_Reference(pDestPDFDoc, Kidsobjnum));//
, Kidsgennum)); |
85 » » pNewPages->SetAt("Count", new CPDF_Number(0)); | 85 pNewPages->SetAt("Count", new CPDF_Number(0)); |
86 » } | 86 } |
87 | 87 |
88 » return true; | 88 return true; |
89 } | 89 } |
90 | 90 |
91 FX_BOOL CPDF_PageOrganizer::ExportPage(CPDF_Document *pSrcPDFDoc, CFX_WordArray*
nPageNum, | 91 FX_BOOL CPDF_PageOrganizer::ExportPage(CPDF_Document *pSrcPDFDoc, CFX_WordArray*
nPageNum, |
92 » » » » » » » » » »
» » CPDF_Document *pDestPDFDoc,int nIndex) | 92 CPDF_Document *pDestPDFDoc,int n
Index) |
93 { | 93 { |
94 » int curpage =nIndex; | 94 int curpage =nIndex; |
95 | 95 |
96 » CFX_MapPtrToPtr* pMapPtrToPtr = new CFX_MapPtrToPtr; | 96 CFX_MapPtrToPtr* pMapPtrToPtr = new CFX_MapPtrToPtr; |
97 » pMapPtrToPtr->InitHashTable(1001); | 97 pMapPtrToPtr->InitHashTable(1001); |
98 | 98 |
99 » for(int i=0; i<nPageNum->GetSize(); i++) | 99 for(int i=0; i<nPageNum->GetSize(); i++) |
100 » { | 100 { |
101 | 101 |
102 » » CPDF_Dictionary* pCurPageDict = pDestPDFDoc->CreateNewPage(curpa
ge); | 102 CPDF_Dictionary* pCurPageDict = pDestPDFDoc->CreateNewPage(curpage); |
103 » » CPDF_Dictionary* pSrcPageDict = pSrcPDFDoc->GetPage(nPageNum->Ge
tAt(i)-1); | 103 CPDF_Dictionary* pSrcPageDict = pSrcPDFDoc->GetPage(nPageNum->GetAt(i)-1
); |
104 » » if(!pSrcPageDict || !pCurPageDict) | 104 if(!pSrcPageDict || !pCurPageDict) |
105 » » { | 105 { |
106 » » » delete pMapPtrToPtr; | 106 delete pMapPtrToPtr; |
107 » » » return FALSE; | 107 return FALSE; |
108 » » } | 108 } |
109 | 109 |
110 » » // Clone the page dictionary/////////// | 110 // Clone the page dictionary/////////// |
111 » » FX_POSITION» SrcPos = pSrcPageDict->GetStartPos(); | 111 FX_POSITION SrcPos = pSrcPageDict->GetStartPos(); |
112 » » while (SrcPos) | 112 while (SrcPos) |
113 » » { | 113 { |
114 » » » CFX_ByteString cbSrcKeyStr; | 114 CFX_ByteString cbSrcKeyStr; |
115 » » » CPDF_Object* pObj = pSrcPageDict->GetNextElement(SrcPos,
cbSrcKeyStr); | 115 CPDF_Object* pObj = pSrcPageDict->GetNextElement(SrcPos, cbSrcKeyStr
); |
116 » » » if(cbSrcKeyStr.Compare(("Type")) && cbSrcKeyStr.Compare(
("Parent"))) | 116 if(cbSrcKeyStr.Compare(("Type")) && cbSrcKeyStr.Compare(("Parent"))) |
117 » » » { | 117 { |
118 » » » » if(pCurPageDict->KeyExist(cbSrcKeyStr)) | 118 if(pCurPageDict->KeyExist(cbSrcKeyStr)) |
119 » » » » » pCurPageDict->RemoveAt(cbSrcKeyStr); | 119 pCurPageDict->RemoveAt(cbSrcKeyStr); |
120 » » » » pCurPageDict->SetAt(cbSrcKeyStr, pObj->Clone()); | 120 pCurPageDict->SetAt(cbSrcKeyStr, pObj->Clone()); |
121 » » » } | 121 } |
122 » » } | 122 } |
123 | 123 |
124 » » //inheritable item/////////////////////// | 124 //inheritable item/////////////////////// |
125 » » CPDF_Object* pInheritable = NULL; | 125 CPDF_Object* pInheritable = NULL; |
126 » » //1» MediaBox //required | 126 //1 MediaBox //required |
127 » » if(!pCurPageDict->KeyExist("MediaBox")) | 127 if(!pCurPageDict->KeyExist("MediaBox")) |
128 » » { | 128 { |
129 | 129 |
130 » » » pInheritable = PageDictGetInheritableTag(pSrcPageDict, "
MediaBox"); | 130 pInheritable = PageDictGetInheritableTag(pSrcPageDict, "MediaBox"); |
131 » » » if(!pInheritable) | 131 if(!pInheritable) |
132 » » » { | 132 { |
133 » » » » //Search the "CropBox" from source page dictiona
ry, if not exists,we take the letter size. | 133 //Search the "CropBox" from source page dictionary, if not exist
s,we take the letter size. |
134 » » » » pInheritable = PageDictGetInheritableTag(pSrcPag
eDict, "CropBox"); | 134 pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox"
); |
135 » » » » if(pInheritable) | 135 if(pInheritable) |
136 » » » » » pCurPageDict->SetAt("MediaBox", pInherit
able->Clone()); | 136 pCurPageDict->SetAt("MediaBox", pInheritable->Clone()); |
137 » » » » else | 137 else |
138 » » » » { | 138 { |
139 » » » » » //Make the default size to be letter siz
e (8.5'x11') | 139 //Make the default size to be letter size (8.5'x11') |
140 » » » » » CPDF_Array* pArray = new CPDF_Array; | 140 CPDF_Array* pArray = new CPDF_Array; |
141 » » » » » pArray->AddNumber(0); | 141 pArray->AddNumber(0); |
142 » » » » » pArray->AddNumber(0); | 142 pArray->AddNumber(0); |
143 » » » » » pArray->AddNumber(612); | 143 pArray->AddNumber(612); |
144 » » » » » pArray->AddNumber(792); | 144 pArray->AddNumber(792); |
145 » » » » » pCurPageDict->SetAt("MediaBox", pArray); | 145 pCurPageDict->SetAt("MediaBox", pArray); |
146 » » » » } | 146 } |
147 » » » } | 147 } |
148 » » » else | 148 else |
149 » » » » pCurPageDict->SetAt("MediaBox", pInheritable->Cl
one()); | 149 pCurPageDict->SetAt("MediaBox", pInheritable->Clone()); |
150 » » } | 150 } |
151 » » //2 Resources //required | 151 //2 Resources //required |
152 » » if(!pCurPageDict->KeyExist("Resources")) | 152 if(!pCurPageDict->KeyExist("Resources")) |
153 » » { | 153 { |
154 » » » pInheritable = PageDictGetInheritableTag(pSrcPageDict, "
Resources"); | 154 pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Resources"); |
155 » » » if(!pInheritable) | 155 if(!pInheritable) |
156 » » » { | 156 { |
157 » » » » delete pMapPtrToPtr; | 157 delete pMapPtrToPtr; |
158 » » » » return FALSE; | 158 return FALSE; |
159 » » » } | 159 } |
160 » » » pCurPageDict->SetAt("Resources", pInheritable->Clone()); | 160 pCurPageDict->SetAt("Resources", pInheritable->Clone()); |
161 » » } | 161 } |
162 » » //3 CropBox //Optional | 162 //3 CropBox //Optional |
163 » » if(!pCurPageDict->KeyExist("CropBox")) | 163 if(!pCurPageDict->KeyExist("CropBox")) |
164 » » { | 164 { |
165 » » » pInheritable = PageDictGetInheritableTag(pSrcPageDict, "
CropBox"); | 165 pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox"); |
166 » » » if(pInheritable) | 166 if(pInheritable) |
167 » » » » pCurPageDict->SetAt("CropBox", pInheritable->Clo
ne()); | 167 pCurPageDict->SetAt("CropBox", pInheritable->Clone()); |
168 » » } | 168 } |
169 » » //4 Rotate //Optional | 169 //4 Rotate //Optional |
170 » » if(!pCurPageDict->KeyExist("Rotate")) | 170 if(!pCurPageDict->KeyExist("Rotate")) |
171 » » { | 171 { |
172 » » » pInheritable = PageDictGetInheritableTag(pSrcPageDict, "
Rotate"); | 172 pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Rotate"); |
173 » » » if(pInheritable) | 173 if(pInheritable) |
174 » » » » pCurPageDict->SetAt("Rotate", pInheritable->Clon
e()); | 174 pCurPageDict->SetAt("Rotate", pInheritable->Clone()); |
175 » » } | 175 } |
176 | 176 |
177 » » ///////////////////////////////////////////// | 177 ///////////////////////////////////////////// |
178 » » //Update the reference | 178 //Update the reference |
179 » » FX_DWORD dwOldPageObj = pSrcPageDict->GetObjNum(); | 179 FX_DWORD dwOldPageObj = pSrcPageDict->GetObjNum(); |
180 » » FX_DWORD dwNewPageObj = pCurPageDict->GetObjNum(); | 180 FX_DWORD dwNewPageObj = pCurPageDict->GetObjNum(); |
181 | 181 |
182 » » pMapPtrToPtr->SetAt((void*)(uintptr_t)dwOldPageObj, (void*)(uint
ptr_t)dwNewPageObj); | 182 pMapPtrToPtr->SetAt((void*)(uintptr_t)dwOldPageObj, (void*)(uintptr_t)dw
NewPageObj); |
183 | 183 |
184 » » UpdateReference(pCurPageDict, pDestPDFDoc, pMapPtrToPtr); | 184 UpdateReference(pCurPageDict, pDestPDFDoc, pMapPtrToPtr); |
185 » » curpage++; | 185 curpage++; |
186 » } | 186 } |
187 | 187 |
188 » delete pMapPtrToPtr; | 188 delete pMapPtrToPtr; |
189 » return TRUE; | 189 return TRUE; |
190 } | 190 } |
191 | 191 |
192 CPDF_Object* CPDF_PageOrganizer::PageDictGetInheritableTag(CPDF_Dictionary *pDic
t, CFX_ByteString nSrctag) | 192 CPDF_Object* CPDF_PageOrganizer::PageDictGetInheritableTag(CPDF_Dictionary *pDic
t, CFX_ByteString nSrctag) |
193 { | 193 { |
194 » if(!pDict || !pDict->KeyExist("Type") || nSrctag.IsEmpty()) | 194 if(!pDict || !pDict->KeyExist("Type") || nSrctag.IsEmpty()) |
195 » » return NULL; | 195 return NULL; |
196 | 196 |
197 » CPDF_Object* pType = pDict->GetElement("Type")->GetDirect(); | 197 CPDF_Object* pType = pDict->GetElement("Type")->GetDirect(); |
198 » if(!pType || pType->GetType() != PDFOBJ_NAME)» return NULL; | 198 if(!pType || pType->GetType() != PDFOBJ_NAME) return NULL; |
199 | 199 |
200 » if(pType->GetString().Compare("Page"))» return NULL; | 200 if(pType->GetString().Compare("Page")) return NULL; |
201 | 201 |
202 » if(!pDict->KeyExist("Parent"))» return NULL; | 202 if(!pDict->KeyExist("Parent")) return NULL; |
203 » CPDF_Object* pParent = pDict->GetElement("Parent")->GetDirect(); | 203 CPDF_Object* pParent = pDict->GetElement("Parent")->GetDirect(); |
204 » if(!pParent || pParent->GetType() != PDFOBJ_DICTIONARY)»return NULL; | 204 if(!pParent || pParent->GetType() != PDFOBJ_DICTIONARY) return NULL; |
205 | 205 |
206 » CPDF_Dictionary* pp = (CPDF_Dictionary*)pParent; | 206 CPDF_Dictionary* pp = (CPDF_Dictionary*)pParent; |
207 | 207 |
208 » if(pDict->KeyExist((const char*)nSrctag)) | 208 if(pDict->KeyExist((const char*)nSrctag)) |
209 » » return pDict->GetElement((const char*)nSrctag); | 209 return pDict->GetElement((const char*)nSrctag); |
210 » while (pp) | 210 while (pp) |
211 » { | 211 { |
212 » » if(pp->KeyExist((const char*)nSrctag)) | 212 if (pp->KeyExist((const char*)nSrctag)) |
213 » » » return pp->GetElement((const char*)nSrctag); | 213 return pp->GetElement((const char*)nSrctag); |
214 » » else if (pp->KeyExist("Parent")) | 214 if (pp->KeyExist("Parent")) |
215 » » { | 215 { |
216 » » » pp = (CPDF_Dictionary*)pp->GetElement("Parent")->GetDire
ct(); | 216 pp = (CPDF_Dictionary*)pp->GetElement("Parent")->GetDirect(); |
217 » » » if (pp->GetType() == PDFOBJ_NULL) break; | 217 if (pp->GetType() == PDFOBJ_NULL) |
218 » » } | 218 break; |
219 » » else break; | 219 } |
220 » } | 220 else |
221 | 221 break; |
222 » return NULL; | 222 } |
| 223 |
| 224 return NULL; |
223 } | 225 } |
224 | 226 |
225 FX_BOOL CPDF_PageOrganizer::UpdateReference(CPDF_Object *pObj, CPDF_Document *pD
oc, | 227 FX_BOOL CPDF_PageOrganizer::UpdateReference(CPDF_Object *pObj, CPDF_Document *pD
oc, |
226 » » » » » » » » » »
CFX_MapPtrToPtr* pMapPtrToPtr) | 228 CFX_MapPtrToPtr* pMapPtrToPtr) |
227 { | 229 { |
228 » switch (pObj->GetType()) | 230 switch (pObj->GetType()) |
229 » { | 231 { |
230 » case PDFOBJ_REFERENCE: | 232 case PDFOBJ_REFERENCE: |
231 » » { | 233 { |
232 » » » CPDF_Reference* pReference = (CPDF_Reference*)pObj; | 234 CPDF_Reference* pReference = (CPDF_Reference*)pObj; |
233 » » » int newobjnum = GetNewObjId(pDoc, pMapPtrToPtr, pReferen
ce); | 235 int newobjnum = GetNewObjId(pDoc, pMapPtrToPtr, pReference); |
234 » » » if (newobjnum == 0) return FALSE; | 236 if (newobjnum == 0) return FALSE; |
235 » » » pReference->SetRef(pDoc, newobjnum);//, 0); | 237 pReference->SetRef(pDoc, newobjnum);//, 0); |
236 » » » break; | 238 break; |
237 » » } | 239 } |
238 » case PDFOBJ_DICTIONARY: | 240 case PDFOBJ_DICTIONARY: |
239 » » { | 241 { |
240 » » » CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj; | 242 CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj; |
241 | 243 |
242 » » » FX_POSITION pos = pDict->GetStartPos(); | 244 FX_POSITION pos = pDict->GetStartPos(); |
243 » » » while(pos) | 245 while(pos) |
244 » » » { | 246 { |
245 » » » » CFX_ByteString key(""); | 247 CFX_ByteString key(""); |
246 » » » » CPDF_Object* pNextObj = pDict->GetNextElement(po
s, key); | 248 CPDF_Object* pNextObj = pDict->GetNextElement(pos, key); |
247 » » » » if (!FXSYS_strcmp(key, "Parent") || !FXSYS_strcm
p(key, "Prev") || !FXSYS_strcmp(key, "First")) | 249 if (!FXSYS_strcmp(key, "Parent") || !FXSYS_strcmp(key, "Prev") |
| !FXSYS_strcmp(key, "First")) |
248 » » » » » continue; | 250 continue; |
249 » » » » if(pNextObj) | 251 if(pNextObj) |
250 » » » » { | 252 { |
251 » » » » » if(!UpdateReference(pNextObj, pDoc, pMap
PtrToPtr)) | 253 if(!UpdateReference(pNextObj, pDoc, pMapPtrToPtr)) |
252 » » » » » » pDict->RemoveAt(key); | 254 pDict->RemoveAt(key); |
253 » » » » } | 255 } |
254 » » » » else | 256 else |
255 » » » » » return FALSE; | 257 return FALSE; |
256 » » » } | 258 } |
257 » » » break; | 259 break; |
258 » » } | 260 } |
259 » case» PDFOBJ_ARRAY: | 261 case PDFOBJ_ARRAY: |
260 » » { | 262 { |
261 » » » CPDF_Array* pArray = (CPDF_Array*)pObj; | 263 CPDF_Array* pArray = (CPDF_Array*)pObj; |
262 » » » FX_DWORD count = pArray->GetCount(); | 264 FX_DWORD count = pArray->GetCount(); |
263 » » » for(FX_DWORD i = 0; i < count; i ++) | 265 for(FX_DWORD i = 0; i < count; i ++) |
264 » » » { | 266 { |
265 » » » » CPDF_Object* pNextObj = pArray->GetElement(i); | 267 CPDF_Object* pNextObj = pArray->GetElement(i); |
266 » » » » if(pNextObj) | 268 if(pNextObj) |
267 » » » » { | 269 { |
268 » » » » » if(!UpdateReference(pNextObj, pDoc, pMap
PtrToPtr)) | 270 if(!UpdateReference(pNextObj, pDoc, pMapPtrToPtr)) |
269 » » » » » » return FALSE; | 271 return FALSE; |
270 » » » » } | 272 } |
271 » » » » else | 273 else |
272 » » » » » return FALSE; | 274 return FALSE; |
273 » » » } | 275 } |
274 » » » break; | 276 break; |
275 » » } | 277 } |
276 » case» PDFOBJ_STREAM: | 278 case PDFOBJ_STREAM: |
277 » » { | 279 { |
278 » » » CPDF_Stream* pStream = (CPDF_Stream*)pObj; | 280 CPDF_Stream* pStream = (CPDF_Stream*)pObj; |
279 » » » CPDF_Dictionary* pDict = pStream->GetDict(); | 281 CPDF_Dictionary* pDict = pStream->GetDict(); |
280 » » » if(pDict) | 282 if(pDict) |
281 » » » { | 283 { |
282 » » » » if(!UpdateReference(pDict, pDoc, pMapPtrToPtr)) | 284 if(!UpdateReference(pDict, pDoc, pMapPtrToPtr)) |
283 » » » » » return FALSE; | 285 return FALSE; |
284 » » » } | 286 } |
285 » » » else | 287 else |
286 » » » » return FALSE; | 288 return FALSE; |
287 » » » break; | 289 break; |
288 » » } | 290 } |
289 » default:» break; | 291 default: break; |
290 » } | 292 } |
291 | 293 |
292 » return TRUE; | 294 return TRUE; |
293 } | 295 } |
294 | 296 |
295 int» CPDF_PageOrganizer::GetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pM
apPtrToPtr, | 297 int CPDF_PageOrganizer::GetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPt
rToPtr, |
296 » » » » » » » » » CPDF_Ref
erence *pRef) | 298 CPDF_Reference *pRef) |
297 { | 299 { |
298 » size_t dwObjnum = 0; | 300 if(!pRef) |
299 » if(!pRef) | 301 return 0; |
300 » » return 0; | 302 |
301 » dwObjnum = pRef->GetRefObjNum(); | 303 size_t dwObjnum = pRef->GetRefObjNum(); |
302 | 304 size_t dwNewObjNum = 0; |
303 » size_t dwNewObjNum = 0; | 305 |
304 | 306 pMapPtrToPtr->Lookup((void*)dwObjnum, (void*&)dwNewObjNum); |
305 » pMapPtrToPtr->Lookup((void*)dwObjnum, (void*&)dwNewObjNum); | 307 if(dwNewObjNum) |
306 » if(dwNewObjNum) | 308 { |
307 » { | 309 return (int)dwNewObjNum; |
308 » » return (int)dwNewObjNum; | 310 } |
309 » } | 311 |
310 » else | 312 CPDF_Object* pDirect = pRef->GetDirect(); |
311 » { | 313 if(!pDirect) |
312 » » CPDF_Object* pDirect = pRef->GetDirect(); | 314 { |
313 » » if(!pDirect) | 315 return 0; |
314 » » { | 316 } |
315 » » » return 0; | 317 |
316 » » } | 318 CPDF_Object* pClone = pDirect->Clone(); |
317 | 319 if(!pClone) |
318 » » CPDF_Object* pClone = pDirect->Clone(); | 320 { |
319 » » if(!pClone) | 321 return 0; |
320 » » { | 322 } |
321 » » » return 0; | 323 |
322 » » } | 324 if(pClone->GetType() == PDFOBJ_DICTIONARY) |
323 | 325 { |
324 » » if(pClone->GetType() == PDFOBJ_DICTIONARY) | 326 CPDF_Dictionary* pDictClone = (CPDF_Dictionary*)pClone; |
325 » » { | 327 if(pDictClone->KeyExist("Type")) |
326 » » » CPDF_Dictionary* pDictClone = (CPDF_Dictionary*)pClone; | 328 { |
327 » » » if(pDictClone->KeyExist("Type")) | 329 CFX_ByteString strType = pDictClone->GetString("Type"); |
328 » » » { | 330 if(!FXSYS_stricmp(strType, "Pages")) |
329 » » » » CFX_ByteString strType = pDictClone->GetString("
Type"); | 331 { |
330 » » » » if(!FXSYS_stricmp(strType, "Pages")) | 332 pDictClone->Release(); |
331 » » » » { | 333 return 4; |
332 » » » » » pDictClone->Release(); | 334 } |
333 » » » » » return 4; | 335 else if(!FXSYS_stricmp(strType, "Page")) |
334 » » » » } | 336 { |
335 » » » » else if(!FXSYS_stricmp(strType, "Page")) | 337 pDictClone->Release(); |
336 » » » » { | 338 return 0; |
337 » » » » » pDictClone->Release(); | 339 } |
338 » » » » » return 0; | 340 } |
339 » » » » } | 341 } |
340 » » » } | 342 |
341 » » } | 343 dwNewObjNum = pDoc->AddIndirectObject(pClone); |
342 » » dwNewObjNum = pDoc->AddIndirectObject(pClone);//, onum, gnum); | 344 pMapPtrToPtr->SetAt((void*)dwObjnum, (void*)dwNewObjNum); |
343 » » pMapPtrToPtr->SetAt((void*)dwObjnum, (void*)dwNewObjNum); | 345 if(!UpdateReference(pClone, pDoc, pMapPtrToPtr)) |
344 | 346 { |
345 » » if(!UpdateReference(pClone, pDoc, pMapPtrToPtr)) | 347 pClone->Release(); |
346 » » { | 348 return 0; |
347 » » » pClone->Release(); | 349 } |
348 » » » return 0; | 350 |
349 » » } | 351 return (int)dwNewObjNum; |
350 » » return (int)dwNewObjNum; | |
351 » } | |
352 » return 0; | |
353 } | 352 } |
354 | 353 |
355 FPDF_BOOL ParserPageRangeString(CFX_ByteString rangstring, CFX_WordArray* pageAr
ray,int nCount) | 354 FPDF_BOOL ParserPageRangeString(CFX_ByteString rangstring, CFX_WordArray* pageAr
ray,int nCount) |
356 { | 355 { |
357 | 356 if(rangstring.GetLength() != 0) |
358 » if(rangstring.GetLength() != 0) | 357 { |
359 » { | 358 rangstring.Remove(' '); |
360 » » rangstring.Remove(' '); | 359 int nLength = rangstring.GetLength(); |
361 » » int nLength = rangstring.GetLength(); | 360 CFX_ByteString cbCompareString("0123456789-,"); |
362 » » CFX_ByteString cbCompareString("0123456789-,"); | 361 for(int i=0; i<nLength; i++) |
363 » » for(int i=0; i<nLength; i++) | 362 { |
364 » » { | 363 if(cbCompareString.Find(rangstring[i]) == -1) |
365 » » » if(cbCompareString.Find(rangstring[i]) == -1) | 364 return FALSE; |
366 » » » » return FALSE; | 365 } |
367 » » } | 366 CFX_ByteString cbMidRange; |
368 » » CFX_ByteString cbMidRange; | 367 int nStringFrom = 0; |
369 » » int nStringFrom = 0; | 368 int nStringTo=0; |
370 » » int nStringTo=0; | 369 while(nStringTo < nLength) |
371 » » while(nStringTo < nLength) | 370 { |
372 » » { | 371 nStringTo = rangstring.Find(',',nStringFrom); |
373 » » » nStringTo = rangstring.Find(',',nStringFrom); | 372 if(nStringTo == -1) |
374 » » » if(nStringTo == -1) | 373 { |
375 » » » { | 374 nStringTo = nLength; |
376 » » » » nStringTo = nLength; | 375 } |
377 » » » } | 376 cbMidRange = rangstring.Mid(nStringFrom,nStringTo-nStringFrom); |
378 » » » cbMidRange = rangstring.Mid(nStringFrom,nStringTo-nStrin
gFrom); | 377 |
379 | 378 int nMid = cbMidRange.Find('-'); |
380 » » » int nMid = cbMidRange.Find('-'); | 379 if(nMid == -1) |
381 » » » if(nMid == -1) | 380 { |
382 » » » { | 381 long lPageNum = atol(cbMidRange); |
383 » » » » long lPageNum = atol(cbMidRange); | 382 if(lPageNum <= 0 || lPageNum > nCount) |
384 » » » » if(lPageNum <= 0 || lPageNum > nCount) | 383 return FALSE; |
385 » » » » » return FALSE; | 384 |
386 » » » » pageArray->Add((FX_WORD)lPageNum); | 385 pageArray->Add((FX_WORD)lPageNum); |
387 » » » } | 386 } |
388 » » » else | 387 else |
389 » » » { | 388 { |
390 » » » » int nStartPageNum = atol(cbMidRange.Mid(0,nMid))
; | 389 int nStartPageNum = atol(cbMidRange.Mid(0,nMid)); |
391 » » » » if (nStartPageNum ==0) | 390 if (nStartPageNum ==0) |
392 » » » » { | 391 return FALSE; |
393 » » » » » return FALSE; | 392 |
394 » » » » } | 393 nMid = nMid+1; |
395 | 394 int nEnd = cbMidRange.GetLength()-nMid; |
396 | 395 if (nEnd ==0) |
397 » » » » nMid = nMid+1; | 396 return FALSE; |
398 » » » » int nEnd = cbMidRange.GetLength()-nMid; | 397 |
399 | 398 int nEndPageNum = atol(cbMidRange.Mid(nMid,nEnd)); |
400 » » » » if(nEnd ==0)return FALSE; | 399 if (nStartPageNum < 0 ||nStartPageNum >nEndPageNum|| nEndPageNum
> nCount) |
401 | 400 return FALSE; |
402 » » » » //» » » » int nEndPageNum
= (nEnd == 0)?nCount:atol(cbMidRange.Mid(nMid,nEnd)); | 401 |
403 » » » » int nEndPageNum = atol(cbMidRange.Mid(nMid,nEnd)
); | 402 for (int nIndex = nStartPageNum; nIndex <= nEndPageNum; ++nIndex
) |
404 | 403 pageArray->Add(nIndex); |
405 » » » » if(nStartPageNum < 0 ||nStartPageNum >nEndPageNu
m|| nEndPageNum > nCount) | 404 } |
406 » » » » { | 405 nStringFrom = nStringTo + 1; |
407 » » » » » return FALSE; | 406 } |
408 » » » » } | 407 } |
409 » » » » else | 408 return TRUE; |
410 » » » » { | |
411 » » » » » for(int nIndex=nStartPageNum; nIndex <=
nEndPageNum; nIndex ++) | |
412 » » » » » » pageArray->Add(nIndex); | |
413 » » » » } | |
414 » » » } | |
415 » » » nStringFrom = nStringTo +1; | |
416 » » } | |
417 » } | |
418 » return TRUE; | |
419 } | 409 } |
420 | 410 |
421 DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc,FPDF_DOCUMEN
T src_doc, | 411 DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc,FPDF_DOCUMEN
T src_doc, |
422 » » » » » » » » » »
» FPDF_BYTESTRING pagerange, int index) | 412 FPDF_BYTESTRING pagerange, int inde
x) |
423 { | 413 { |
424 » if(dest_doc == NULL || src_doc == NULL ) | 414 if(dest_doc == NULL || src_doc == NULL ) |
425 » » return FALSE; | 415 return FALSE; |
426 » CFX_WordArray pageArray; | 416 CFX_WordArray pageArray; |
427 » CPDFXFA_Document* pSrcDoc = (CPDFXFA_Document*)src_doc; | 417 CPDFXFA_Document* pSrcDoc = (CPDFXFA_Document*)src_doc; |
428 » CPDF_Document* pSrcPDFDoc = pSrcDoc->GetPDFDoc(); | 418 CPDF_Document* pSrcPDFDoc = pSrcDoc->GetPDFDoc(); |
429 » int nCount = pSrcPDFDoc->GetPageCount(); | 419 int nCount = pSrcPDFDoc->GetPageCount(); |
430 » if(pagerange) | 420 if(pagerange) |
431 » { | 421 { |
432 » » if(ParserPageRangeString(pagerange,&pageArray,nCount) == FALSE) | 422 if(ParserPageRangeString(pagerange,&pageArray,nCount) == FALSE) |
433 » » » return FALSE; | 423 return FALSE; |
434 » } | 424 } |
435 » else | 425 else |
436 » { | 426 { |
437 » » for(int i=1; i<=nCount; i++) | 427 for(int i=1; i<=nCount; i++) |
438 » » { | 428 { |
439 » » » pageArray.Add(i); | 429 pageArray.Add(i); |
440 » » } | 430 } |
441 » } | 431 } |
442 | 432 |
443 » CPDFXFA_Document* pDestDoc = (CPDFXFA_Document*)dest_doc; | 433 CPDFXFA_Document* pDestDoc = (CPDFXFA_Document*)dest_doc; |
444 » CPDF_Document* pDestPDFDoc = pDestDoc->GetPDFDoc(); | 434 CPDF_Document* pDestPDFDoc = pDestDoc->GetPDFDoc(); |
445 » CPDF_PageOrganizer pageOrg; | 435 CPDF_PageOrganizer pageOrg; |
446 | 436 |
447 » pageOrg.PDFDocInit(pDestPDFDoc,pSrcPDFDoc); | 437 pageOrg.PDFDocInit(pDestPDFDoc,pSrcPDFDoc); |
448 | 438 |
449 » if(pageOrg.ExportPage(pSrcPDFDoc,&pageArray,pDestPDFDoc,index)) | 439 if(pageOrg.ExportPage(pSrcPDFDoc,&pageArray,pDestPDFDoc,index)) |
450 » » return TRUE; | 440 return TRUE; |
451 » return FALSE; | 441 return FALSE; |
452 } | 442 } |
453 | 443 |
454 DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, F
PDF_DOCUMENT src_doc) | 444 DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, F
PDF_DOCUMENT src_doc) |
455 { | 445 { |
456 » if(src_doc == NULL || dest_doc == NULL) | 446 if(src_doc == NULL || dest_doc == NULL) |
457 » » return false; | 447 return false; |
458 » CPDFXFA_Document* pSrcDoc = (CPDFXFA_Document*)src_doc; | 448 CPDFXFA_Document* pSrcDoc = (CPDFXFA_Document*)src_doc; |
459 » CPDF_Document* pSrcPDFDoc = pSrcDoc->GetPDFDoc(); | 449 CPDF_Document* pSrcPDFDoc = pSrcDoc->GetPDFDoc(); |
460 » CPDF_Dictionary* pSrcDict = pSrcPDFDoc->GetRoot(); | 450 CPDF_Dictionary* pSrcDict = pSrcPDFDoc->GetRoot(); |
461 » pSrcDict = pSrcDict->GetDict(FX_BSTRC("ViewerPreferences")); | 451 pSrcDict = pSrcDict->GetDict(FX_BSTRC("ViewerPreferences")); |
462 » if(!pSrcDict) | 452 if(!pSrcDict) |
463 » » return FALSE; | 453 return FALSE; |
464 » CPDFXFA_Document* pDstDoc = (CPDFXFA_Document*)dest_doc; | 454 CPDFXFA_Document* pDstDoc = (CPDFXFA_Document*)dest_doc; |
465 » CPDF_Document* pDstPDFDoc = pDstDoc->GetPDFDoc(); | 455 CPDF_Document* pDstPDFDoc = pDstDoc->GetPDFDoc(); |
466 » CPDF_Dictionary* pDstDict = pDstPDFDoc->GetRoot(); | 456 CPDF_Dictionary* pDstDict = pDstPDFDoc->GetRoot(); |
467 » if(!pDstDict) | 457 if(!pDstDict) |
468 » » return FALSE; | 458 return FALSE; |
469 » pDstDict->SetAt(FX_BSTRC("ViewerPreferences"), pSrcDict->Clone(TRUE)); | 459 pDstDict->SetAt(FX_BSTRC("ViewerPreferences"), pSrcDict->Clone(TRUE)); |
470 » return TRUE; | 460 return TRUE; |
471 } | 461 } |
472 | 462 |
OLD | NEW |