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 "../include/fsdk_define.h" | 7 #include "../include/fsdk_define.h" |
8 #include "../include/fpdf_flatten.h" | 8 #include "../include/fpdf_flatten.h" |
9 | 9 |
10 typedef CFX_ArrayTemplate<CPDF_Dictionary*> CPDF_ObjectArray; | 10 typedef CFX_ArrayTemplate<CPDF_Dictionary*> CPDF_ObjectArray; |
(...skipping 22 matching lines...) Expand all Loading... |
33 rect.bottom - rcPage.bottom < -10.000001f) | 33 rect.bottom - rcPage.bottom < -10.000001f) |
34 return FALSE; | 34 return FALSE; |
35 } | 35 } |
36 | 36 |
37 return TRUE; | 37 return TRUE; |
38 } | 38 } |
39 | 39 |
40 | 40 |
41 FX_BOOL GetContentsRect( CPDF_Document * pDoc, CPDF_Dictionary* pDict, CPDF_Rect
Array * pRectArray ) | 41 FX_BOOL GetContentsRect( CPDF_Document * pDoc, CPDF_Dictionary* pDict, CPDF_Rect
Array * pRectArray ) |
42 { | 42 { |
43 » CPDF_Page* pPDFPage = FX_NEW CPDF_Page; | 43 » CPDF_Page* pPDFPage = new CPDF_Page; |
44 pPDFPage->Load( pDoc, pDict, FALSE ); | 44 pPDFPage->Load( pDoc, pDict, FALSE ); |
45 pPDFPage->ParseContent(); | 45 pPDFPage->ParseContent(); |
46 | 46 |
47 FX_POSITION pos = pPDFPage->GetFirstObjectPosition(); | 47 FX_POSITION pos = pPDFPage->GetFirstObjectPosition(); |
48 | 48 |
49 while (pos) | 49 while (pos) |
50 { | 50 { |
51 CPDF_PageObject* pPageObject = pPDFPage->GetNextObject(pos); | 51 CPDF_PageObject* pPageObject = pPDFPage->GetNextObject(pos); |
52 if (!pPageObject)continue; | 52 if (!pPageObject)continue; |
53 | 53 |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 if (!pContentsObj) | 208 if (!pContentsObj) |
209 { | 209 { |
210 pContentsObj = pPage->GetArray("Contents"); | 210 pContentsObj = pPage->GetArray("Contents"); |
211 } | 211 } |
212 | 212 |
213 if (!pContentsObj) | 213 if (!pContentsObj) |
214 { | 214 { |
215 //Create a new contents dictionary | 215 //Create a new contents dictionary |
216 if (!key.IsEmpty()) | 216 if (!key.IsEmpty()) |
217 { | 217 { |
218 » » » CPDF_Stream* pNewContents = FX_NEW CPDF_Stream(NULL, 0,
FX_NEW CPDF_Dictionary); | 218 » » » CPDF_Stream* pNewContents = new CPDF_Stream(NULL, 0, FX_
NEW CPDF_Dictionary); |
219 » » » if (!pNewContents)return; | |
220 pPage->SetAtReference("Contents", pDocument, pDocument->
AddIndirectObject(pNewContents)); | 219 pPage->SetAtReference("Contents", pDocument, pDocument->
AddIndirectObject(pNewContents)); |
221 » » » | 220 |
222 CFX_ByteString sStream; | 221 CFX_ByteString sStream; |
223 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str())
; | 222 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str())
; |
224 pNewContents->SetData((FX_LPCBYTE)sStream, sStream.GetLe
ngth(), FALSE, FALSE); | 223 pNewContents->SetData((FX_LPCBYTE)sStream, sStream.GetLe
ngth(), FALSE, FALSE); |
225 } | 224 } |
226 return; | 225 return; |
227 } | 226 } |
228 | 227 |
229 int iType = pContentsObj->GetType(); | 228 int iType = pContentsObj->GetType(); |
230 CPDF_Array* pContentsArray = NULL; | 229 CPDF_Array* pContentsArray = NULL; |
231 | 230 |
232 switch(iType) | 231 switch(iType) |
233 { | 232 { |
234 case PDFOBJ_STREAM: | 233 case PDFOBJ_STREAM: |
235 { | 234 { |
236 » » » pContentsArray = FX_NEW CPDF_Array; | 235 » » » pContentsArray = new CPDF_Array; |
237 CPDF_Stream* pContents = (CPDF_Stream*)pContentsObj; | 236 CPDF_Stream* pContents = (CPDF_Stream*)pContentsObj; |
238 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pConten
ts); | 237 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pConten
ts); |
239 CPDF_StreamAcc acc; | 238 CPDF_StreamAcc acc; |
240 acc.LoadAllData(pContents); | 239 acc.LoadAllData(pContents); |
241 CFX_ByteString sStream = "q\n"; | 240 CFX_ByteString sStream = "q\n"; |
242 CFX_ByteString sBody = CFX_ByteString((FX_LPCSTR)acc.Get
Data(), acc.GetSize()); | 241 CFX_ByteString sBody = CFX_ByteString((FX_LPCSTR)acc.Get
Data(), acc.GetSize()); |
243 sStream = sStream + sBody + "\nQ"; | 242 sStream = sStream + sBody + "\nQ"; |
244 pContents->SetData((FX_LPCBYTE)sStream, sStream.GetLengt
h(), FALSE, FALSE); | 243 pContents->SetData((FX_LPCBYTE)sStream, sStream.GetLengt
h(), FALSE, FALSE); |
245 pContentsArray->AddReference(pDocument, dwObjNum); | 244 pContentsArray->AddReference(pDocument, dwObjNum); |
246 break; | 245 break; |
247 } | 246 } |
248 | 247 |
249 case PDFOBJ_ARRAY: | 248 case PDFOBJ_ARRAY: |
250 { | 249 { |
251 pContentsArray = (CPDF_Array*)pContentsObj; | 250 pContentsArray = (CPDF_Array*)pContentsObj; |
252 break; | 251 break; |
253 } | 252 } |
254 default: | 253 default: |
255 break; | 254 break; |
256 } | 255 } |
257 | 256 |
258 if (!pContentsArray)return; | 257 if (!pContentsArray)return; |
259 | 258 |
260 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pContentsArray); | 259 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pContentsArray); |
261 pPage->SetAtReference("Contents", pDocument, dwObjNum); | 260 pPage->SetAtReference("Contents", pDocument, dwObjNum); |
262 | 261 |
263 if (!key.IsEmpty()) | 262 if (!key.IsEmpty()) |
264 { | 263 { |
265 » » CPDF_Stream* pNewContents = FX_NEW CPDF_Stream(NULL, 0, FX_NEW C
PDF_Dictionary); | 264 » » CPDF_Stream* pNewContents = new CPDF_Stream(NULL, 0, FX_NEW CPDF
_Dictionary); |
266 dwObjNum = pDocument->AddIndirectObject(pNewContents); | 265 dwObjNum = pDocument->AddIndirectObject(pNewContents); |
267 pContentsArray->AddReference(pDocument, dwObjNum); | 266 pContentsArray->AddReference(pDocument, dwObjNum); |
268 | 267 |
269 CFX_ByteString sStream; | 268 CFX_ByteString sStream; |
270 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); | 269 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); |
271 pNewContents->SetData((FX_LPCBYTE)sStream, sStream.GetLength(),
FALSE, FALSE); | 270 pNewContents->SetData((FX_LPCBYTE)sStream, sStream.GetLength(),
FALSE, FALSE); |
272 } | 271 } |
273 } | 272 } |
274 | 273 |
275 CFX_AffineMatrix GetMatrix(CPDF_Rect rcAnnot, CPDF_Rect rcStream, CFX_AffineMatr
ix matrix) | 274 CFX_AffineMatrix GetMatrix(CPDF_Rect rcAnnot, CPDF_Rect rcStream, CFX_AffineMatr
ix matrix) |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 rcMerger.top = rcMerger.top > rcOriginalMB.top? rcOriginalMB.top : rcMer
ger.top; | 370 rcMerger.top = rcMerger.top > rcOriginalMB.top? rcOriginalMB.top : rcMer
ger.top; |
372 rcMerger.bottom = rcMerger.bottom < rcOriginalMB.bottom? rcOriginalMB.bo
ttom : rcMerger.bottom; | 371 rcMerger.bottom = rcMerger.bottom < rcOriginalMB.bottom? rcOriginalMB.bo
ttom : rcMerger.bottom; |
373 | 372 |
374 if (pPageDict->KeyExist("ArtBox")) | 373 if (pPageDict->KeyExist("ArtBox")) |
375 rcOriginalCB = pPageDict->GetRect("ArtBox"); | 374 rcOriginalCB = pPageDict->GetRect("ArtBox"); |
376 else | 375 else |
377 rcOriginalCB = rcOriginalMB; | 376 rcOriginalCB = rcOriginalMB; |
378 | 377 |
379 if (!rcOriginalMB.IsEmpty()) | 378 if (!rcOriginalMB.IsEmpty()) |
380 { | 379 { |
381 » » CPDF_Array* pMediaBox = FX_NEW CPDF_Array();» | 380 » » CPDF_Array* pMediaBox = new CPDF_Array(); |
382 | 381 » » pMediaBox->Add(new CPDF_Number(rcOriginalMB.left)); |
383 » » pMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.left)); | 382 » » pMediaBox->Add(new CPDF_Number(rcOriginalMB.bottom)); |
384 » » pMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.bottom)); | 383 » » pMediaBox->Add(new CPDF_Number(rcOriginalMB.right)); |
385 » » pMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.right)); | 384 » » pMediaBox->Add(new CPDF_Number(rcOriginalMB.top)); |
386 » » pMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.top)); | |
387 | |
388 pPageDict->SetAt("MediaBox",pMediaBox); | 385 pPageDict->SetAt("MediaBox",pMediaBox); |
389 } | 386 } |
390 » | 387 |
391 if (!rcOriginalCB.IsEmpty()) | 388 if (!rcOriginalCB.IsEmpty()) |
392 { | 389 { |
393 » » CPDF_Array* pCropBox = FX_NEW CPDF_Array(); | 390 » » CPDF_Array* pCropBox = new CPDF_Array(); |
394 » » pCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.left)); | 391 » » pCropBox->Add(new CPDF_Number(rcOriginalCB.left)); |
395 » » pCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.bottom)); | 392 » » pCropBox->Add(new CPDF_Number(rcOriginalCB.bottom)); |
396 » » pCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.right)); | 393 » » pCropBox->Add(new CPDF_Number(rcOriginalCB.right)); |
397 » » pCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.top)); | 394 » » pCropBox->Add(new CPDF_Number(rcOriginalCB.top)); |
398 pPageDict->SetAt("ArtBox", pCropBox); | 395 pPageDict->SetAt("ArtBox", pCropBox); |
399 } | 396 } |
400 | 397 |
401 » CPDF_Dictionary* pRes = NULL; | 398 » CPDF_Dictionary* pRes = pPageDict->GetDict("Resources"); |
402 » pRes = pPageDict->GetDict("Resources"); | |
403 if (!pRes) | 399 if (!pRes) |
404 { | 400 { |
405 » » pRes = FX_NEW CPDF_Dictionary; | 401 » » pRes = new CPDF_Dictionary; |
406 » » pPageDict->SetAt( "Resources", pRes ); | 402 » » pPageDict->SetAt("Resources", pRes); |
407 } | 403 } |
408 | 404 |
409 » CPDF_Stream* pNewXObject = FX_NEW CPDF_Stream(NULL, 0, FX_NEW CPDF_Dicti
onary); | 405 » CPDF_Stream* pNewXObject = new CPDF_Stream(NULL, 0, FX_NEW CPDF_Dictiona
ry); |
410 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pNewXObject); | 406 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pNewXObject); |
411 CPDF_Dictionary* pPageXObject = pRes->GetDict("XObject"); | 407 CPDF_Dictionary* pPageXObject = pRes->GetDict("XObject"); |
412 if (!pPageXObject) | 408 if (!pPageXObject) |
413 { | 409 { |
414 » » pPageXObject = FX_NEW CPDF_Dictionary; | 410 » » pPageXObject = new CPDF_Dictionary; |
415 pRes->SetAt("XObject", pPageXObject); | 411 pRes->SetAt("XObject", pPageXObject); |
416 } | 412 } |
417 | 413 |
418 CFX_ByteString key = ""; | 414 CFX_ByteString key = ""; |
419 int nStreams = ObjectArray.GetSize(); | 415 int nStreams = ObjectArray.GetSize(); |
420 | 416 |
421 if (nStreams > 0) | 417 if (nStreams > 0) |
422 { | 418 { |
423 for (int iKey = 0; /*iKey < 100*/; iKey++) | 419 for (int iKey = 0; /*iKey < 100*/; iKey++) |
424 { | 420 { |
425 char sExtend[5] = {0}; | 421 char sExtend[5] = {0}; |
426 FXSYS_itoa(iKey, sExtend, 10); | 422 FXSYS_itoa(iKey, sExtend, 10); |
427 key = CFX_ByteString("FFT") + CFX_ByteString(sExtend); | 423 key = CFX_ByteString("FFT") + CFX_ByteString(sExtend); |
428 | 424 |
429 if (!pPageXObject->KeyExist(key)) | 425 if (!pPageXObject->KeyExist(key)) |
430 break; | 426 break; |
431 } | 427 } |
432 } | 428 } |
433 | 429 |
434 SetPageContents(key, pPageDict, pDocument); | 430 SetPageContents(key, pPageDict, pDocument); |
435 | 431 |
436 CPDF_Dictionary* pNewXORes = NULL; | 432 CPDF_Dictionary* pNewXORes = NULL; |
437 | 433 |
438 if (!key.IsEmpty()) | 434 if (!key.IsEmpty()) |
439 { | 435 { |
440 pPageXObject->SetAtReference(key, pDocument, dwObjNum); | 436 pPageXObject->SetAtReference(key, pDocument, dwObjNum); |
441 CPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict(); | 437 CPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict(); |
442 » » pNewXORes = FX_NEW CPDF_Dictionary; | 438 » » pNewXORes = new CPDF_Dictionary; |
443 pNewOXbjectDic->SetAt("Resources", pNewXORes); | 439 pNewOXbjectDic->SetAt("Resources", pNewXORes); |
444 pNewOXbjectDic->SetAtName("Type", "XObject"); | 440 pNewOXbjectDic->SetAtName("Type", "XObject"); |
445 pNewOXbjectDic->SetAtName("Subtype", "Form"); | 441 pNewOXbjectDic->SetAtName("Subtype", "Form"); |
446 pNewOXbjectDic->SetAtInteger("FormType", 1); | 442 pNewOXbjectDic->SetAtInteger("FormType", 1); |
447 pNewOXbjectDic->SetAtName("Name", "FRM"); | 443 pNewOXbjectDic->SetAtName("Name", "FRM"); |
448 » » CPDF_Rect rcBBox = pPageDict->GetRect("ArtBox"); | 444 » » CPDF_Rect rcBBox = pPageDict->GetRect("ArtBox"); |
449 pNewOXbjectDic->SetAtRect("BBox", rcBBox); | 445 pNewOXbjectDic->SetAtRect("BBox", rcBBox); |
450 } | 446 } |
451 » | 447 |
452 for (int i = 0; i < nStreams; i++) | 448 for (int i = 0; i < nStreams; i++) |
453 { | 449 { |
454 CPDF_Dictionary* pAnnotDic = ObjectArray.GetAt(i); | 450 CPDF_Dictionary* pAnnotDic = ObjectArray.GetAt(i); |
455 if (!pAnnotDic)continue; | 451 if (!pAnnotDic)continue; |
456 | 452 |
457 CPDF_Rect rcAnnot = pAnnotDic->GetRect("Rect"); | 453 CPDF_Rect rcAnnot = pAnnotDic->GetRect("Rect"); |
458 rcAnnot.Normalize(); | 454 rcAnnot.Normalize(); |
459 | 455 |
460 CFX_ByteString sAnnotState = pAnnotDic->GetString("AS"); | 456 CFX_ByteString sAnnotState = pAnnotDic->GetString("AS"); |
461 CPDF_Dictionary* pAnnotAP = pAnnotDic->GetDict("AP"); | 457 CPDF_Dictionary* pAnnotAP = pAnnotDic->GetDict("AP"); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 if (pObjDic) | 509 if (pObjDic) |
514 { | 510 { |
515 pObjDic->SetAtName("Type", "XObject"); | 511 pObjDic->SetAtName("Type", "XObject"); |
516 pObjDic->SetAtName("Subtype", "Form"); | 512 pObjDic->SetAtName("Subtype", "Form"); |
517 } | 513 } |
518 } | 514 } |
519 | 515 |
520 CPDF_Dictionary* pXObject = pNewXORes->GetDict("XObject"); | 516 CPDF_Dictionary* pXObject = pNewXORes->GetDict("XObject"); |
521 if (!pXObject) | 517 if (!pXObject) |
522 { | 518 { |
523 » » » pXObject = FX_NEW CPDF_Dictionary; | 519 » » » pXObject = new CPDF_Dictionary; |
524 pNewXORes->SetAt("XObject", pXObject); | 520 pNewXORes->SetAt("XObject", pXObject); |
525 } | 521 } |
526 | 522 |
527 CFX_ByteString sFormName; | 523 CFX_ByteString sFormName; |
528 sFormName.Format("F%d", i); | 524 sFormName.Format("F%d", i); |
529 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pObj); | 525 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pObj); |
530 pXObject->SetAtReference(sFormName, pDocument, dwObjNum); | 526 pXObject->SetAtReference(sFormName, pDocument, dwObjNum); |
531 | 527 |
532 CPDF_StreamAcc acc; | 528 CPDF_StreamAcc acc; |
533 acc.LoadAllData(pNewXObject); | 529 acc.LoadAllData(pNewXObject); |
(...skipping 18 matching lines...) Expand all Loading... |
552 | 548 |
553 pNewXObject->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), F
ALSE, FALSE); | 549 pNewXObject->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), F
ALSE, FALSE); |
554 } | 550 } |
555 pPageDict->RemoveAt( "Annots" ); | 551 pPageDict->RemoveAt( "Annots" ); |
556 | 552 |
557 ObjectArray.RemoveAll(); | 553 ObjectArray.RemoveAll(); |
558 RectArray.RemoveAll(); | 554 RectArray.RemoveAll(); |
559 | 555 |
560 return FLATTEN_SUCCESS; | 556 return FLATTEN_SUCCESS; |
561 } | 557 } |
OLD | NEW |