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

Unified Diff: chrome/browser/printing/print_view_manager_base.cc

Issue 255543006: Printing on Windows via PDF (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: almost working; SafePlayback failing in final print Created 6 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/printing/print_view_manager_base.cc
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc
index cfadc098230320b8857352a963b73c052c0ce38e..0471a1c98b4b4f9f9e7e07667bf058a3f2f7a391 100644
--- a/chrome/browser/printing/print_view_manager_base.cc
+++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -7,12 +7,14 @@
#include <map>
#include "base/bind.h"
+#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_ptr.h"
#include "base/prefs/pref_service.h"
#include "base/strings/utf_string_conversions.h"
#include "base/timer/timer.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/printing/pdf_to_emf_converter.h"
#include "chrome/browser/printing/print_job.h"
#include "chrome/browser/printing/print_job_manager.h"
#include "chrome/browser/printing/printer_query.h"
@@ -29,6 +31,7 @@
#include "content/public/browser/web_contents_view.h"
#include "grit/generated_resources.h"
#include "printing/metafile_impl.h"
+#include "printing/pdf_render_settings.h"
#include "printing/printed_document.h"
#include "ui/base/l10n/l10n_util.h"
@@ -44,7 +47,7 @@
using base::TimeDelta;
using content::BrowserThread;
-#if defined(OS_WIN)
+#if !defined(PRINTING_WIN_USES_PDF_AS_METAFILE)
// Limits memory usage by raster to 64 MiB.
const int kMaxRasterSizeInPixels = 16*1024*1024;
#endif
@@ -59,7 +62,8 @@ PrintViewManagerBase::PrintViewManagerBase(content::WebContents* web_contents)
cookie_(0),
queue_(g_browser_process->print_job_manager()->queue()) {
DCHECK(queue_);
-#if defined(OS_POSIX) && !defined(OS_MACOSX)
+#if (defined(OS_POSIX) && !defined(OS_MACOSX)) || \
+ defined(PRINTING_WIN_USES_PDF_AS_METAFILE)
expecting_first_page_ = true;
#endif
Profile* profile =
@@ -125,6 +129,31 @@ void PrintViewManagerBase::OnDidGetDocumentCookie(int cookie) {
cookie_ = cookie;
}
+#if defined(PRINTING_WIN_USES_PDF_AS_METAFILE)
+void PrintViewManagerBase::OnPdfToEmfConverted(
+ const PrintHostMsg_DidPrintPage_Params& params,
+ bool success,
+ const base::FilePath& emf_file) {
+ PrintedDocument* document = print_job_->document();
Vitaly Buka (NO REVIEWS) 2014/04/25 22:35:24 this metafile could be multi paged. it's likely in
Vitaly Buka (NO REVIEWS) 2014/04/25 22:42:16 single string -> single stream of concatenated pag
scottmg 2014/04/25 22:45:10 This is only called from OnDidPrintPage, where it'
+ if (!document)
+ return;
+ scoped_ptr<printing::Emf> metafile(new printing::Emf);
+ if (!metafile->InitFromFile(emf_file)) {
+ NOTREACHED() << "Invalid metafile";
+ web_contents()->Stop();
+ return;
+ }
+ // Update the rendered document. It will send notifications to the listener.
+ document->SetPage(params.page_number,
+ metafile.release(),
+ params.actual_shrink,
+ params.page_size,
+ params.content_area);
+
+ ShouldQuitFromInnerMessageLoop();
+}
+#endif // PRINTING_WIN_USES_PDF_AS_METAFILE
+
void PrintViewManagerBase::OnDidPrintPage(
const PrintHostMsg_DidPrintPage_Params& params) {
if (!OpportunisticallyCreatePrintJob(params.document_cookie))
@@ -137,9 +166,9 @@ void PrintViewManagerBase::OnDidPrintPage(
return;
}
-#if defined(OS_WIN) || defined(OS_MACOSX)
+#if !defined(PRINTING_WIN_USES_PDF_AS_METAFILE) || defined(OS_MACOSX)
const bool metafile_must_be_valid = true;
-#elif defined(OS_POSIX)
+#elif defined(OS_POSIX) || defined(PRINTING_WIN_USES_PDF_AS_METAFILE)
const bool metafile_must_be_valid = expecting_first_page_;
expecting_first_page_ = false;
#endif
@@ -153,6 +182,7 @@ void PrintViewManagerBase::OnDidPrintPage(
}
}
+#if !defined(PRINTING_WIN_USES_PDF_AS_METAFILE)
scoped_ptr<NativeMetafile> metafile(new NativeMetafile);
if (metafile_must_be_valid) {
if (!metafile->InitFromData(shared_buf.memory(), params.data_size)) {
@@ -162,7 +192,6 @@ void PrintViewManagerBase::OnDidPrintPage(
}
}
-#if defined(OS_WIN)
bool big_emf = (params.data_size && params.data_size >= kMetafileMaxSize);
int raster_size = std::min(params.page_size.GetArea(),
kMaxRasterSizeInPixels);
@@ -179,7 +208,6 @@ void PrintViewManagerBase::OnDidPrintPage(
return;
}
}
-#endif
// Update the rendered document. It will send notifications to the listener.
document->SetPage(params.page_number,
@@ -189,6 +217,30 @@ void PrintViewManagerBase::OnDidPrintPage(
params.content_area);
ShouldQuitFromInnerMessageLoop();
+#elif defined(PRINTING_WIN_USES_PDF_AS_METAFILE)
+ base::RefCountedBytes* bytes = new base::RefCountedBytes(
+ reinterpret_cast<const unsigned char*>(shared_buf.memory()),
+ params.data_size);
+
+ if (!pdf_to_emf_converter_)
+ pdf_to_emf_converter_ = PdfToEmfConverter::CreateDefault();
+
+ /* XXX
scottmg 2014/04/25 20:47:18 Not sure what the correct way to get a printer DC
Vitaly Buka (NO REVIEWS) 2014/04/25 22:35:24 you don't need dc here, params.printable_area is p
scottmg 2014/04/25 22:45:10 Ah! Thanks.
+ int printer_dpi = ::GetDeviceCaps(printer_dc_.Get(), LOGPIXELSX);
+ int dc_width = GetDeviceCaps(printer_dc_.Get(), PHYSICALWIDTH);
+ int dc_height = GetDeviceCaps(printer_dc_.Get(), PHYSICALHEIGHT);
+ */
+ int printer_dpi = 300;
+ int dc_width = 300*8.5;
+ int dc_height = 300*11;
+ gfx::Rect render_area(0, 0, dc_width, dc_height);
+ pdf_to_emf_converter_->Start(
+ bytes,
+ printing::PdfRenderSettings(render_area, printer_dpi, false),
+ base::Bind(&PrintViewManagerBase::OnPdfToEmfConverted,
+ base::Unretained(this),
+ params));
+#endif
}
void PrintViewManagerBase::OnPrintingFailed(int cookie) {
@@ -395,7 +447,8 @@ void PrintViewManagerBase::DisconnectFromCurrentPrintJob() {
// DO NOT wait for the job to finish.
ReleasePrintJob();
}
-#if defined(OS_POSIX) && !defined(OS_MACOSX)
+#if (defined(OS_POSIX) && !defined(OS_MACOSX)) || \
+ defined(PRINTING_WIN_USES_PDF_AS_METAFILE)
expecting_first_page_ = true;
#endif
}

Powered by Google App Engine
This is Rietveld 408576698