Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium 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 #include <limits.h> | 5 #include <limits.h> |
| 6 #include <stdio.h> | 6 #include <stdio.h> |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <list> | 10 #include <list> |
| (...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 430 return 1; | 430 return 1; |
| 431 } | 431 } |
| 432 | 432 |
| 433 FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { | 433 FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { |
| 434 return true; | 434 return true; |
| 435 } | 435 } |
| 436 | 436 |
| 437 void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) { | 437 void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) { |
| 438 } | 438 } |
| 439 | 439 |
| 440 FPDF_BOOL RenderPage(const std::string& name, | |
| 441 const FPDF_DOCUMENT& doc, | |
| 442 const FPDF_FORMHANDLE& form, | |
| 443 const int page_index, | |
| 444 const Options& options) { | |
| 445 FPDF_PAGE page = FPDF_LoadPage(doc, page_index); | |
| 446 if (!page) { | |
| 447 return FALSE; | |
| 448 } | |
| 449 FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page); | |
| 450 FORM_OnAfterLoadPage(page, form); | |
| 451 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN); | |
| 452 | |
| 453 double scale = 1.0; | |
| 454 if (!options.scale_factor_as_string.empty()) { | |
| 455 std::stringstream(options.scale_factor_as_string) >> scale; | |
| 456 } | |
| 457 int width = static_cast<int>(FPDF_GetPageWidth(page) * scale); | |
| 458 int height = static_cast<int>(FPDF_GetPageHeight(page) * scale); | |
| 459 | |
| 460 FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0); | |
| 461 if (!bitmap) { | |
| 462 fprintf(stderr, "Page was too large to be rendered.\n"); | |
| 463 return FALSE; | |
| 464 } | |
| 465 | |
| 466 FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF); | |
| 467 FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0); | |
| 468 | |
| 469 FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, 0); | |
| 470 int stride = FPDFBitmap_GetStride(bitmap); | |
| 471 const char* buffer = | |
| 472 reinterpret_cast<const char*>(FPDFBitmap_GetBuffer(bitmap)); | |
| 473 | |
| 474 switch (options.output_format) { | |
| 475 #ifdef _WIN32 | |
| 476 case OUTPUT_BMP: | |
| 477 WriteBmp(name.c_str(), page_index, buffer, stride, width, height); | |
| 478 break; | |
| 479 | |
| 480 case OUTPUT_EMF: | |
| 481 WriteEmf(page, name.c_str(), page_index); | |
| 482 break; | |
| 483 #endif | |
| 484 case OUTPUT_PNG: | |
| 485 WritePng(name.c_str(), page_index, buffer, stride, width, height); | |
| 486 break; | |
| 487 | |
| 488 case OUTPUT_PPM: | |
| 489 WritePpm(name.c_str(), page_index, buffer, stride, width, height); | |
| 490 break; | |
| 491 | |
| 492 default: | |
| 493 break; | |
| 494 } | |
| 495 | |
| 496 FPDFBitmap_Destroy(bitmap); | |
| 497 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE); | |
| 498 FORM_OnBeforeClosePage(page, form); | |
| 499 FPDFText_ClosePage(text_page); | |
| 500 FPDF_ClosePage(page); | |
| 501 return TRUE; | |
| 502 } | |
| 503 | |
| 440 void RenderPdf(const std::string& name, const char* pBuf, size_t len, | 504 void RenderPdf(const std::string& name, const char* pBuf, size_t len, |
| 441 const Options& options) { | 505 const Options& options) { |
| 442 fprintf(stderr, "Rendering PDF file %s.\n", name.c_str()); | 506 fprintf(stderr, "Rendering PDF file %s.\n", name.c_str()); |
| 443 | 507 |
| 444 IPDF_JSPLATFORM platform_callbacks; | 508 IPDF_JSPLATFORM platform_callbacks; |
| 445 memset(&platform_callbacks, '\0', sizeof(platform_callbacks)); | 509 memset(&platform_callbacks, '\0', sizeof(platform_callbacks)); |
| 446 platform_callbacks.version = 3; | 510 platform_callbacks.version = 3; |
| 447 platform_callbacks.app_alert = ExampleAppAlert; | 511 platform_callbacks.app_alert = ExampleAppAlert; |
| 448 platform_callbacks.Doc_gotoPage = ExampleDocGotoPage; | 512 platform_callbacks.Doc_gotoPage = ExampleDocGotoPage; |
| 449 | 513 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 464 memset(&file_avail, '\0', sizeof(file_avail)); | 528 memset(&file_avail, '\0', sizeof(file_avail)); |
| 465 file_avail.version = 1; | 529 file_avail.version = 1; |
| 466 file_avail.IsDataAvail = Is_Data_Avail; | 530 file_avail.IsDataAvail = Is_Data_Avail; |
| 467 | 531 |
| 468 FX_DOWNLOADHINTS hints; | 532 FX_DOWNLOADHINTS hints; |
| 469 memset(&hints, '\0', sizeof(hints)); | 533 memset(&hints, '\0', sizeof(hints)); |
| 470 hints.version = 1; | 534 hints.version = 1; |
| 471 hints.AddSegment = Add_Segment; | 535 hints.AddSegment = Add_Segment; |
| 472 | 536 |
| 473 FPDF_DOCUMENT doc; | 537 FPDF_DOCUMENT doc; |
| 538 int32_t nRet = PDF_DATA_NOTAVAIL; | |
| 539 FPDF_BOOL bIsLinearized = FALSE; | |
| 474 FPDF_AVAIL pdf_avail = FPDFAvail_Create(&file_avail, &file_access); | 540 FPDF_AVAIL pdf_avail = FPDFAvail_Create(&file_avail, &file_access); |
| 475 | 541 if (FPDFAvail_IsLinearized(pdf_avail) == PDF_LINEARIZED) { |
| 476 (void)FPDFAvail_IsDocAvail(pdf_avail, &hints); | |
| 477 | |
| 478 if (FPDFAvail_IsLinearized(pdf_avail)) { | |
| 479 fprintf(stderr, "Linearized path...\n"); | 542 fprintf(stderr, "Linearized path...\n"); |
| 480 doc = FPDFAvail_GetDocument(pdf_avail, nullptr); | 543 doc = FPDFAvail_GetDocument(pdf_avail, nullptr); |
| 544 if (!doc) { | |
| 545 fprintf(stderr, "Load linearized pdf docs unsuccessful.\n"); | |
| 546 return; | |
| 547 } | |
| 548 while (nRet == PDF_DATA_NOTAVAIL) { | |
| 549 nRet = FPDFAvail_IsDocAvail(pdf_avail, &hints); | |
|
Tom Sepez
2015/10/21 17:53:08
For example, if we had a separate function to chec
jun_fang
2015/10/22 00:50:06
Using the example as above, we shall use
FPDFAvai
| |
| 550 } | |
| 551 if (nRet == PDF_DATA_ERROR) { | |
| 552 return; | |
| 553 } | |
| 554 if (FPDFAvail_IsFormAvail(pdf_avail, &hints) == PDF_FORM_NOTAVAIL) { | |
| 555 return; | |
| 556 } | |
| 557 bIsLinearized = TRUE; | |
| 481 } else { | 558 } else { |
| 482 fprintf(stderr, "Non-linearized path...\n"); | 559 fprintf(stderr, "Non-linearized path...\n"); |
| 483 doc = FPDF_LoadCustomDocument(&file_access, nullptr); | 560 doc = FPDF_LoadCustomDocument(&file_access, nullptr); |
| 484 } | 561 if (!doc) { |
| 485 | 562 fprintf(stderr, "Load non-linearized pdf docs unsuccessful.\n"); |
| 486 if (!doc) { | 563 return; |
| 487 fprintf(stderr, "Load pdf docs unsuccessful.\n"); | 564 } |
| 488 return; | |
| 489 } | 565 } |
| 490 | 566 |
| 491 (void)FPDF_GetDocPermissions(doc); | 567 (void)FPDF_GetDocPermissions(doc); |
| 492 (void)FPDFAvail_IsFormAvail(pdf_avail, &hints); | |
| 493 | 568 |
| 494 FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks); | 569 FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks); |
| 495 FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD); | 570 FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD); |
| 496 FPDF_SetFormFieldHighlightAlpha(form, 100); | 571 FPDF_SetFormFieldHighlightAlpha(form, 100); |
| 497 | 572 |
| 498 int first_page = FPDFAvail_GetFirstPageNum(doc); | |
| 499 (void)FPDFAvail_IsPageAvail(pdf_avail, first_page, &hints); | |
| 500 | |
| 501 int page_count = FPDF_GetPageCount(doc); | |
| 502 for (int i = 0; i < page_count; ++i) { | |
| 503 (void)FPDFAvail_IsPageAvail(pdf_avail, i, &hints); | |
| 504 } | |
| 505 | |
| 506 FORM_DoDocumentJSAction(form); | 573 FORM_DoDocumentJSAction(form); |
| 507 FORM_DoDocumentOpenAction(form); | 574 FORM_DoDocumentOpenAction(form); |
| 508 | 575 |
| 576 int page_count = FPDF_GetPageCount(doc); | |
| 509 int rendered_pages = 0; | 577 int rendered_pages = 0; |
| 510 int bad_pages = 0; | 578 int bad_pages = 0; |
| 511 for (int i = 0; i < page_count; ++i) { | 579 for (int i = 0; i < page_count; ++i) { |
| 512 FPDF_PAGE page = FPDF_LoadPage(doc, i); | 580 if (bIsLinearized) { |
| 513 if (!page) { | 581 nRet = PDF_DATA_NOTAVAIL; |
| 582 while (nRet == PDF_DATA_NOTAVAIL) { | |
| 583 nRet = FPDFAvail_IsPageAvail(pdf_avail, i, &hints); | |
| 584 } | |
| 585 if (nRet == PDF_DATA_ERROR) { | |
| 586 return; | |
| 587 } | |
| 588 } | |
| 589 if (RenderPage(name, doc, form, i, options)) { | |
| 590 ++rendered_pages; | |
| 591 } else { | |
| 514 ++bad_pages; | 592 ++bad_pages; |
| 515 continue; | |
| 516 } | 593 } |
| 517 FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page); | |
| 518 FORM_OnAfterLoadPage(page, form); | |
| 519 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN); | |
| 520 | |
| 521 double scale = 1.0; | |
| 522 if (!options.scale_factor_as_string.empty()) { | |
| 523 std::stringstream(options.scale_factor_as_string) >> scale; | |
| 524 } | |
| 525 int width = static_cast<int>(FPDF_GetPageWidth(page) * scale); | |
| 526 int height = static_cast<int>(FPDF_GetPageHeight(page) * scale); | |
| 527 | |
| 528 FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0); | |
| 529 if (!bitmap) { | |
| 530 fprintf(stderr, "Page was too large to be rendered.\n"); | |
| 531 bad_pages++; | |
| 532 continue; | |
| 533 } | |
| 534 | |
| 535 FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF); | |
| 536 FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0); | |
| 537 ++rendered_pages; | |
| 538 | |
| 539 FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, 0); | |
| 540 int stride = FPDFBitmap_GetStride(bitmap); | |
| 541 const char* buffer = | |
| 542 reinterpret_cast<const char*>(FPDFBitmap_GetBuffer(bitmap)); | |
| 543 | |
| 544 switch (options.output_format) { | |
| 545 #ifdef _WIN32 | |
| 546 case OUTPUT_BMP: | |
| 547 WriteBmp(name.c_str(), i, buffer, stride, width, height); | |
| 548 break; | |
| 549 | |
| 550 case OUTPUT_EMF: | |
| 551 WriteEmf(page, name.c_str(), i); | |
| 552 break; | |
| 553 #endif | |
| 554 case OUTPUT_PNG: | |
| 555 WritePng(name.c_str(), i, buffer, stride, width, height); | |
| 556 break; | |
| 557 | |
| 558 case OUTPUT_PPM: | |
| 559 WritePpm(name.c_str(), i, buffer, stride, width, height); | |
| 560 break; | |
| 561 | |
| 562 default: | |
| 563 break; | |
| 564 } | |
| 565 | |
| 566 FPDFBitmap_Destroy(bitmap); | |
| 567 | |
| 568 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE); | |
| 569 FORM_OnBeforeClosePage(page, form); | |
| 570 FPDFText_ClosePage(text_page); | |
| 571 FPDF_ClosePage(page); | |
| 572 } | 594 } |
| 573 | 595 |
| 574 FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC); | 596 FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC); |
| 575 FPDFDOC_ExitFormFillEnvironment(form); | 597 FPDFDOC_ExitFormFillEnvironment(form); |
| 576 FPDF_CloseDocument(doc); | 598 FPDF_CloseDocument(doc); |
| 577 FPDFAvail_Destroy(pdf_avail); | 599 FPDFAvail_Destroy(pdf_avail); |
| 578 | 600 |
| 579 fprintf(stderr, "Rendered %d pages.\n", rendered_pages); | 601 fprintf(stderr, "Rendered %d pages.\n", rendered_pages); |
| 580 fprintf(stderr, "Skipped %d bad pages.\n", bad_pages); | 602 fprintf(stderr, "Skipped %d bad pages.\n", bad_pages); |
| 581 } | 603 } |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 657 } | 679 } |
| 658 | 680 |
| 659 FPDF_DestroyLibrary(); | 681 FPDF_DestroyLibrary(); |
| 660 #ifdef PDF_ENABLE_V8 | 682 #ifdef PDF_ENABLE_V8 |
| 661 v8::V8::ShutdownPlatform(); | 683 v8::V8::ShutdownPlatform(); |
| 662 delete platform; | 684 delete platform; |
| 663 #endif // PDF_ENABLE_V8 | 685 #endif // PDF_ENABLE_V8 |
| 664 | 686 |
| 665 return 0; | 687 return 0; |
| 666 } | 688 } |
| OLD | NEW |