Index: chrome/utility/printing_handler.cc |
diff --git a/chrome/utility/printing_handler.cc b/chrome/utility/printing_handler.cc |
index 390cd39b2f6b26e023c3e1418966cfba17c690a7..6e97c7b29572b91cdf06502a5c34fb73007a3c2c 100644 |
--- a/chrome/utility/printing_handler.cc |
+++ b/chrome/utility/printing_handler.cc |
@@ -89,8 +89,16 @@ void PrintingHandler::OnRenderPDFPagesToMetafile( |
IPC::PlatformFileForTransit pdf_transit, |
const PdfRenderSettings& settings) { |
pdf_rendering_settings_ = settings; |
+ chrome_pdf::SetPDFPostscriptPrintingLevel(0); // Not using postscript. |
chrome_pdf::SetPDFUseGDIPrinting(pdf_rendering_settings_.mode == |
PdfRenderSettings::Mode::GDI_TEXT); |
+ if (pdf_rendering_settings_.mode == |
+ PdfRenderSettings::Mode::POSTSCRIPT_LEVEL2) { |
+ chrome_pdf::SetPDFPostscriptPrintingLevel(2); |
+ } else if (pdf_rendering_settings_.mode == |
+ PdfRenderSettings::Mode::POSTSCRIPT_LEVEL3) { |
+ chrome_pdf::SetPDFPostscriptPrintingLevel(3); |
+ } |
base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit); |
int page_count = LoadPDF(std::move(pdf_file)); |
Send( |
@@ -102,8 +110,12 @@ void PrintingHandler::OnRenderPDFPagesToMetafileGetPage( |
IPC::PlatformFileForTransit output_file) { |
base::File emf_file = IPC::PlatformFileForTransitToFile(output_file); |
float scale_factor = 1.0f; |
- bool success = |
- RenderPdfPageToMetafile(page_number, std::move(emf_file), &scale_factor); |
+ bool postscript = pdf_rendering_settings_.mode == |
+ PdfRenderSettings::Mode::POSTSCRIPT_LEVEL2 || |
+ pdf_rendering_settings_.mode == |
+ PdfRenderSettings::Mode::POSTSCRIPT_LEVEL3; |
+ bool success = RenderPdfPageToMetafile(page_number, std::move(emf_file), |
+ &scale_factor, postscript); |
Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone( |
success, scale_factor)); |
} |
@@ -112,7 +124,7 @@ void PrintingHandler::OnRenderPDFPagesToMetafileStop() { |
ReleaseProcessIfNeeded(); |
} |
-#endif // OS_WIN |
+#endif // defined(OS_WIN) |
#if BUILDFLAG(ENABLE_PRINT_PREVIEW) |
void PrintingHandler::OnRenderPDFPagesToPWGRaster( |
@@ -130,7 +142,7 @@ void PrintingHandler::OnRenderPDFPagesToPWGRaster( |
} |
ReleaseProcessIfNeeded(); |
} |
-#endif // ENABLE_PRINT_PREVIEW |
+#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) |
#if defined(OS_WIN) |
int PrintingHandler::LoadPDF(base::File pdf_file) { |
@@ -153,7 +165,8 @@ int PrintingHandler::LoadPDF(base::File pdf_file) { |
bool PrintingHandler::RenderPdfPageToMetafile(int page_number, |
base::File output_file, |
- float* scale_factor) { |
+ float* scale_factor, |
+ bool postscript) { |
Emf metafile; |
metafile.Init(); |
@@ -164,18 +177,30 @@ bool PrintingHandler::RenderPdfPageToMetafile(int page_number, |
// original coordinates and we'll be able to print in full resolution. |
// Before playback we'll need to counter the scaling up that will happen |
// in the service (print_system_win.cc). |
- *scale_factor = gfx::CalculatePageScale( |
- metafile.context(), pdf_rendering_settings_.area.right(), |
- pdf_rendering_settings_.area.bottom()); |
- gfx::ScaleDC(metafile.context(), *scale_factor); |
+ // |
+ // The postscript driver does not use the metafile size since it outputs |
+ // postscript rather than a metafile. Instead it uses the printable area |
+ // sent to RenderPDFPageToDC to determine the area to render. Therefore, |
+ // don't scale the DC to match the metafile, and send the printer physical |
+ // offsets to the driver. |
+ if (!postscript) { |
+ *scale_factor = gfx::CalculatePageScale( |
+ metafile.context(), pdf_rendering_settings_.area.right(), |
+ pdf_rendering_settings_.area.bottom()); |
+ gfx::ScaleDC(metafile.context(), *scale_factor); |
+ } |
// The underlying metafile is of type Emf and ignores the arguments passed |
// to StartPage. |
metafile.StartPage(gfx::Size(), gfx::Rect(), 1); |
+ int offset_x = postscript ? pdf_rendering_settings_.offsets.x() : 0; |
+ int offset_y = postscript ? pdf_rendering_settings_.offsets.y() : 0; |
+ |
if (!chrome_pdf::RenderPDFPageToDC( |
&pdf_data_.front(), pdf_data_.size(), page_number, metafile.context(), |
- pdf_rendering_settings_.dpi, pdf_rendering_settings_.area.x(), |
- pdf_rendering_settings_.area.y(), |
+ pdf_rendering_settings_.dpi, |
+ pdf_rendering_settings_.area.x() - offset_x, |
+ pdf_rendering_settings_.area.y() - offset_y, |
pdf_rendering_settings_.area.width(), |
pdf_rendering_settings_.area.height(), true, false, true, true, |
pdf_rendering_settings_.autorotate)) { |
@@ -309,6 +334,6 @@ void PrintingHandler::OnGetPrinterSemanticCapsAndDefaults( |
} |
ReleaseProcessIfNeeded(); |
} |
-#endif // ENABLE_PRINT_PREVIEW |
+#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) |
} // namespace printing |