OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |