| 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 "../../third_party/base/nonstd_unique_ptr.h" | 8 #include "../../third_party/base/nonstd_unique_ptr.h" |
| 9 #include "../include/fsdk_define.h" | 9 #include "../include/fsdk_define.h" |
| 10 | 10 |
| 11 class CPDF_PageOrganizer | 11 class CPDF_PageOrganizer |
| 12 { | 12 { |
| 13 public: | 13 public: |
| 14 using ObjectNumberMap = std::map<FX_DWORD, FX_DWORD>; | 14 using ObjectNumberMap = std::map<FX_DWORD, FX_DWORD>; |
| 15 CPDF_PageOrganizer(); | 15 CPDF_PageOrganizer(); |
| 16 ~CPDF_PageOrganizer(); | 16 ~CPDF_PageOrganizer(); |
| 17 | 17 |
| 18 FX_BOOL PDFDocInit(CPDF_Document* pDestPDFDoc, CPDF_Document* pSrcPDFDoc); | 18 bool PDFDocInit(CPDF_Document* pDestPDFDoc, CPDF_Document* pSrcPDFDoc); |
| 19 FX_BOOL ExportPage(CPDF_Document* pSrcPDFDoc, | 19 bool ExportPage(CPDF_Document* pSrcPDFDoc, |
| 20 CFX_WordArray* nPageNum, | 20 CFX_WordArray* nPageNum, |
| 21 CPDF_Document* pDestPDFDoc, | 21 CPDF_Document* pDestPDFDoc, |
| 22 int nIndex); | 22 int nIndex); |
| 23 CPDF_Object* PageDictGetInheritableTag(CPDF_Dictionary* pDict, | 23 CPDF_Object* PageDictGetInheritableTag(CPDF_Dictionary* pDict, |
| 24 CFX_ByteString nSrctag); | 24 CFX_ByteString nSrctag); |
| 25 FX_BOOL UpdateReference(CPDF_Object* pObj, | 25 bool UpdateReference(CPDF_Object* pObj, |
| 26 CPDF_Document* pDoc, | 26 CPDF_Document* pDoc, |
| 27 ObjectNumberMap* pObjNumberMap); | 27 ObjectNumberMap* pObjNumberMap); |
| 28 FX_DWORD GetNewObjId(CPDF_Document* pDoc, | 28 FX_DWORD GetNewObjId(CPDF_Document* pDoc, |
| 29 ObjectNumberMap* pObjNumberMap, | 29 ObjectNumberMap* pObjNumberMap, |
| 30 CPDF_Reference* pRef); | 30 CPDF_Reference* pRef); |
| 31 }; | 31 }; |
| 32 | 32 |
| 33 | 33 |
| 34 CPDF_PageOrganizer::CPDF_PageOrganizer() | 34 CPDF_PageOrganizer::CPDF_PageOrganizer() |
| 35 { | 35 { |
| 36 } | 36 } |
| 37 | 37 |
| 38 CPDF_PageOrganizer::~CPDF_PageOrganizer() | 38 CPDF_PageOrganizer::~CPDF_PageOrganizer() |
| 39 { | 39 { |
| 40 } | 40 } |
| 41 | 41 |
| 42 FX_BOOL CPDF_PageOrganizer::PDFDocInit(CPDF_Document* pDestPDFDoc, | 42 bool CPDF_PageOrganizer::PDFDocInit(CPDF_Document* pDestPDFDoc, |
| 43 CPDF_Document* pSrcPDFDoc) | 43 CPDF_Document* pSrcPDFDoc) |
| 44 { | 44 { |
| 45 if (!pDestPDFDoc || !pSrcPDFDoc) | 45 if (!pDestPDFDoc || !pSrcPDFDoc) |
| 46 return FALSE; | 46 return false; |
| 47 | 47 |
| 48 CPDF_Dictionary* pNewRoot = pDestPDFDoc->GetRoot(); | 48 CPDF_Dictionary* pNewRoot = pDestPDFDoc->GetRoot(); |
| 49 if (!pNewRoot) | 49 if (!pNewRoot) |
| 50 return FALSE; | 50 return false; |
| 51 | 51 |
| 52 //Set the document information//////////////////////////////////////////// | 52 //Set the document information//////////////////////////////////////////// |
| 53 | 53 |
| 54 CPDF_Dictionary* DInfoDict = pDestPDFDoc->GetInfo(); | 54 CPDF_Dictionary* DInfoDict = pDestPDFDoc->GetInfo(); |
| 55 if (!DInfoDict) | 55 if (!DInfoDict) |
| 56 return FALSE; | 56 return false; |
| 57 | 57 |
| 58 CFX_ByteString producerstr; | 58 CFX_ByteString producerstr; |
| 59 producerstr.Format("PDFium"); | 59 producerstr.Format("PDFium"); |
| 60 DInfoDict->SetAt("Producer", new CPDF_String(producerstr)); | 60 DInfoDict->SetAt("Producer", new CPDF_String(producerstr)); |
| 61 | 61 |
| 62 //Set type//////////////////////////////////////////////////////////////// | 62 //Set type//////////////////////////////////////////////////////////////// |
| 63 CFX_ByteString cbRootType = pNewRoot->GetString("Type", ""); | 63 CFX_ByteString cbRootType = pNewRoot->GetString("Type", ""); |
| 64 if (cbRootType.Equal("") ) { | 64 if (cbRootType.Equal("") ) { |
| 65 pNewRoot->SetAt("Type", new CPDF_Name("Catalog")); | 65 pNewRoot->SetAt("Type", new CPDF_Name("Catalog")); |
| 66 } | 66 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 82 CPDF_Array* pKeysArray = pNewPages->GetArray("Kids"); | 82 CPDF_Array* pKeysArray = pNewPages->GetArray("Kids"); |
| 83 if (!pKeysArray) { | 83 if (!pKeysArray) { |
| 84 CPDF_Array* pNewKids = new CPDF_Array; | 84 CPDF_Array* pNewKids = new CPDF_Array; |
| 85 FX_DWORD Kidsobjnum = -1; | 85 FX_DWORD Kidsobjnum = -1; |
| 86 Kidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids); | 86 Kidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids); |
| 87 | 87 |
| 88 pNewPages->SetAt("Kids", new CPDF_Reference(pDestPDFDoc, Kidsobjnum)); | 88 pNewPages->SetAt("Kids", new CPDF_Reference(pDestPDFDoc, Kidsobjnum)); |
| 89 pNewPages->SetAt("Count", new CPDF_Number(0)); | 89 pNewPages->SetAt("Count", new CPDF_Number(0)); |
| 90 } | 90 } |
| 91 | 91 |
| 92 return TRUE; | 92 return true; |
| 93 } | 93 } |
| 94 | 94 |
| 95 FX_BOOL CPDF_PageOrganizer::ExportPage(CPDF_Document* pSrcPDFDoc, | 95 bool CPDF_PageOrganizer::ExportPage(CPDF_Document* pSrcPDFDoc, |
| 96 CFX_WordArray* nPageNum, | 96 CFX_WordArray* nPageNum, |
| 97 CPDF_Document* pDestPDFDoc, | 97 CPDF_Document* pDestPDFDoc, |
| 98 int nIndex) | 98 int nIndex) |
| 99 { | 99 { |
| 100 int curpage = nIndex; | 100 int curpage = nIndex; |
| 101 | 101 |
| 102 nonstd::unique_ptr<ObjectNumberMap> pObjNumberMap(new ObjectNumberMap); | 102 nonstd::unique_ptr<ObjectNumberMap> pObjNumberMap(new ObjectNumberMap); |
| 103 | 103 |
| 104 for (int i = 0; i < nPageNum->GetSize(); ++i) { | 104 for (int i = 0; i < nPageNum->GetSize(); ++i) { |
| 105 CPDF_Dictionary* pCurPageDict = pDestPDFDoc->CreateNewPage(curpage); | 105 CPDF_Dictionary* pCurPageDict = pDestPDFDoc->CreateNewPage(curpage); |
| 106 CPDF_Dictionary* pSrcPageDict = | 106 CPDF_Dictionary* pSrcPageDict = |
| 107 pSrcPDFDoc->GetPage(nPageNum->GetAt(i) - 1); | 107 pSrcPDFDoc->GetPage(nPageNum->GetAt(i) - 1); |
| 108 if (!pSrcPageDict || !pCurPageDict) | 108 if (!pSrcPageDict || !pCurPageDict) |
| 109 return FALSE; | 109 return false; |
| 110 | 110 |
| 111 // Clone the page dictionary/////////// | 111 // Clone the page dictionary/////////// |
| 112 FX_POSITION SrcPos = pSrcPageDict->GetStartPos(); | 112 FX_POSITION SrcPos = pSrcPageDict->GetStartPos(); |
| 113 while (SrcPos) { | 113 while (SrcPos) { |
| 114 CFX_ByteString cbSrcKeyStr; | 114 CFX_ByteString cbSrcKeyStr; |
| 115 CPDF_Object* pObj = pSrcPageDict->GetNextElement(SrcPos, | 115 CPDF_Object* pObj = pSrcPageDict->GetNextElement(SrcPos, |
| 116 cbSrcKeyStr); | 116 cbSrcKeyStr); |
| 117 if (cbSrcKeyStr.Compare(("Type")) && | 117 if (cbSrcKeyStr.Compare(("Type")) && |
| 118 cbSrcKeyStr.Compare(("Parent"))) { | 118 cbSrcKeyStr.Compare(("Parent"))) { |
| 119 if (pCurPageDict->KeyExist(cbSrcKeyStr)) | 119 if (pCurPageDict->KeyExist(cbSrcKeyStr)) |
| (...skipping 24 matching lines...) Expand all Loading... |
| 144 pCurPageDict->SetAt("MediaBox", pArray); | 144 pCurPageDict->SetAt("MediaBox", pArray); |
| 145 } | 145 } |
| 146 } else { | 146 } else { |
| 147 pCurPageDict->SetAt("MediaBox", pInheritable->Clone()); | 147 pCurPageDict->SetAt("MediaBox", pInheritable->Clone()); |
| 148 } | 148 } |
| 149 } | 149 } |
| 150 //2 Resources //required | 150 //2 Resources //required |
| 151 if (!pCurPageDict->KeyExist("Resources")) { | 151 if (!pCurPageDict->KeyExist("Resources")) { |
| 152 pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Resources"); | 152 pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Resources"); |
| 153 if (!pInheritable) | 153 if (!pInheritable) |
| 154 return FALSE; | 154 return false; |
| 155 pCurPageDict->SetAt("Resources", pInheritable->Clone()); | 155 pCurPageDict->SetAt("Resources", pInheritable->Clone()); |
| 156 } | 156 } |
| 157 //3 CropBox //Optional | 157 //3 CropBox //Optional |
| 158 if (!pCurPageDict->KeyExist("CropBox")) { | 158 if (!pCurPageDict->KeyExist("CropBox")) { |
| 159 pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox"); | 159 pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox"); |
| 160 if (pInheritable) | 160 if (pInheritable) |
| 161 pCurPageDict->SetAt("CropBox", pInheritable->Clone()); | 161 pCurPageDict->SetAt("CropBox", pInheritable->Clone()); |
| 162 } | 162 } |
| 163 //4 Rotate //Optional | 163 //4 Rotate //Optional |
| 164 if (!pCurPageDict->KeyExist("Rotate")) { | 164 if (!pCurPageDict->KeyExist("Rotate")) { |
| 165 pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Rotate"); | 165 pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Rotate"); |
| 166 if (pInheritable) | 166 if (pInheritable) |
| 167 pCurPageDict->SetAt("Rotate", pInheritable->Clone()); | 167 pCurPageDict->SetAt("Rotate", pInheritable->Clone()); |
| 168 } | 168 } |
| 169 | 169 |
| 170 ///////////////////////////////////////////// | 170 ///////////////////////////////////////////// |
| 171 //Update the reference | 171 //Update the reference |
| 172 FX_DWORD dwOldPageObj = pSrcPageDict->GetObjNum(); | 172 FX_DWORD dwOldPageObj = pSrcPageDict->GetObjNum(); |
| 173 FX_DWORD dwNewPageObj = pCurPageDict->GetObjNum(); | 173 FX_DWORD dwNewPageObj = pCurPageDict->GetObjNum(); |
| 174 | 174 |
| 175 (*pObjNumberMap)[dwOldPageObj] = dwNewPageObj; | 175 (*pObjNumberMap)[dwOldPageObj] = dwNewPageObj; |
| 176 | 176 |
| 177 UpdateReference(pCurPageDict, pDestPDFDoc, pObjNumberMap.get()); | 177 UpdateReference(pCurPageDict, pDestPDFDoc, pObjNumberMap.get()); |
| 178 ++curpage; | 178 ++curpage; |
| 179 } | 179 } |
| 180 | 180 |
| 181 return TRUE; | 181 return true; |
| 182 } | 182 } |
| 183 | 183 |
| 184 CPDF_Object* CPDF_PageOrganizer::PageDictGetInheritableTag( | 184 CPDF_Object* CPDF_PageOrganizer::PageDictGetInheritableTag( |
| 185 CPDF_Dictionary* pDict, | 185 CPDF_Dictionary* pDict, |
| 186 CFX_ByteString nSrctag) | 186 CFX_ByteString nSrctag) |
| 187 { | 187 { |
| 188 if (!pDict || nSrctag.IsEmpty()) | 188 if (!pDict || nSrctag.IsEmpty()) |
| 189 return nullptr; | 189 return nullptr; |
| 190 if (!pDict->KeyExist("Parent") || !pDict->KeyExist("Type")) | 190 if (!pDict->KeyExist("Parent") || !pDict->KeyExist("Type")) |
| 191 return nullptr; | 191 return nullptr; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 213 } | 213 } |
| 214 pp = (CPDF_Dictionary*)pp->GetElement("Parent")->GetDirect(); | 214 pp = (CPDF_Dictionary*)pp->GetElement("Parent")->GetDirect(); |
| 215 if (pp->GetType() == PDFOBJ_NULL) { | 215 if (pp->GetType() == PDFOBJ_NULL) { |
| 216 break; | 216 break; |
| 217 } | 217 } |
| 218 } | 218 } |
| 219 | 219 |
| 220 return nullptr; | 220 return nullptr; |
| 221 } | 221 } |
| 222 | 222 |
| 223 FX_BOOL CPDF_PageOrganizer::UpdateReference(CPDF_Object* pObj, | 223 bool CPDF_PageOrganizer::UpdateReference(CPDF_Object* pObj, |
| 224 CPDF_Document* pDoc, | 224 CPDF_Document* pDoc, |
| 225 ObjectNumberMap* pObjNumberMap) | 225 ObjectNumberMap* pObjNumberMap) |
| 226 { | 226 { |
| 227 switch (pObj->GetType()) { | 227 switch (pObj->GetType()) { |
| 228 case PDFOBJ_REFERENCE: { | 228 case PDFOBJ_REFERENCE: { |
| 229 CPDF_Reference* pReference = (CPDF_Reference*)pObj; | 229 CPDF_Reference* pReference = (CPDF_Reference*)pObj; |
| 230 FX_DWORD newobjnum = GetNewObjId(pDoc, pObjNumberMap, pReference); | 230 FX_DWORD newobjnum = GetNewObjId(pDoc, pObjNumberMap, pReference); |
| 231 if (newobjnum == 0) | 231 if (newobjnum == 0) |
| 232 return FALSE; | 232 return false; |
| 233 pReference->SetRef(pDoc, newobjnum); | 233 pReference->SetRef(pDoc, newobjnum); |
| 234 break; | 234 break; |
| 235 } | 235 } |
| 236 case PDFOBJ_DICTIONARY: { | 236 case PDFOBJ_DICTIONARY: { |
| 237 CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj; | 237 CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj; |
| 238 | 238 |
| 239 FX_POSITION pos = pDict->GetStartPos(); | 239 FX_POSITION pos = pDict->GetStartPos(); |
| 240 while (pos) { | 240 while (pos) { |
| 241 CFX_ByteString key(""); | 241 CFX_ByteString key(""); |
| 242 CPDF_Object* pNextObj = pDict->GetNextElement(pos, key); | 242 CPDF_Object* pNextObj = pDict->GetNextElement(pos, key); |
| 243 if (!FXSYS_strcmp(key, "Parent") || | 243 if (!FXSYS_strcmp(key, "Parent") || |
| 244 !FXSYS_strcmp(key, "Prev") || | 244 !FXSYS_strcmp(key, "Prev") || |
| 245 !FXSYS_strcmp(key, "First")) { | 245 !FXSYS_strcmp(key, "First")) { |
| 246 continue; | 246 continue; |
| 247 } | 247 } |
| 248 if (pNextObj) { | 248 if (pNextObj) { |
| 249 if (!UpdateReference(pNextObj, pDoc, pObjNumberMap)) | 249 if (!UpdateReference(pNextObj, pDoc, pObjNumberMap)) |
| 250 pDict->RemoveAt(key); | 250 pDict->RemoveAt(key); |
| 251 } else { | 251 } else { |
| 252 return FALSE; | 252 return false; |
| 253 } | 253 } |
| 254 } | 254 } |
| 255 break; | 255 break; |
| 256 } | 256 } |
| 257 case PDFOBJ_ARRAY: { | 257 case PDFOBJ_ARRAY: { |
| 258 CPDF_Array* pArray = (CPDF_Array*)pObj; | 258 CPDF_Array* pArray = (CPDF_Array*)pObj; |
| 259 FX_DWORD count = pArray->GetCount(); | 259 FX_DWORD count = pArray->GetCount(); |
| 260 for (FX_DWORD i = 0; i < count; ++i) { | 260 for (FX_DWORD i = 0; i < count; ++i) { |
| 261 CPDF_Object* pNextObj = pArray->GetElement(i); | 261 CPDF_Object* pNextObj = pArray->GetElement(i); |
| 262 if (!pNextObj) | 262 if (!pNextObj) |
| 263 return FALSE; | 263 return false; |
| 264 if (!UpdateReference(pNextObj, pDoc, pObjNumberMap)) | 264 if (!UpdateReference(pNextObj, pDoc, pObjNumberMap)) |
| 265 return FALSE; | 265 return false; |
| 266 } | 266 } |
| 267 break; | 267 break; |
| 268 } | 268 } |
| 269 case PDFOBJ_STREAM: { | 269 case PDFOBJ_STREAM: { |
| 270 CPDF_Stream* pStream = (CPDF_Stream*)pObj; | 270 CPDF_Stream* pStream = (CPDF_Stream*)pObj; |
| 271 CPDF_Dictionary* pDict = pStream->GetDict(); | 271 CPDF_Dictionary* pDict = pStream->GetDict(); |
| 272 if (pDict) { | 272 if (pDict) { |
| 273 if (!UpdateReference(pDict, pDoc, pObjNumberMap)) | 273 if (!UpdateReference(pDict, pDoc, pObjNumberMap)) |
| 274 return FALSE; | 274 return false; |
| 275 } else { | 275 } else { |
| 276 return FALSE; | 276 return false; |
| 277 } | 277 } |
| 278 break; | 278 break; |
| 279 } | 279 } |
| 280 default: | 280 default: |
| 281 break; | 281 break; |
| 282 } | 282 } |
| 283 | 283 |
| 284 return TRUE; | 284 return true; |
| 285 } | 285 } |
| 286 | 286 |
| 287 FX_DWORD CPDF_PageOrganizer::GetNewObjId(CPDF_Document* pDoc, | 287 FX_DWORD CPDF_PageOrganizer::GetNewObjId(CPDF_Document* pDoc, |
| 288 ObjectNumberMap* pObjNumberMap, | 288 ObjectNumberMap* pObjNumberMap, |
| 289 CPDF_Reference* pRef) | 289 CPDF_Reference* pRef) |
| 290 { | 290 { |
| 291 if (!pRef) | 291 if (!pRef) |
| 292 return 0; | 292 return 0; |
| 293 | 293 |
| 294 FX_DWORD dwObjnum = pRef->GetRefObjNum(); | 294 FX_DWORD dwObjnum = pRef->GetRefObjNum(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 FPDF_BOOL ParserPageRangeString(CFX_ByteString rangstring, | 334 FPDF_BOOL ParserPageRangeString(CFX_ByteString rangstring, |
| 335 CFX_WordArray* pageArray, | 335 CFX_WordArray* pageArray, |
| 336 int nCount) | 336 int nCount) |
| 337 { | 337 { |
| 338 if (rangstring.GetLength() != 0) { | 338 if (rangstring.GetLength() != 0) { |
| 339 rangstring.Remove(' '); | 339 rangstring.Remove(' '); |
| 340 int nLength = rangstring.GetLength(); | 340 int nLength = rangstring.GetLength(); |
| 341 CFX_ByteString cbCompareString("0123456789-,"); | 341 CFX_ByteString cbCompareString("0123456789-,"); |
| 342 for (int i = 0; i < nLength; ++i) { | 342 for (int i = 0; i < nLength; ++i) { |
| 343 if (cbCompareString.Find(rangstring[i]) == -1) | 343 if (cbCompareString.Find(rangstring[i]) == -1) |
| 344 return FALSE; | 344 return false; |
| 345 } | 345 } |
| 346 CFX_ByteString cbMidRange; | 346 CFX_ByteString cbMidRange; |
| 347 int nStringFrom = 0; | 347 int nStringFrom = 0; |
| 348 int nStringTo = 0; | 348 int nStringTo = 0; |
| 349 while (nStringTo < nLength) { | 349 while (nStringTo < nLength) { |
| 350 nStringTo = rangstring.Find(',', nStringFrom); | 350 nStringTo = rangstring.Find(',', nStringFrom); |
| 351 if (nStringTo == -1) | 351 if (nStringTo == -1) |
| 352 nStringTo = nLength; | 352 nStringTo = nLength; |
| 353 cbMidRange = rangstring.Mid(nStringFrom, nStringTo - nStringFrom); | 353 cbMidRange = rangstring.Mid(nStringFrom, nStringTo - nStringFrom); |
| 354 int nMid = cbMidRange.Find('-'); | 354 int nMid = cbMidRange.Find('-'); |
| 355 if (nMid == -1) { | 355 if (nMid == -1) { |
| 356 long lPageNum = atol(cbMidRange); | 356 long lPageNum = atol(cbMidRange); |
| 357 if (lPageNum <= 0 || lPageNum > nCount) | 357 if (lPageNum <= 0 || lPageNum > nCount) |
| 358 return FALSE; | 358 return false; |
| 359 pageArray->Add((FX_WORD)lPageNum); | 359 pageArray->Add((FX_WORD)lPageNum); |
| 360 } else { | 360 } else { |
| 361 int nStartPageNum = atol(cbMidRange.Mid(0, nMid)); | 361 int nStartPageNum = atol(cbMidRange.Mid(0, nMid)); |
| 362 if (nStartPageNum == 0) | 362 if (nStartPageNum == 0) |
| 363 return FALSE; | 363 return false; |
| 364 | 364 |
| 365 ++nMid; | 365 ++nMid; |
| 366 int nEnd = cbMidRange.GetLength() - nMid; | 366 int nEnd = cbMidRange.GetLength() - nMid; |
| 367 if (nEnd == 0) | 367 if (nEnd == 0) |
| 368 return FALSE; | 368 return false; |
| 369 | 369 |
| 370 int nEndPageNum = atol(cbMidRange.Mid(nMid, nEnd)); | 370 int nEndPageNum = atol(cbMidRange.Mid(nMid, nEnd)); |
| 371 if (nStartPageNum < 0 || | 371 if (nStartPageNum < 0 || |
| 372 nStartPageNum >nEndPageNum || | 372 nStartPageNum >nEndPageNum || |
| 373 nEndPageNum > nCount) { | 373 nEndPageNum > nCount) { |
| 374 return FALSE; | 374 return false; |
| 375 } | 375 } |
| 376 for (int i = nStartPageNum; i <= nEndPageNum; ++i) { | 376 for (int i = nStartPageNum; i <= nEndPageNum; ++i) { |
| 377 pageArray->Add(i); | 377 pageArray->Add(i); |
| 378 } | 378 } |
| 379 } | 379 } |
| 380 nStringFrom = nStringTo + 1; | 380 nStringFrom = nStringTo + 1; |
| 381 } | 381 } |
| 382 } | 382 } |
| 383 return TRUE; | 383 return true; |
| 384 } | 384 } |
| 385 | 385 |
| 386 DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc, | 386 DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc, |
| 387 FPDF_DOCUMENT src_doc, | 387 FPDF_DOCUMENT src_doc, |
| 388 FPDF_BYTESTRING pagerange, | 388 FPDF_BYTESTRING pagerange, |
| 389 int index) | 389 int index) |
| 390 { | 390 { |
| 391 if (!dest_doc || !src_doc) | 391 if (!dest_doc || !src_doc) |
| 392 return FALSE; | 392 return false; |
| 393 | 393 |
| 394 CFX_WordArray pageArray; | 394 CFX_WordArray pageArray; |
| 395 CPDF_Document* pSrcDoc = (CPDF_Document*)src_doc; | 395 CPDF_Document* pSrcDoc = (CPDF_Document*)src_doc; |
| 396 int nCount = pSrcDoc->GetPageCount(); | 396 int nCount = pSrcDoc->GetPageCount(); |
| 397 if (pagerange) { | 397 if (pagerange) { |
| 398 if (!ParserPageRangeString(pagerange,&pageArray,nCount)) | 398 if (!ParserPageRangeString(pagerange,&pageArray,nCount)) |
| 399 return FALSE; | 399 return false; |
| 400 } else { | 400 } else { |
| 401 for (int i = 1; i <= nCount; ++i) { | 401 for (int i = 1; i <= nCount; ++i) { |
| 402 pageArray.Add(i); | 402 pageArray.Add(i); |
| 403 } | 403 } |
| 404 } | 404 } |
| 405 | 405 |
| 406 CPDF_Document* pDestDoc = (CPDF_Document*)dest_doc; | 406 CPDF_Document* pDestDoc = (CPDF_Document*)dest_doc; |
| 407 CPDF_PageOrganizer pageOrg; | 407 CPDF_PageOrganizer pageOrg; |
| 408 | 408 |
| 409 pageOrg.PDFDocInit(pDestDoc, pSrcDoc); | 409 pageOrg.PDFDocInit(pDestDoc, pSrcDoc); |
| 410 | 410 |
| 411 return pageOrg.ExportPage(pSrcDoc,&pageArray,pDestDoc,index); | 411 return pageOrg.ExportPage(pSrcDoc,&pageArray,pDestDoc,index); |
| 412 } | 412 } |
| 413 | 413 |
| 414 DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, | 414 DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, |
| 415 FPDF_DOCUMENT src_doc) | 415 FPDF_DOCUMENT src_doc) |
| 416 { | 416 { |
| 417 if (!src_doc || !dest_doc) | 417 if (!src_doc || !dest_doc) |
| 418 return false; | 418 return false; |
| 419 | 419 |
| 420 CPDF_Document* pSrcDoc = (CPDF_Document*)src_doc; | 420 CPDF_Document* pSrcDoc = (CPDF_Document*)src_doc; |
| 421 CPDF_Dictionary* pSrcDict = pSrcDoc->GetRoot(); | 421 CPDF_Dictionary* pSrcDict = pSrcDoc->GetRoot(); |
| 422 pSrcDict = pSrcDict->GetDict(FX_BSTRC("ViewerPreferences"));; | 422 pSrcDict = pSrcDict->GetDict(FX_BSTRC("ViewerPreferences"));; |
| 423 if (!pSrcDict) | 423 if (!pSrcDict) |
| 424 return FALSE; | 424 return false; |
| 425 | 425 |
| 426 CPDF_Document* pDstDoc = (CPDF_Document*)dest_doc; | 426 CPDF_Document* pDstDoc = (CPDF_Document*)dest_doc; |
| 427 CPDF_Dictionary* pDstDict = pDstDoc->GetRoot(); | 427 CPDF_Dictionary* pDstDict = pDstDoc->GetRoot(); |
| 428 if (!pDstDict) | 428 if (!pDstDict) |
| 429 return FALSE; | 429 return false; |
| 430 pDstDict->SetAt(FX_BSTRC("ViewerPreferences"), pSrcDict->Clone(TRUE)); | 430 pDstDict->SetAt(FX_BSTRC("ViewerPreferences"), pSrcDict->Clone(true)); |
| 431 return TRUE; | 431 return true; |
| 432 } | 432 } |
| OLD | NEW |