Browse Source

Fix printing selected pages on Windows

rreimann 8 years ago
parent
commit
3d54b23b7a

+ 7 - 2
chromium_src/chrome/browser/printing/print_job.cc

@@ -270,6 +270,10 @@ class PrintJob::PdfToEmfState {
   std::unique_ptr<PdfToEmfConverter> converter_;
 };
 
+void PrintJob::AppendPrintedPage(int page_number) {
+  pdf_page_mapping_.push_back(page_number);
+}
+
 void PrintJob::StartPdfToEmfConversion(
     const scoped_refptr<base::RefCountedMemory>& bytes,
     const gfx::Size& page_size,
@@ -298,14 +302,15 @@ void PrintJob::OnPdfToEmfPageConverted(int page_number,
                                        float scale_factor,
                                        std::unique_ptr<MetafilePlayer> emf) {
   DCHECK(ptd_to_emf_state_);
-  if (!document_.get() || !emf) {
+  if (!document_.get() || !emf || page_number < 0 ||
+      static_cast<size_t>(page_number) >= pdf_page_mapping_.size()) {
     ptd_to_emf_state_.reset();
     Cancel();
     return;
   }
 
   // Update the rendered document. It will send notifications to the listener.
-  document_->SetPage(page_number,
+  document_->SetPage(pdf_page_mapping_[page_number],
                      std::move(emf),
                      scale_factor,
                      ptd_to_emf_state_->page_size(),

+ 5 - 0
chromium_src/chrome/browser/printing/print_job.h

@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_PRINTING_PRINT_JOB_H_
 
 #include <memory>
+#include <vector>
 
 #include "base/memory/weak_ptr.h"
 #include "base/message_loop/message_loop.h"
@@ -91,6 +92,9 @@ class PrintJob : public PrintJobWorkerOwner,
   PrintedDocument* document() const;
 
 #if defined(OS_WIN)
+  // Let the PrintJob know the 0-based |page_number| of a given printed page.
+  void AppendPrintedPage(int page_number);
+  
   void StartPdfToEmfConversion(
       const scoped_refptr<base::RefCountedMemory>& bytes,
       const gfx::Size& page_size,
@@ -153,6 +157,7 @@ class PrintJob : public PrintJobWorkerOwner,
 #if defined(OS_WIN)
   class PdfToEmfState;
   std::unique_ptr<PdfToEmfState> ptd_to_emf_state_;
+  std::vector<int> pdf_page_mapping_;
 #endif  // OS_WIN
 
   // Used at shutdown so that we can quit a nested message loop.

+ 1 - 0
chromium_src/chrome/browser/printing/print_view_manager_base.cc

@@ -153,6 +153,7 @@ void PrintViewManagerBase::OnDidPrintPage(
 
   ShouldQuitFromInnerMessageLoop();
 #else
+  print_job_->AppendPrintedPage(params.page_number);
   if (metafile_must_be_valid) {
     scoped_refptr<base::RefCountedBytes> bytes = new base::RefCountedBytes(
         reinterpret_cast<const unsigned char*>(shared_buf.memory()),