| 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 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 bool CopyInheritable(CPDF_Dictionary* pCurPageDict, | 57 bool CopyInheritable(CPDF_Dictionary* pCurPageDict, |
| 58 CPDF_Dictionary* pSrcPageDict, | 58 CPDF_Dictionary* pSrcPageDict, |
| 59 const CFX_ByteString& key) { | 59 const CFX_ByteString& key) { |
| 60 if (pCurPageDict->KeyExist(key)) | 60 if (pCurPageDict->KeyExist(key)) |
| 61 return true; | 61 return true; |
| 62 | 62 |
| 63 CPDF_Object* pInheritable = PageDictGetInheritableTag(pSrcPageDict, key); | 63 CPDF_Object* pInheritable = PageDictGetInheritableTag(pSrcPageDict, key); |
| 64 if (!pInheritable) | 64 if (!pInheritable) |
| 65 return false; | 65 return false; |
| 66 | 66 |
| 67 pCurPageDict->SetFor(key, pInheritable->Clone().release()); | 67 pCurPageDict->SetFor(key, pInheritable->Clone()); |
| 68 return true; | 68 return true; |
| 69 } | 69 } |
| 70 | 70 |
| 71 bool ParserPageRangeString(CFX_ByteString rangstring, | 71 bool ParserPageRangeString(CFX_ByteString rangstring, |
| 72 std::vector<uint16_t>* pageArray, | 72 std::vector<uint16_t>* pageArray, |
| 73 int nCount) { | 73 int nCount) { |
| 74 if (rangstring.IsEmpty()) | 74 if (rangstring.IsEmpty()) |
| 75 return true; | 75 return true; |
| 76 | 76 |
| 77 rangstring.Remove(' '); | 77 rangstring.Remove(' '); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 ASSERT(m_pSrcPDFDoc); | 151 ASSERT(m_pSrcPDFDoc); |
| 152 | 152 |
| 153 CPDF_Dictionary* pNewRoot = m_pDestPDFDoc->GetRoot(); | 153 CPDF_Dictionary* pNewRoot = m_pDestPDFDoc->GetRoot(); |
| 154 if (!pNewRoot) | 154 if (!pNewRoot) |
| 155 return false; | 155 return false; |
| 156 | 156 |
| 157 CPDF_Dictionary* pDocInfoDict = m_pDestPDFDoc->GetInfo(); | 157 CPDF_Dictionary* pDocInfoDict = m_pDestPDFDoc->GetInfo(); |
| 158 if (!pDocInfoDict) | 158 if (!pDocInfoDict) |
| 159 return false; | 159 return false; |
| 160 | 160 |
| 161 CFX_ByteString producerstr; | 161 pDocInfoDict->SetNewFor<CPDF_String>("Producer", "PDFium", false); |
| 162 producerstr.Format("PDFium"); | |
| 163 pDocInfoDict->SetFor("Producer", | |
| 164 new CPDF_String(nullptr, producerstr, false)); | |
| 165 | 162 |
| 166 CFX_ByteString cbRootType = pNewRoot->GetStringFor("Type", ""); | 163 CFX_ByteString cbRootType = pNewRoot->GetStringFor("Type", ""); |
| 167 if (cbRootType.IsEmpty()) | 164 if (cbRootType.IsEmpty()) |
| 168 pNewRoot->SetFor("Type", new CPDF_Name(nullptr, "Catalog")); | 165 pNewRoot->SetNewFor<CPDF_Name>("Type", "Catalog"); |
| 169 | 166 |
| 170 CPDF_Object* pElement = pNewRoot->GetObjectFor("Pages"); | 167 CPDF_Object* pElement = pNewRoot->GetObjectFor("Pages"); |
| 171 CPDF_Dictionary* pNewPages = | 168 CPDF_Dictionary* pNewPages = |
| 172 pElement ? ToDictionary(pElement->GetDirect()) : nullptr; | 169 pElement ? ToDictionary(pElement->GetDirect()) : nullptr; |
| 173 if (!pNewPages) { | 170 if (!pNewPages) { |
| 174 pNewPages = m_pDestPDFDoc->NewIndirect<CPDF_Dictionary>(); | 171 pNewPages = m_pDestPDFDoc->NewIndirect<CPDF_Dictionary>(); |
| 175 pNewRoot->SetReferenceFor("Pages", m_pDestPDFDoc, pNewPages); | 172 pNewRoot->SetNewFor<CPDF_Reference>("Pages", m_pDestPDFDoc, |
| 173 pNewPages->GetObjNum()); |
| 176 } | 174 } |
| 177 | 175 |
| 178 CFX_ByteString cbPageType = pNewPages->GetStringFor("Type", ""); | 176 CFX_ByteString cbPageType = pNewPages->GetStringFor("Type", ""); |
| 179 if (cbPageType.IsEmpty()) | 177 if (cbPageType.IsEmpty()) |
| 180 pNewPages->SetFor("Type", new CPDF_Name(nullptr, "Pages")); | 178 pNewPages->SetNewFor<CPDF_Name>("Type", "Pages"); |
| 181 | 179 |
| 182 if (!pNewPages->GetArrayFor("Kids")) { | 180 if (!pNewPages->GetArrayFor("Kids")) { |
| 183 pNewPages->SetIntegerFor("Count", 0); | 181 pNewPages->SetNewFor<CPDF_Number>("Count", 0); |
| 184 pNewPages->SetReferenceFor("Kids", m_pDestPDFDoc, | 182 pNewPages->SetNewFor<CPDF_Reference>( |
| 185 m_pDestPDFDoc->NewIndirect<CPDF_Array>()); | 183 "Kids", m_pDestPDFDoc, |
| 184 m_pDestPDFDoc->NewIndirect<CPDF_Array>()->GetObjNum()); |
| 186 } | 185 } |
| 187 | 186 |
| 188 return true; | 187 return true; |
| 189 } | 188 } |
| 190 | 189 |
| 191 bool CPDF_PageOrganizer::ExportPage(const std::vector<uint16_t>& pageNums, | 190 bool CPDF_PageOrganizer::ExportPage(const std::vector<uint16_t>& pageNums, |
| 192 int nIndex) { | 191 int nIndex) { |
| 193 int curpage = nIndex; | 192 int curpage = nIndex; |
| 194 auto pObjNumberMap = pdfium::MakeUnique<ObjectNumberMap>(); | 193 auto pObjNumberMap = pdfium::MakeUnique<ObjectNumberMap>(); |
| 195 int nSize = pdfium::CollectionSize<int>(pageNums); | 194 int nSize = pdfium::CollectionSize<int>(pageNums); |
| 196 for (int i = 0; i < nSize; ++i) { | 195 for (int i = 0; i < nSize; ++i) { |
| 197 CPDF_Dictionary* pCurPageDict = m_pDestPDFDoc->CreateNewPage(curpage); | 196 CPDF_Dictionary* pCurPageDict = m_pDestPDFDoc->CreateNewPage(curpage); |
| 198 CPDF_Dictionary* pSrcPageDict = m_pSrcPDFDoc->GetPage(pageNums[i] - 1); | 197 CPDF_Dictionary* pSrcPageDict = m_pSrcPDFDoc->GetPage(pageNums[i] - 1); |
| 199 if (!pSrcPageDict || !pCurPageDict) | 198 if (!pSrcPageDict || !pCurPageDict) |
| 200 return false; | 199 return false; |
| 201 | 200 |
| 202 // Clone the page dictionary | 201 // Clone the page dictionary |
| 203 for (const auto& it : *pSrcPageDict) { | 202 for (const auto& it : *pSrcPageDict) { |
| 204 const CFX_ByteString& cbSrcKeyStr = it.first; | 203 const CFX_ByteString& cbSrcKeyStr = it.first; |
| 205 CPDF_Object* pObj = it.second; | |
| 206 if (cbSrcKeyStr == "Type" || cbSrcKeyStr == "Parent") | 204 if (cbSrcKeyStr == "Type" || cbSrcKeyStr == "Parent") |
| 207 continue; | 205 continue; |
| 208 | 206 |
| 209 pCurPageDict->SetFor(cbSrcKeyStr, pObj->Clone().release()); | 207 CPDF_Object* pObj = it.second.get(); |
| 208 pCurPageDict->SetFor(cbSrcKeyStr, pObj->Clone()); |
| 210 } | 209 } |
| 211 | 210 |
| 212 // inheritable item | 211 // inheritable item |
| 213 // 1 MediaBox - required | 212 // 1 MediaBox - required |
| 214 if (!CopyInheritable(pCurPageDict, pSrcPageDict, "MediaBox")) { | 213 if (!CopyInheritable(pCurPageDict, pSrcPageDict, "MediaBox")) { |
| 215 // Search for "CropBox" in the source page dictionary, | 214 // Search for "CropBox" in the source page dictionary, |
| 216 // if it does not exists, use the default letter size. | 215 // if it does not exists, use the default letter size. |
| 217 CPDF_Object* pInheritable = | 216 CPDF_Object* pInheritable = |
| 218 PageDictGetInheritableTag(pSrcPageDict, "CropBox"); | 217 PageDictGetInheritableTag(pSrcPageDict, "CropBox"); |
| 219 if (pInheritable) { | 218 if (pInheritable) { |
| 220 pCurPageDict->SetFor("MediaBox", pInheritable->Clone().release()); | 219 pCurPageDict->SetFor("MediaBox", pInheritable->Clone()); |
| 221 } else { | 220 } else { |
| 222 // Make the default size to be letter size (8.5'x11') | 221 // Make the default size to be letter size (8.5'x11') |
| 223 CPDF_Array* pArray = new CPDF_Array; | 222 CPDF_Array* pArray = pCurPageDict->SetNewFor<CPDF_Array>("MediaBox"); |
| 224 pArray->AddNew<CPDF_Number>(0); | 223 pArray->AddNew<CPDF_Number>(0); |
| 225 pArray->AddNew<CPDF_Number>(0); | 224 pArray->AddNew<CPDF_Number>(0); |
| 226 pArray->AddNew<CPDF_Number>(612); | 225 pArray->AddNew<CPDF_Number>(612); |
| 227 pArray->AddNew<CPDF_Number>(792); | 226 pArray->AddNew<CPDF_Number>(792); |
| 228 pCurPageDict->SetFor("MediaBox", pArray); | |
| 229 } | 227 } |
| 230 } | 228 } |
| 231 | 229 |
| 232 // 2 Resources - required | 230 // 2 Resources - required |
| 233 if (!CopyInheritable(pCurPageDict, pSrcPageDict, "Resources")) | 231 if (!CopyInheritable(pCurPageDict, pSrcPageDict, "Resources")) |
| 234 return false; | 232 return false; |
| 235 | 233 |
| 236 // 3 CropBox - optional | 234 // 3 CropBox - optional |
| 237 CopyInheritable(pCurPageDict, pSrcPageDict, "CropBox"); | 235 CopyInheritable(pCurPageDict, pSrcPageDict, "CropBox"); |
| 238 // 4 Rotate - optional | 236 // 4 Rotate - optional |
| (...skipping 19 matching lines...) Expand all Loading... |
| 258 if (newobjnum == 0) | 256 if (newobjnum == 0) |
| 259 return false; | 257 return false; |
| 260 pReference->SetRef(m_pDestPDFDoc, newobjnum); | 258 pReference->SetRef(m_pDestPDFDoc, newobjnum); |
| 261 break; | 259 break; |
| 262 } | 260 } |
| 263 case CPDF_Object::DICTIONARY: { | 261 case CPDF_Object::DICTIONARY: { |
| 264 CPDF_Dictionary* pDict = pObj->AsDictionary(); | 262 CPDF_Dictionary* pDict = pObj->AsDictionary(); |
| 265 auto it = pDict->begin(); | 263 auto it = pDict->begin(); |
| 266 while (it != pDict->end()) { | 264 while (it != pDict->end()) { |
| 267 const CFX_ByteString& key = it->first; | 265 const CFX_ByteString& key = it->first; |
| 268 CPDF_Object* pNextObj = it->second; | 266 CPDF_Object* pNextObj = it->second.get(); |
| 269 ++it; | 267 ++it; |
| 270 if (key == "Parent" || key == "Prev" || key == "First") | 268 if (key == "Parent" || key == "Prev" || key == "First") |
| 271 continue; | 269 continue; |
| 272 if (!pNextObj) | 270 if (!pNextObj) |
| 273 return false; | 271 return false; |
| 274 if (!UpdateReference(pNextObj, pObjNumberMap)) | 272 if (!UpdateReference(pNextObj, pObjNumberMap)) |
| 275 pDict->RemoveFor(key); | 273 pDict->RemoveFor(key); |
| 276 } | 274 } |
| 277 break; | 275 break; |
| 278 } | 276 } |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 | 377 |
| 380 CPDF_Dictionary* pSrcDict = pSrcDoc->GetRoot(); | 378 CPDF_Dictionary* pSrcDict = pSrcDoc->GetRoot(); |
| 381 pSrcDict = pSrcDict->GetDictFor("ViewerPreferences"); | 379 pSrcDict = pSrcDict->GetDictFor("ViewerPreferences"); |
| 382 if (!pSrcDict) | 380 if (!pSrcDict) |
| 383 return false; | 381 return false; |
| 384 | 382 |
| 385 CPDF_Dictionary* pDstDict = pDstDoc->GetRoot(); | 383 CPDF_Dictionary* pDstDict = pDstDoc->GetRoot(); |
| 386 if (!pDstDict) | 384 if (!pDstDict) |
| 387 return false; | 385 return false; |
| 388 | 386 |
| 389 pDstDict->SetFor("ViewerPreferences", | 387 pDstDict->SetFor("ViewerPreferences", pSrcDict->CloneDirectObject()); |
| 390 pSrcDict->CloneDirectObject().release()); | |
| 391 return true; | 388 return true; |
| 392 } | 389 } |
| OLD | NEW |