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

Side by Side Diff: chrome/utility/chrome_content_utility_client.cc

Issue 255543006: Printing on Windows via PDF (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove ref to internal_pdf and rebase Created 6 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/utility/chrome_content_utility_client.h" 5 #include "chrome/utility/chrome_content_utility_client.h"
6 6
7 #include "base/base64.h" 7 #include "base/base64.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 358
359 bool handled = true; 359 bool handled = true;
360 IPC_BEGIN_MESSAGE_MAP(ChromeContentUtilityClient, message) 360 IPC_BEGIN_MESSAGE_MAP(ChromeContentUtilityClient, message)
361 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_UnpackExtension, OnUnpackExtension) 361 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_UnpackExtension, OnUnpackExtension)
362 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_UnpackWebResource, 362 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_UnpackWebResource,
363 OnUnpackWebResource) 363 OnUnpackWebResource)
364 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseUpdateManifest, 364 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseUpdateManifest,
365 OnParseUpdateManifest) 365 OnParseUpdateManifest)
366 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImage, OnDecodeImage) 366 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImage, OnDecodeImage)
367 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImageBase64, OnDecodeImageBase64) 367 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImageBase64, OnDecodeImageBase64)
368 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafile, 368 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles,
369 OnRenderPDFPagesToMetafile) 369 OnRenderPDFPagesToMetafile)
370 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster, 370 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster,
371 OnRenderPDFPagesToPWGRaster) 371 OnRenderPDFPagesToPWGRaster)
372 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RobustJPEGDecodeImage, 372 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RobustJPEGDecodeImage,
373 OnRobustJPEGDecodeImage) 373 OnRobustJPEGDecodeImage)
374 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseJSON, OnParseJSON) 374 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseJSON, OnParseJSON)
375 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterCapsAndDefaults, 375 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterCapsAndDefaults,
376 OnGetPrinterCapsAndDefaults) 376 OnGetPrinterCapsAndDefaults)
377 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterSemanticCapsAndDefaults, 377 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterSemanticCapsAndDefaults,
378 OnGetPrinterSemanticCapsAndDefaults) 378 OnGetPrinterSemanticCapsAndDefaults)
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 560
561 if (succeeded) 561 if (succeeded)
562 Send(new ChromeUtilityHostMsg_CreateZipFile_Succeeded()); 562 Send(new ChromeUtilityHostMsg_CreateZipFile_Succeeded());
563 else 563 else
564 Send(new ChromeUtilityHostMsg_CreateZipFile_Failed()); 564 Send(new ChromeUtilityHostMsg_CreateZipFile_Failed());
565 ReleaseProcessIfNeeded(); 565 ReleaseProcessIfNeeded();
566 } 566 }
567 #endif // defined(OS_CHROMEOS) 567 #endif // defined(OS_CHROMEOS)
568 568
569 void ChromeContentUtilityClient::OnRenderPDFPagesToMetafile( 569 void ChromeContentUtilityClient::OnRenderPDFPagesToMetafile(
570 base::PlatformFile pdf_file, 570 IPC::PlatformFileForTransit pdf_transit,
571 const base::FilePath& metafile_path, 571 const base::FilePath& metafile_path,
572 const printing::PdfRenderSettings& settings, 572 const printing::PdfRenderSettings& settings,
573 const std::vector<printing::PageRange>& page_ranges) { 573 const std::vector<printing::PageRange>& page_ranges_const) {
574 bool succeeded = false; 574 bool succeeded = false;
575 #if defined(OS_WIN) 575 #if defined(OS_WIN)
576 base::PlatformFile pdf_file =
577 IPC::PlatformFileForTransitToPlatformFile(pdf_transit);
576 int highest_rendered_page_number = 0; 578 int highest_rendered_page_number = 0;
577 double scale_factor = 1.0; 579 double scale_factor = 1.0;
580 std::vector<printing::PageRange> page_ranges = page_ranges_const;
578 succeeded = RenderPDFToWinMetafile(pdf_file, 581 succeeded = RenderPDFToWinMetafile(pdf_file,
579 metafile_path, 582 metafile_path,
580 settings, 583 settings,
581 page_ranges, 584 &page_ranges,
582 &highest_rendered_page_number, 585 &highest_rendered_page_number,
583 &scale_factor); 586 &scale_factor);
584 if (succeeded) { 587 if (succeeded) {
585 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Succeeded( 588 // TODO(vitalybuka|scottmg): http://crbug.com/170859. These could
586 highest_rendered_page_number, scale_factor)); 589 // potentially be sent as each page is converted so that the spool could
590 // start sooner.
591 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_Succeeded(
592 page_ranges, scale_factor));
587 } 593 }
588 #endif // defined(OS_WIN) 594 #endif // defined(OS_WIN)
589 if (!succeeded) { 595 if (!succeeded) {
590 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Failed()); 596 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Failed());
591 } 597 }
592 ReleaseProcessIfNeeded(); 598 ReleaseProcessIfNeeded();
593 } 599 }
594 600
595 void ChromeContentUtilityClient::OnRenderPDFPagesToPWGRaster( 601 void ChromeContentUtilityClient::OnRenderPDFPagesToPWGRaster(
596 IPC::PlatformFileForTransit pdf_transit, 602 IPC::PlatformFileForTransit pdf_transit,
(...skipping 10 matching lines...) Expand all
607 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed()); 613 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed());
608 } 614 }
609 ReleaseProcessIfNeeded(); 615 ReleaseProcessIfNeeded();
610 } 616 }
611 617
612 #if defined(OS_WIN) 618 #if defined(OS_WIN)
613 bool ChromeContentUtilityClient::RenderPDFToWinMetafile( 619 bool ChromeContentUtilityClient::RenderPDFToWinMetafile(
614 base::PlatformFile pdf_file, 620 base::PlatformFile pdf_file,
615 const base::FilePath& metafile_path, 621 const base::FilePath& metafile_path,
616 const printing::PdfRenderSettings& settings, 622 const printing::PdfRenderSettings& settings,
617 const std::vector<printing::PageRange>& page_ranges, 623 std::vector<printing::PageRange>* page_ranges,
618 int* highest_rendered_page_number, 624 int* highest_rendered_page_number,
619 double* scale_factor) { 625 double* scale_factor) {
626 DCHECK(page_ranges);
620 *highest_rendered_page_number = -1; 627 *highest_rendered_page_number = -1;
621 *scale_factor = 1.0; 628 *scale_factor = 1.0;
622 base::win::ScopedHandle file(pdf_file); 629 base::win::ScopedHandle file(pdf_file);
623 630
624 if (!g_pdf_lib.Get().IsValid()) 631 if (!g_pdf_lib.Get().IsValid())
625 return false; 632 return false;
626 633
627 // TODO(sanjeevr): Add a method to the PDF DLL that takes in a file handle 634 // TODO(sanjeevr): Add a method to the PDF DLL that takes in a file handle
628 // and a page range array. That way we don't need to read the entire PDF into 635 // and a page range array. That way we don't need to read the entire PDF into
629 // memory. 636 // memory.
630 DWORD length = ::GetFileSize(file, NULL); 637 DWORD length = ::GetFileSize(file, NULL);
631 if (length == INVALID_FILE_SIZE) 638 if (length == INVALID_FILE_SIZE)
632 return false; 639 return false;
633 640
634 std::vector<uint8> buffer; 641 std::vector<uint8> buffer;
635 buffer.resize(length); 642 buffer.resize(length);
636 DWORD bytes_read = 0; 643 DWORD bytes_read = 0;
637 if (!ReadFile(pdf_file, &buffer.front(), length, &bytes_read, NULL) || 644 if (!ReadFile(pdf_file, &buffer.front(), length, &bytes_read, NULL) ||
638 (bytes_read != length)) { 645 (bytes_read != length)) {
639 return false; 646 return false;
640 } 647 }
641 648
642 int total_page_count = 0; 649 int total_page_count = 0;
643 if (!g_pdf_lib.Get().GetPDFDocInfo(&buffer.front(), buffer.size(), 650 if (!g_pdf_lib.Get().GetPDFDocInfo(&buffer.front(), buffer.size(),
644 &total_page_count, NULL)) { 651 &total_page_count, NULL)) {
645 return false; 652 return false;
646 } 653 }
647 654
648 printing::Emf metafile; 655 // If no range supplied, do all pages.
649 metafile.InitToFile(metafile_path); 656 if (page_ranges->empty()) {
650 // We need to scale down DC to fit an entire page into DC available area. 657 printing::PageRange page_range_all;
651 // Current metafile is based on screen DC and have current screen size. 658 page_range_all.from = 0;
652 // Writing outside of those boundaries will result in the cut-off output. 659 page_range_all.to = total_page_count - 1;
653 // On metafiles (this is the case here), scaling down will still record 660 page_ranges->push_back(page_range_all);
654 // original coordinates and we'll be able to print in full resolution. 661 }
655 // Before playback we'll need to counter the scaling up that will happen
656 // in the service (print_system_win.cc).
657 *scale_factor = gfx::CalculatePageScale(metafile.context(),
658 settings.area().right(),
659 settings.area().bottom());
660 gfx::ScaleDC(metafile.context(), *scale_factor);
661 662
662 bool ret = false; 663 bool ret = false;
663 std::vector<printing::PageRange>::const_iterator iter; 664 std::vector<printing::PageRange>::const_iterator iter;
664 for (iter = page_ranges.begin(); iter != page_ranges.end(); ++iter) { 665 for (iter = page_ranges->begin(); iter != page_ranges->end(); ++iter) {
665 for (int page_number = iter->from; page_number <= iter->to; ++page_number) { 666 for (int page_number = iter->from; page_number <= iter->to; ++page_number) {
666 if (page_number >= total_page_count) 667 if (page_number >= total_page_count)
667 break; 668 break;
669
670 printing::Emf metafile;
671 metafile.InitToFile(metafile_path.InsertBeforeExtensionASCII(
672 base::StringPrintf(".%d", page_number)));
673
674 // We need to scale down DC to fit an entire page into DC available area.
675 // Current metafile is based on screen DC and have current screen size.
676 // Writing outside of those boundaries will result in the cut-off output.
677 // On metafiles (this is the case here), scaling down will still record
678 // original coordinates and we'll be able to print in full resolution.
679 // Before playback we'll need to counter the scaling up that will happen
680 // in the service (print_system_win.cc).
681 *scale_factor = gfx::CalculatePageScale(metafile.context(),
682 settings.area().right(),
683 settings.area().bottom());
684 gfx::ScaleDC(metafile.context(), *scale_factor);
685
668 // The underlying metafile is of type Emf and ignores the arguments passed 686 // The underlying metafile is of type Emf and ignores the arguments passed
669 // to StartPage. 687 // to StartPage.
670 metafile.StartPage(gfx::Size(), gfx::Rect(), 1); 688 metafile.StartPage(gfx::Size(), gfx::Rect(), 1);
671 if (g_pdf_lib.Get().RenderPDFPageToDC( 689 if (g_pdf_lib.Get().RenderPDFPageToDC(
672 &buffer.front(), buffer.size(), page_number, metafile.context(), 690 &buffer.front(), buffer.size(), page_number, metafile.context(),
673 settings.dpi(), settings.dpi(), settings.area().x(), 691 settings.dpi(), settings.dpi(), settings.area().x(),
674 settings.area().y(), settings.area().width(), 692 settings.area().y(), settings.area().width(),
675 settings.area().height(), true, false, true, true, 693 settings.area().height(), true, false, true, true,
676 settings.autorotate())) { 694 settings.autorotate())) {
677 if (*highest_rendered_page_number < page_number) 695 if (*highest_rendered_page_number < page_number)
678 *highest_rendered_page_number = page_number; 696 *highest_rendered_page_number = page_number;
679 ret = true; 697 ret = true;
680 } 698 }
681 metafile.FinishPage(); 699 metafile.FinishPage();
700 metafile.FinishDocument();
682 } 701 }
683 } 702 }
684 metafile.FinishDocument();
685 return ret; 703 return ret;
686 } 704 }
687 #endif // defined(OS_WIN) 705 #endif // defined(OS_WIN)
688 706
689 bool ChromeContentUtilityClient::RenderPDFPagesToPWGRaster( 707 bool ChromeContentUtilityClient::RenderPDFPagesToPWGRaster(
690 base::PlatformFile pdf_file, 708 base::PlatformFile pdf_file,
691 const printing::PdfRenderSettings& settings, 709 const printing::PdfRenderSettings& settings,
692 const printing::PwgRasterSettings& bitmap_settings, 710 const printing::PwgRasterSettings& bitmap_settings,
693 base::PlatformFile bitmap_file) { 711 base::PlatformFile bitmap_file) {
694 bool autoupdate = true; 712 bool autoupdate = true;
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 NetworkingPrivateCrypto crypto; 1037 NetworkingPrivateCrypto crypto;
1020 success = crypto.EncryptByteString(public_key, key_data, &ciphertext); 1038 success = crypto.EncryptByteString(public_key, key_data, &ciphertext);
1021 } 1039 }
1022 1040
1023 Send(new ChromeUtilityHostMsg_GotEncryptedWiFiCredentials(ciphertext, 1041 Send(new ChromeUtilityHostMsg_GotEncryptedWiFiCredentials(ciphertext,
1024 success)); 1042 success));
1025 } 1043 }
1026 #endif // defined(OS_WIN) 1044 #endif // defined(OS_WIN)
1027 1045
1028 } // namespace chrome 1046 } // namespace chrome
OLDNEW
« no previous file with comments | « chrome/utility/chrome_content_utility_client.h ('k') | content/renderer/pepper/pepper_plugin_instance_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698