Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: fpdfsdk/src/fpdfppo.cpp

Issue 1239313005: Merge to XFA - else after returns. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: Fix issues. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « fpdfsdk/src/fpdfdoc.cpp ('k') | fpdfsdk/src/fpdfsave.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
OLDNEW
« no previous file with comments | « fpdfsdk/src/fpdfdoc.cpp ('k') | fpdfsdk/src/fpdfsave.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698