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 1ca9c94f4627ae2a1d24b09ca4ea12bcb5ef532c..ecd9ac50506ceae9f492ad95a6290c5f6f138fcc 100644 |
--- a/chrome/utility/chrome_content_utility_client.cc |
+++ b/chrome/utility/chrome_content_utility_client.cc |
@@ -170,7 +170,7 @@ class PdfFunctionsBase { |
const base::FilePath& pdf_module_path, |
const base::ScopedNativeLibrary& pdf_lib) { |
return true; |
- }; |
+ } |
private: |
// Exported by PDF plugin. |
@@ -365,6 +365,8 @@ bool ChromeContentUtilityClient::OnMessageReceived( |
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImageBase64, OnDecodeImageBase64) |
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafile, |
OnRenderPDFPagesToMetafile) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFToMetafile, |
+ OnRenderPDFToMetafile) |
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster, |
OnRenderPDFPagesToPWGRaster) |
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RobustJPEGDecodeImage, |
@@ -590,6 +592,69 @@ void ChromeContentUtilityClient::OnRenderPDFPagesToMetafile( |
ReleaseProcessIfNeeded(); |
} |
+#if defined(OS_WIN) |
+void ChromeContentUtilityClient::OnRenderPDFToMetafile( |
+ base::PlatformFile pdf_transit, |
+ const base::FilePath& metafile_path, |
+ const printing::PdfRenderSettings& settings) { |
+ base::PlatformFile pdf_file = |
+ IPC::PlatformFileForTransitToPlatformFile(pdf_transit); |
+ bool succeeded = false; |
+ int highest_rendered_page_number = -1; |
+ double scale_factor = 1.0; |
+ |
+ if (!g_pdf_lib.Get().IsValid()) |
+ return; |
+ |
+ DWORD length = ::GetFileSize(pdf_file, NULL); |
+ if (length == INVALID_FILE_SIZE) |
+ return; |
+ |
+ std::vector<uint8> buffer; |
+ buffer.resize(length); |
+ DWORD bytes_read = 0; |
+ if (!ReadFile(pdf_file, &buffer.front(), length, &bytes_read, NULL) || |
+ (bytes_read != length)) { |
+ return; |
+ } |
+ |
+ int total_page_count = 0; |
+ if (!g_pdf_lib.Get().GetPDFDocInfo(&buffer.front(), buffer.size(), |
+ &total_page_count, NULL)) { |
+ return; |
+ } |
+ |
+ for (int i = 0; i < total_page_count; ++i) { |
+ printing::Emf metafile; |
+ metafile.InitToFile( |
+ metafile_path.InsertBeforeExtensionASCII(base::StringPrintf(".%d", i))); |
+ scale_factor = gfx::CalculatePageScale( |
+ metafile.context(), settings.area().right(), settings.area().bottom()); |
+ gfx::ScaleDC(metafile.context(), scale_factor); |
+ metafile.StartPage(gfx::Size(), gfx::Rect(), 1); |
+ if (g_pdf_lib.Get().RenderPDFPageToDC( |
+ &buffer.front(), buffer.size(), i, metafile.context(), |
+ settings.dpi(), settings.dpi(), settings.area().x(), |
+ settings.area().y(), settings.area().width(), |
+ settings.area().height(), true, false, true, true, |
+ settings.autorotate())) { |
+ if (highest_rendered_page_number < i) |
+ highest_rendered_page_number = i; |
+ } |
+ metafile.FinishPage(); |
+ metafile.FinishDocument(); |
+ } |
+ |
+ if (highest_rendered_page_number >= 0) { |
+ Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Succeeded( |
+ highest_rendered_page_number, scale_factor)); |
Vitaly Buka (NO REVIEWS)
2014/05/14 03:51:18
Actually with this approach we could send success
|
+ } else { |
+ Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Failed()); |
+ } |
+ ReleaseProcessIfNeeded(); |
+} |
+#endif // defined(OS_WIN) |
+ |
void ChromeContentUtilityClient::OnRenderPDFPagesToPWGRaster( |
IPC::PlatformFileForTransit pdf_transit, |
const printing::PdfRenderSettings& settings, |