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

Unified Diff: chrome/utility/chrome_content_utility_client.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/utility/chrome_content_utility_client.cc
diff --git a/chrome/utility/chrome_content_utility_client.cc b/chrome/utility/chrome_content_utility_client.cc
index 7390adb3e50d85838ae4d1e3f79037af7f2f7723..465698f4114aabc710ed665b5bf4133b6f829319 100644
--- a/chrome/utility/chrome_content_utility_client.cc
+++ b/chrome/utility/chrome_content_utility_client.cc
@@ -365,6 +365,8 @@ bool ChromeContentUtilityClient::OnMessageReceived(
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImageBase64, OnDecodeImageBase64)
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafile,
OnRenderPDFPagesToMetafile)
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafileHandles,
+ OnRenderPDFPagesToMetafileHandles)
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster,
OnRenderPDFPagesToPWGRaster)
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RobustJPEGDecodeImage,
@@ -590,6 +592,36 @@ void ChromeContentUtilityClient::OnRenderPDFPagesToMetafile(
ReleaseProcessIfNeeded();
}
+void ChromeContentUtilityClient::OnRenderPDFPagesToMetafileHandles(
+ IPC::PlatformFileForTransit pdf_transit,
+ IPC::PlatformFileForTransit metafile_transit,
+ const printing::PdfRenderSettings& settings,
+ const std::vector<printing::PageRange>& page_ranges) {
+ bool succeeded = false;
+#if defined(OS_WIN)
+ int highest_rendered_page_number = 0;
+ double scale_factor = 1.0;
+ base::PlatformFile pdf =
+ IPC::PlatformFileForTransitToPlatformFile(pdf_transit);
+ base::PlatformFile metafile =
+ IPC::PlatformFileForTransitToPlatformFile(metafile_transit);
+ succeeded = RenderPDFToWinMetafileHandles(pdf,
+ metafile,
+ settings,
+ page_ranges,
+ &highest_rendered_page_number,
+ &scale_factor);
+ if (succeeded) {
+ Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Succeeded(
+ highest_rendered_page_number, scale_factor));
+ }
+#endif // defined(OS_WIN)
+ if (!succeeded) {
+ Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Failed());
+ }
+ ReleaseProcessIfNeeded();
+}
+
void ChromeContentUtilityClient::OnRenderPDFPagesToPWGRaster(
IPC::PlatformFileForTransit pdf_transit,
const printing::PdfRenderSettings& settings,
@@ -615,6 +647,24 @@ bool ChromeContentUtilityClient::RenderPDFToWinMetafile(
const std::vector<printing::PageRange>& page_ranges,
int* highest_rendered_page_number,
double* scale_factor) {
+ base::File metafile;
+ metafile.Initialize(metafile_path,
+ base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_APPEND);
+ return RenderPDFToWinMetafileHandles(pdf_file,
+ metafile.GetPlatformFile(),
+ settings,
+ page_ranges,
+ highest_rendered_page_number,
+ scale_factor);
+}
+
+bool ChromeContentUtilityClient::RenderPDFToWinMetafileHandles(
+ base::PlatformFile pdf_file,
+ base::PlatformFile metafile_file,
+ const printing::PdfRenderSettings& settings,
+ const std::vector<printing::PageRange>& page_ranges,
+ int* highest_rendered_page_number,
+ double* scale_factor) {
*highest_rendered_page_number = -1;
*scale_factor = 1.0;
base::win::ScopedHandle file(pdf_file);
@@ -644,7 +694,7 @@ bool ChromeContentUtilityClient::RenderPDFToWinMetafile(
}
printing::Emf metafile;
- metafile.InitToFile(metafile_path);
+ metafile.Init();
// We need to scale down DC to fit an entire page into DC available area.
// Current metafile is based on screen DC and have current screen size.
// Writing outside of those boundaries will result in the cut-off output.
@@ -680,6 +730,13 @@ bool ChromeContentUtilityClient::RenderPDFToWinMetafile(
}
}
metafile.FinishDocument();
+
+ uint32 final_size = metafile.GetDataSize();
+ scoped_ptr<char[]> final_buffer(new char[final_size]);
+ CHECK(metafile.GetData(final_buffer.get(), final_size));
+ CHECK_EQ(static_cast<int>(final_size),
Vitaly Buka (NO REVIEWS) 2014/04/25 22:35:24 This could be huge, metafile keeps images uncompre
scottmg 2014/04/25 23:07:18 Sorry, I'm not sure what you mean here. You mean c
Vitaly Buka (NO REVIEWS) 2014/04/28 06:47:33 It's not about rasterize. You don't need to try t
Vitaly Buka (NO REVIEWS) 2014/04/28 06:49:07 base::WritePlatformFile -> base::WritePlatformFile
+ base::WritePlatformFile(
+ metafile_file, 0, final_buffer.get(), final_size));
return ret;
}
#endif // defined(OS_WIN)

Powered by Google App Engine
This is Rietveld 408576698