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

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

Issue 2633573002: Add Postscript Printing (Closed)
Patch Set: Fix Linux compile error Created 3 years, 11 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 bool print_text_with_gdi) {
92 pdf_rendering_settings_ = settings; 97 pdf_rendering_settings_ = settings;
93 chrome_pdf::SetPDFUseGDIPrinting(print_text_with_gdi); 98 chrome_pdf::SetPDFPostscriptPrintingLevel(0); // Not using postscript.
99 chrome_pdf::SetPDFUseGDIPrinting(pdf_rendering_settings_.mode ==
100 PdfRenderSettings::Mode::GDI_TEXT);
101
94 base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit); 102 base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit);
95 int page_count = LoadPDF(std::move(pdf_file)); 103 int page_count = LoadPDF(std::move(pdf_file));
96 Send( 104 Send(
97 new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount(page_count)); 105 new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount(page_count));
98 } 106 }
99 107
100 void PrintingHandler::OnRenderPDFPagesToMetafileGetPage( 108 void PrintingHandler::OnRenderPDFPagesToMetafileGetPage(
101 int page_number, 109 int page_number,
102 IPC::PlatformFileForTransit output_file) { 110 IPC::PlatformFileForTransit output_file) {
103 base::File emf_file = IPC::PlatformFileForTransitToFile(output_file); 111 base::File emf_file = IPC::PlatformFileForTransitToFile(output_file);
104 float scale_factor = 1.0f; 112 float scale_factor = 1.0f;
105 bool success = 113 bool success =
106 RenderPdfPageToMetafile(page_number, std::move(emf_file), &scale_factor); 114 RenderPdfPageToMetafile(page_number, std::move(emf_file), &scale_factor);
107 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone( 115 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone(
108 success, scale_factor)); 116 success, scale_factor));
109 } 117 }
110 118
111 void PrintingHandler::OnRenderPDFPagesToMetafileStop() { 119 void PrintingHandler::OnRenderPDFPagesToMetafileStop() {
112 ReleaseProcessIfNeeded(); 120 ReleaseProcessIfNeeded();
113 } 121 }
114 122
115 #endif // OS_WIN 123 void PrintingHandler::OnRenderPDFPagesToPostScriptStart(
124 IPC::PlatformFileForTransit pdf_transit,
125 const PdfRenderSettings& settings) {
126 pdf_rendering_settings_ = settings;
127 if (pdf_rendering_settings_.mode ==
128 PdfRenderSettings::Mode::POSTSCRIPT_LEVEL2) {
129 chrome_pdf::SetPDFPostscriptPrintingLevel(2);
130 } else if (pdf_rendering_settings_.mode ==
131 PdfRenderSettings::Mode::POSTSCRIPT_LEVEL3) {
132 chrome_pdf::SetPDFPostscriptPrintingLevel(3);
133 }
134
135 base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit);
136 int page_count = LoadPDF(std::move(pdf_file));
137 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPostScript_PageCount(
138 page_count));
139 }
140
141 void PrintingHandler::OnRenderPDFPagesToPostScriptGetPage(
142 int page_number,
143 IPC::PlatformFileForTransit output_file) {
144 base::File ps_file = IPC::PlatformFileForTransitToFile(output_file);
145 bool success = RenderPdfPageToPostScript(page_number, std::move(ps_file));
146 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPostScript_PageDone(success));
147 }
148
149 void PrintingHandler::OnRenderPDFPagesToPostScriptStop() {
150 ReleaseProcessIfNeeded();
151 }
152 #endif // defined(OS_WIN)
116 153
117 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) 154 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
118 void PrintingHandler::OnRenderPDFPagesToPWGRaster( 155 void PrintingHandler::OnRenderPDFPagesToPWGRaster(
119 IPC::PlatformFileForTransit pdf_transit, 156 IPC::PlatformFileForTransit pdf_transit,
120 const PdfRenderSettings& settings, 157 const PdfRenderSettings& settings,
121 const PwgRasterSettings& bitmap_settings, 158 const PwgRasterSettings& bitmap_settings,
122 IPC::PlatformFileForTransit bitmap_transit) { 159 IPC::PlatformFileForTransit bitmap_transit) {
123 base::File pdf = IPC::PlatformFileForTransitToFile(pdf_transit); 160 base::File pdf = IPC::PlatformFileForTransitToFile(pdf_transit);
124 base::File bitmap = IPC::PlatformFileForTransitToFile(bitmap_transit); 161 base::File bitmap = IPC::PlatformFileForTransitToFile(bitmap_transit);
125 if (RenderPDFPagesToPWGRaster(std::move(pdf), settings, bitmap_settings, 162 if (RenderPDFPagesToPWGRaster(std::move(pdf), settings, bitmap_settings,
126 std::move(bitmap))) { 163 std::move(bitmap))) {
127 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Succeeded()); 164 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Succeeded());
128 } else { 165 } else {
129 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed()); 166 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed());
130 } 167 }
131 ReleaseProcessIfNeeded(); 168 ReleaseProcessIfNeeded();
132 } 169 }
133 #endif // ENABLE_PRINT_PREVIEW 170 #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW)
134 171
135 #if defined(OS_WIN) 172 #if defined(OS_WIN)
136 int PrintingHandler::LoadPDF(base::File pdf_file) { 173 int PrintingHandler::LoadPDF(base::File pdf_file) {
137 int64_t length64 = pdf_file.GetLength(); 174 int64_t length64 = pdf_file.GetLength();
138 if (length64 <= 0 || length64 > std::numeric_limits<int>::max()) 175 if (length64 <= 0 || length64 > std::numeric_limits<int>::max())
139 return 0; 176 return 0;
140 int length = static_cast<int>(length64); 177 int length = static_cast<int>(length64);
141 178
142 pdf_data_.resize(length); 179 pdf_data_.resize(length);
143 if (length != pdf_file.Read(0, pdf_data_.data(), pdf_data_.size())) 180 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(), 215 pdf_rendering_settings_.area.y(),
179 pdf_rendering_settings_.area.width(), 216 pdf_rendering_settings_.area.width(),
180 pdf_rendering_settings_.area.height(), true, false, true, true, 217 pdf_rendering_settings_.area.height(), true, false, true, true,
181 pdf_rendering_settings_.autorotate)) { 218 pdf_rendering_settings_.autorotate)) {
182 return false; 219 return false;
183 } 220 }
184 metafile.FinishPage(); 221 metafile.FinishPage();
185 metafile.FinishDocument(); 222 metafile.FinishDocument();
186 return metafile.SaveTo(&output_file); 223 return metafile.SaveTo(&output_file);
187 } 224 }
225
226 bool PrintingHandler::RenderPdfPageToPostScript(int page_number,
227 base::File output_file) {
228 Emf metafile;
229 metafile.Init();
230
231 // The underlying metafile is of type Emf and ignores the arguments passed
232 // to StartPage.
233 metafile.StartPage(gfx::Size(), gfx::Rect(), 1);
234 if (!chrome_pdf::RenderPDFPageToDC(
235 &pdf_data_.front(), pdf_data_.size(), page_number, metafile.context(),
236 pdf_rendering_settings_.dpi,
237 pdf_rendering_settings_.area.x() -
238 pdf_rendering_settings_.offsets.x(),
239 pdf_rendering_settings_.area.y() -
240 pdf_rendering_settings_.offsets.y(),
241 pdf_rendering_settings_.area.width(),
242 pdf_rendering_settings_.area.height(), true, false, true, true,
243 pdf_rendering_settings_.autorotate)) {
244 return false;
245 }
246 metafile.FinishPage();
247 metafile.FinishDocument();
248 return metafile.SaveTo(&output_file);
249 }
188 #endif // defined(OS_WIN) 250 #endif // defined(OS_WIN)
189 251
190 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) 252 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
191 bool PrintingHandler::RenderPDFPagesToPWGRaster( 253 bool PrintingHandler::RenderPDFPagesToPWGRaster(
192 base::File pdf_file, 254 base::File pdf_file,
193 const PdfRenderSettings& settings, 255 const PdfRenderSettings& settings,
194 const PwgRasterSettings& bitmap_settings, 256 const PwgRasterSettings& bitmap_settings,
195 base::File bitmap_file) { 257 base::File bitmap_file) {
196 base::File::Info info; 258 base::File::Info info;
197 if (!pdf_file.GetInfo(&info) || info.size <= 0 || 259 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, 364 if (print_backend->GetPrinterSemanticCapsAndDefaults(printer_name,
303 &printer_info)) { 365 &printer_info)) {
304 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded( 366 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded(
305 printer_name, printer_info)); 367 printer_name, printer_info));
306 } else { 368 } else {
307 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed( 369 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed(
308 printer_name)); 370 printer_name));
309 } 371 }
310 ReleaseProcessIfNeeded(); 372 ReleaseProcessIfNeeded();
311 } 373 }
312 #endif // ENABLE_PRINT_PREVIEW 374 #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW)
313 375
314 } // namespace printing 376 } // namespace printing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698