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

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

Issue 2633573002: Add Postscript Printing (Closed)
Patch Set: Fix clang compile Created 3 years, 10 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/printing_handler.h" 5 #include "chrome/utility/printing_handler.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/files/file_util.h" 10 #include "base/files/file_util.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 bool PrintingHandler::OnMessageReceived(const IPC::Message& message) { 63 bool PrintingHandler::OnMessageReceived(const IPC::Message& message) {
64 bool handled = true; 64 bool handled = true;
65 IPC_BEGIN_MESSAGE_MAP(PrintingHandler, message) 65 IPC_BEGIN_MESSAGE_MAP(PrintingHandler, message)
66 #if defined(OS_WIN) 66 #if defined(OS_WIN)
67 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles, 67 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles,
68 OnRenderPDFPagesToMetafile) 68 OnRenderPDFPagesToMetafile)
69 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage, 69 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage,
70 OnRenderPDFPagesToMetafileGetPage) 70 OnRenderPDFPagesToMetafileGetPage)
71 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop, 71 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop,
72 OnRenderPDFPagesToMetafileStop) 72 OnRenderPDFPagesToMetafileStop)
73 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPostScript_Start,
74 OnRenderPDFPagesToPostScriptStart)
75 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPostScript_GetPage,
76 OnRenderPDFPagesToPostScriptGetPage)
77 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPostScript_Stop,
78 OnRenderPDFPagesToPostScriptStop)
73 #endif // OS_WIN 79 #endif // OS_WIN
74 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) 80 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
75 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster, 81 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster,
76 OnRenderPDFPagesToPWGRaster) 82 OnRenderPDFPagesToPWGRaster)
77 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterCapsAndDefaults, 83 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterCapsAndDefaults,
78 OnGetPrinterCapsAndDefaults) 84 OnGetPrinterCapsAndDefaults)
79 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterSemanticCapsAndDefaults, 85 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterSemanticCapsAndDefaults,
80 OnGetPrinterSemanticCapsAndDefaults) 86 OnGetPrinterSemanticCapsAndDefaults)
81 #endif // ENABLE_PRINT_PREVIEW 87 #endif // ENABLE_PRINT_PREVIEW
82 IPC_MESSAGE_UNHANDLED(handled = false) 88 IPC_MESSAGE_UNHANDLED(handled = false)
83 IPC_END_MESSAGE_MAP() 89 IPC_END_MESSAGE_MAP()
84 return handled; 90 return handled;
85 } 91 }
86 92
87 #if defined(OS_WIN) 93 #if defined(OS_WIN)
88 void PrintingHandler::OnRenderPDFPagesToMetafile( 94 void PrintingHandler::OnRenderPDFPagesToMetafile(
89 IPC::PlatformFileForTransit pdf_transit, 95 IPC::PlatformFileForTransit pdf_transit,
90 const PdfRenderSettings& settings) { 96 const PdfRenderSettings& settings) {
91 pdf_rendering_settings_ = settings; 97 pdf_rendering_settings_ = settings;
98 chrome_pdf::SetPDFPostscriptPrintingLevel(0); // Not using postscript.
92 chrome_pdf::SetPDFUseGDIPrinting(pdf_rendering_settings_.mode == 99 chrome_pdf::SetPDFUseGDIPrinting(pdf_rendering_settings_.mode ==
93 PdfRenderSettings::Mode::GDI_TEXT); 100 PdfRenderSettings::Mode::GDI_TEXT);
94 base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit); 101 base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit);
95 int page_count = LoadPDF(std::move(pdf_file)); 102 int page_count = LoadPDF(std::move(pdf_file));
96 Send( 103 Send(
97 new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount(page_count)); 104 new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount(page_count));
98 } 105 }
99 106
100 void PrintingHandler::OnRenderPDFPagesToMetafileGetPage( 107 void PrintingHandler::OnRenderPDFPagesToMetafileGetPage(
101 int page_number, 108 int page_number,
102 IPC::PlatformFileForTransit output_file) { 109 IPC::PlatformFileForTransit output_file) {
103 base::File emf_file = IPC::PlatformFileForTransitToFile(output_file); 110 base::File emf_file = IPC::PlatformFileForTransitToFile(output_file);
104 float scale_factor = 1.0f; 111 float scale_factor = 1.0f;
105 bool success = 112 bool success =
106 RenderPdfPageToMetafile(page_number, std::move(emf_file), &scale_factor); 113 RenderPdfPageToMetafile(page_number, std::move(emf_file), &scale_factor);
107 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone( 114 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone(
108 success, scale_factor)); 115 success, scale_factor));
109 } 116 }
110 117
111 void PrintingHandler::OnRenderPDFPagesToMetafileStop() { 118 void PrintingHandler::OnRenderPDFPagesToMetafileStop() {
112 ReleaseProcessIfNeeded(); 119 ReleaseProcessIfNeeded();
113 } 120 }
114 121
115 #endif // OS_WIN 122 void PrintingHandler::OnRenderPDFPagesToPostScriptStart(
123 IPC::PlatformFileForTransit pdf_transit,
124 const PdfRenderSettings& settings) {
125 pdf_rendering_settings_ = settings;
126 if (pdf_rendering_settings_.mode ==
127 PdfRenderSettings::Mode::POSTSCRIPT_LEVEL2) {
128 chrome_pdf::SetPDFPostscriptPrintingLevel(2);
129 } else if (pdf_rendering_settings_.mode ==
130 PdfRenderSettings::Mode::POSTSCRIPT_LEVEL3) {
131 chrome_pdf::SetPDFPostscriptPrintingLevel(3);
132 }
133
134 base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit);
135 int page_count = LoadPDF(std::move(pdf_file));
136 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPostScript_PageCount(
137 page_count));
138 }
139
140 void PrintingHandler::OnRenderPDFPagesToPostScriptGetPage(
141 int page_number,
142 IPC::PlatformFileForTransit output_file) {
143 base::File ps_file = IPC::PlatformFileForTransitToFile(output_file);
144 bool success = RenderPdfPageToPostScript(page_number, std::move(ps_file));
145 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPostScript_PageDone(success));
146 }
147
148 void PrintingHandler::OnRenderPDFPagesToPostScriptStop() {
149 ReleaseProcessIfNeeded();
150 }
151 #endif // defined(OS_WIN)
116 152
117 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) 153 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
118 void PrintingHandler::OnRenderPDFPagesToPWGRaster( 154 void PrintingHandler::OnRenderPDFPagesToPWGRaster(
119 IPC::PlatformFileForTransit pdf_transit, 155 IPC::PlatformFileForTransit pdf_transit,
120 const PdfRenderSettings& settings, 156 const PdfRenderSettings& settings,
121 const PwgRasterSettings& bitmap_settings, 157 const PwgRasterSettings& bitmap_settings,
122 IPC::PlatformFileForTransit bitmap_transit) { 158 IPC::PlatformFileForTransit bitmap_transit) {
123 base::File pdf = IPC::PlatformFileForTransitToFile(pdf_transit); 159 base::File pdf = IPC::PlatformFileForTransitToFile(pdf_transit);
124 base::File bitmap = IPC::PlatformFileForTransitToFile(bitmap_transit); 160 base::File bitmap = IPC::PlatformFileForTransitToFile(bitmap_transit);
125 if (RenderPDFPagesToPWGRaster(std::move(pdf), settings, bitmap_settings, 161 if (RenderPDFPagesToPWGRaster(std::move(pdf), settings, bitmap_settings,
126 std::move(bitmap))) { 162 std::move(bitmap))) {
127 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Succeeded()); 163 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Succeeded());
128 } else { 164 } else {
129 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed()); 165 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed());
130 } 166 }
131 ReleaseProcessIfNeeded(); 167 ReleaseProcessIfNeeded();
132 } 168 }
133 #endif // ENABLE_PRINT_PREVIEW 169 #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW)
134 170
135 #if defined(OS_WIN) 171 #if defined(OS_WIN)
136 int PrintingHandler::LoadPDF(base::File pdf_file) { 172 int PrintingHandler::LoadPDF(base::File pdf_file) {
137 int64_t length64 = pdf_file.GetLength(); 173 int64_t length64 = pdf_file.GetLength();
138 if (length64 <= 0 || length64 > std::numeric_limits<int>::max()) 174 if (length64 <= 0 || length64 > std::numeric_limits<int>::max())
139 return 0; 175 return 0;
140 int length = static_cast<int>(length64); 176 int length = static_cast<int>(length64);
141 177
142 pdf_data_.resize(length); 178 pdf_data_.resize(length);
143 if (length != pdf_file.Read(0, pdf_data_.data(), pdf_data_.size())) 179 if (length != pdf_file.Read(0, pdf_data_.data(), pdf_data_.size()))
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 pdf_rendering_settings_.area.y(), 214 pdf_rendering_settings_.area.y(),
179 pdf_rendering_settings_.area.width(), 215 pdf_rendering_settings_.area.width(),
180 pdf_rendering_settings_.area.height(), true, false, true, true, 216 pdf_rendering_settings_.area.height(), true, false, true, true,
181 pdf_rendering_settings_.autorotate)) { 217 pdf_rendering_settings_.autorotate)) {
182 return false; 218 return false;
183 } 219 }
184 metafile.FinishPage(); 220 metafile.FinishPage();
185 metafile.FinishDocument(); 221 metafile.FinishDocument();
186 return metafile.SaveTo(&output_file); 222 return metafile.SaveTo(&output_file);
187 } 223 }
224
225 bool PrintingHandler::RenderPdfPageToPostScript(int page_number,
226 base::File output_file) {
227 Emf metafile;
228 metafile.Init();
229
230 // The underlying metafile is of type Emf and ignores the arguments passed
231 // to StartPage.
232 metafile.StartPage(gfx::Size(), gfx::Rect(), 1);
233 if (!chrome_pdf::RenderPDFPageToDC(
234 &pdf_data_.front(), pdf_data_.size(), page_number, metafile.context(),
235 pdf_rendering_settings_.dpi, pdf_rendering_settings_.area.x() -
236 pdf_rendering_settings_.offsets.x(),
237 pdf_rendering_settings_.area.y() -
238 pdf_rendering_settings_.offsets.y(),
239 pdf_rendering_settings_.area.width(),
240 pdf_rendering_settings_.area.height(), true, false, true, true,
241 pdf_rendering_settings_.autorotate)) {
242 return false;
243 }
244 metafile.FinishPage();
245 metafile.FinishDocument();
246 return metafile.SaveTo(&output_file);
247 }
188 #endif // defined(OS_WIN) 248 #endif // defined(OS_WIN)
189 249
190 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) 250 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
191 bool PrintingHandler::RenderPDFPagesToPWGRaster( 251 bool PrintingHandler::RenderPDFPagesToPWGRaster(
192 base::File pdf_file, 252 base::File pdf_file,
193 const PdfRenderSettings& settings, 253 const PdfRenderSettings& settings,
194 const PwgRasterSettings& bitmap_settings, 254 const PwgRasterSettings& bitmap_settings,
195 base::File bitmap_file) { 255 base::File bitmap_file) {
196 base::File::Info info; 256 base::File::Info info;
197 if (!pdf_file.GetInfo(&info) || info.size <= 0 || 257 if (!pdf_file.GetInfo(&info) || info.size <= 0 ||
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 if (print_backend->GetPrinterSemanticCapsAndDefaults(printer_name, 362 if (print_backend->GetPrinterSemanticCapsAndDefaults(printer_name,
303 &printer_info)) { 363 &printer_info)) {
304 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded( 364 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded(
305 printer_name, printer_info)); 365 printer_name, printer_info));
306 } else { 366 } else {
307 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed( 367 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed(
308 printer_name)); 368 printer_name));
309 } 369 }
310 ReleaseProcessIfNeeded(); 370 ReleaseProcessIfNeeded();
311 } 371 }
312 #endif // ENABLE_PRINT_PREVIEW 372 #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW)
313 373
314 } // namespace printing 374 } // namespace printing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698