1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/utility/printing_handler.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/lazy_instance.h" 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/path_service.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/scoped_native_library.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/chrome_utility_printing_messages.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/utility/cloud_print/bitmap_image.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/utility/cloud_print/pwg_encoder.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/utility/utility_thread.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/page_range.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/pdf_render_settings.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_WIN) 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/win/iat_patch_function.h" 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/emf_win.h" 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/gfx/gdi_util.h" 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_FULL_PRINTING) 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/crash_keys.h" 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/backend/print_backend.h" 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace { 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool Send(IPC::Message* message) { 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return content::UtilityThread::Get()->Send(message); 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ReleaseProcessIfNeeded() { 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class PdfFunctionsBase { 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PdfFunctionsBase() : render_pdf_to_bitmap_func_(NULL), 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) get_pdf_doc_info_func_(NULL) {} 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool Init() { 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath pdf_module_path; 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf_module_path) || 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) !base::PathExists(pdf_module_path)) { 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pdf_lib_.Reset(base::LoadNativeLibrary(pdf_module_path, NULL)); 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!pdf_lib_.is_valid()) { 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LOG(WARNING) << "Couldn't load PDF plugin"; 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) render_pdf_to_bitmap_func_ = 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) reinterpret_cast<RenderPDFPageToBitmapProc>( 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pdf_lib_.GetFunctionPointer("RenderPDFPageToBitmap")); 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LOG_IF(WARNING, !render_pdf_to_bitmap_func_) << 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "Missing RenderPDFPageToBitmap"; 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) get_pdf_doc_info_func_ = 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) reinterpret_cast<GetPDFDocInfoProc>( 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pdf_lib_.GetFunctionPointer("GetPDFDocInfo")); 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LOG_IF(WARNING, !get_pdf_doc_info_func_) << "Missing GetPDFDocInfo"; 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!render_pdf_to_bitmap_func_ || !get_pdf_doc_info_func_ || 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) !PlatformInit(pdf_module_path, pdf_lib_)) { 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Reset(); 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return IsValid(); 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool IsValid() const { 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return pdf_lib_.is_valid(); 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void Reset() { 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pdf_lib_.Reset(NULL); 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool RenderPDFPageToBitmap(const void* pdf_buffer, 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int pdf_buffer_size, 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int page_number, 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void* bitmap_buffer, 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int bitmap_width, 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int bitmap_height, 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int dpi_x, 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int dpi_y, 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool autorotate) { 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!render_pdf_to_bitmap_func_) 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return render_pdf_to_bitmap_func_(pdf_buffer, pdf_buffer_size, page_number, 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bitmap_buffer, bitmap_width, 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bitmap_height, dpi_x, dpi_y, autorotate); 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool GetPDFDocInfo(const void* pdf_buffer, 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int buffer_size, 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int* page_count, 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) double* max_page_width) { 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!get_pdf_doc_info_func_) 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return get_pdf_doc_info_func_(pdf_buffer, buffer_size, page_count, 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) max_page_width); 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected: 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual bool PlatformInit( 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& pdf_module_path, 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::ScopedNativeLibrary& pdf_lib) { 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Exported by PDF plugin. 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) typedef bool (*RenderPDFPageToBitmapProc)(const void* pdf_buffer, 121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int pdf_buffer_size, 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int page_number, 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void* bitmap_buffer, 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int bitmap_width, 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int bitmap_height, 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int dpi_x, 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int dpi_y, 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool autorotate); 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) typedef bool (*GetPDFDocInfoProc)(const void* pdf_buffer, 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int buffer_size, int* page_count, 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) double* max_page_width); 132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderPDFPageToBitmapProc render_pdf_to_bitmap_func_; 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetPDFDocInfoProc get_pdf_doc_info_func_; 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::ScopedNativeLibrary pdf_lib_; 137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PdfFunctionsBase); 138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_WIN) 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// The 2 below IAT patch functions are almost identical to the code in 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// render_process_impl.cc. This is needed to work around specific Windows APIs 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// used by the Chrome PDF plugin that will fail in the sandbox. 144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)static base::win::IATPatchFunction g_iat_patch_createdca; 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)HDC WINAPI UtilityProcess_CreateDCAPatch(LPCSTR driver_name, 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LPCSTR device_name, 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LPCSTR output, 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const DEVMODEA* init_data) { 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (driver_name && (std::string("DISPLAY") == driver_name)) { 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // CreateDC fails behind the sandbox, but not CreateCompatibleDC. 151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return CreateCompatibleDC(NULL); 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NOTREACHED(); 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return CreateDCA(driver_name, device_name, output, init_data); 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)static base::win::IATPatchFunction g_iat_patch_get_font_data; 159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)DWORD WINAPI UtilityProcess_GetFontDataPatch( 160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) HDC hdc, DWORD table, DWORD offset, LPVOID buffer, DWORD length) { 161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int rv = GetFontData(hdc, table, offset, buffer, length); 162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (rv == GDI_ERROR && hdc) { 163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) HFONT font = static_cast<HFONT>(GetCurrentObject(hdc, OBJ_FONT)); 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LOGFONT logfont; 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (GetObject(font, sizeof(LOGFONT), &logfont)) { 167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::UtilityThread::Get()->PreCacheFont(logfont); 168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) rv = GetFontData(hdc, table, offset, buffer, length); 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::UtilityThread::Get()->ReleaseCachedFonts(); 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return rv; 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class PdfFunctionsWin : public PdfFunctionsBase { 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PdfFunctionsWin() : render_pdf_to_dc_func_(NULL) { 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool PlatformInit( 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& pdf_module_path, 182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::ScopedNativeLibrary& pdf_lib) OVERRIDE { 183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Patch the IAT for handling specific APIs known to fail in the sandbox. 184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!g_iat_patch_createdca.is_patched()) { 185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) g_iat_patch_createdca.Patch(pdf_module_path.value().c_str(), 186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "gdi32.dll", "CreateDCA", 187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UtilityProcess_CreateDCAPatch); 188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!g_iat_patch_get_font_data.is_patched()) { 191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) g_iat_patch_get_font_data.Patch(pdf_module_path.value().c_str(), 192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "gdi32.dll", "GetFontData", 193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UtilityProcess_GetFontDataPatch); 194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) render_pdf_to_dc_func_ = 196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) reinterpret_cast<RenderPDFPageToDCProc>( 197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pdf_lib.GetFunctionPointer("RenderPDFPageToDC")); 198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LOG_IF(WARNING, !render_pdf_to_dc_func_) << "Missing RenderPDFPageToDC"; 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return render_pdf_to_dc_func_ != NULL; 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool RenderPDFPageToDC(const void* pdf_buffer, 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int buffer_size, 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int page_number, 206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) HDC dc, 207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int dpi_x, 208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int dpi_y, 209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int bounds_origin_x, 210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int bounds_origin_y, 211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int bounds_width, 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int bounds_height, 213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool fit_to_bounds, 214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool stretch_to_bounds, 215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool keep_aspect_ratio, 216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool center_in_bounds, 217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool autorotate) { 218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!render_pdf_to_dc_func_) 219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return render_pdf_to_dc_func_(pdf_buffer, buffer_size, page_number, 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) dc, dpi_x, dpi_y, bounds_origin_x, 222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bounds_origin_y, bounds_width, bounds_height, 223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) fit_to_bounds, stretch_to_bounds, 224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) keep_aspect_ratio, center_in_bounds, 225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) autorotate); 226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Exported by PDF plugin. 230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) typedef bool (*RenderPDFPageToDCProc)( 231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const void* pdf_buffer, int buffer_size, int page_number, HDC dc, 232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int dpi_x, int dpi_y, int bounds_origin_x, int bounds_origin_y, 233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int bounds_width, int bounds_height, bool fit_to_bounds, 234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool stretch_to_bounds, bool keep_aspect_ratio, bool center_in_bounds, 235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool autorotate); 236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderPDFPageToDCProc render_pdf_to_dc_func_; 237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PdfFunctionsWin); 239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef PdfFunctionsWin PdfFunctions; 242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else // OS_WIN 243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef PdfFunctionsBase PdfFunctions; 244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // OS_WIN 245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::LazyInstance<PdfFunctions> g_pdf_lib = LAZY_INSTANCE_INITIALIZER; 247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace 249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)PrintingHandler::PrintingHandler() {} 251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)PrintingHandler::~PrintingHandler() {} 253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static 255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintingHandler::PreSandboxStartup() { 256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) g_pdf_lib.Get().Init(); 257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool PrintingHandler::OnMessageReceived(const IPC::Message& message) { 260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool handled = true; 261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PrintingHandler, message) 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN) 263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles, 264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnRenderPDFPagesToMetafile) 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage, 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnRenderPDFPagesToMetafileGetPage) 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop, 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnRenderPDFPagesToMetafileStop) 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // OS_WIN 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_FULL_PRINTING) 271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster, 272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnRenderPDFPagesToPWGRaster) 273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterCapsAndDefaults, 274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnGetPrinterCapsAndDefaults) 275f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterSemanticCapsAndDefaults, 276f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnGetPrinterSemanticCapsAndDefaults) 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // ENABLE_FULL_PRINTING 278f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC_END_MESSAGE_MAP() 280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return handled; 281f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN) 284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintingHandler::OnRenderPDFPagesToMetafile( 285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC::PlatformFileForTransit pdf_transit, 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const printing::PdfRenderSettings& settings) { 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf_rendering_settings_ = settings; 288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit); 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int page_count = LoadPDF(pdf_file.Pass()); 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send( 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount(page_count)); 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PrintingHandler::OnRenderPDFPagesToMetafileGetPage( 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int page_number, 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC::PlatformFileForTransit output_file) { 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::File emf_file = IPC::PlatformFileForTransitToFile(output_file); 298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) double scale_factor = 1.0; 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool success = 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderPdfPageToMetafile(page_number, emf_file.Pass(), &scale_factor); 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone( 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci success, scale_factor)); 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PrintingHandler::OnRenderPDFPagesToMetafileStop() { 306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ReleaseProcessIfNeeded(); 307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // OS_WIN 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_FULL_PRINTING) 312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintingHandler::OnRenderPDFPagesToPWGRaster( 313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC::PlatformFileForTransit pdf_transit, 314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const printing::PdfRenderSettings& settings, 315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const printing::PwgRasterSettings& bitmap_settings, 316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC::PlatformFileForTransit bitmap_transit) { 317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::File pdf = IPC::PlatformFileForTransitToFile(pdf_transit); 318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::File bitmap = IPC::PlatformFileForTransitToFile(bitmap_transit); 319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (RenderPDFPagesToPWGRaster(pdf.Pass(), settings, bitmap_settings, 320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bitmap.Pass())) { 321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Succeeded()); 322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed()); 324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ReleaseProcessIfNeeded(); 326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // ENABLE_FULL_PRINTING 328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN) 3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint PrintingHandler::LoadPDF(base::File pdf_file) { 331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!g_pdf_lib.Get().IsValid()) 3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int64 length = pdf_file.GetLength(); 335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (length < 0) 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf_data_.resize(length); 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (length != pdf_file.Read(0, pdf_data_.data(), pdf_data_.size())) 3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int total_page_count = 0; 3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!g_pdf_lib.Get().GetPDFDocInfo( 3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &pdf_data_.front(), pdf_data_.size(), &total_page_count, NULL)) { 3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return total_page_count; 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool PrintingHandler::RenderPdfPageToMetafile(int page_number, 3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::File output_file, 3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci double* scale_factor) { 3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci printing::Emf metafile; 3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metafile.Init(); 3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // We need to scale down DC to fit an entire page into DC available area. 3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Current metafile is based on screen DC and have current screen size. 3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Writing outside of those boundaries will result in the cut-off output. 3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // On metafiles (this is the case here), scaling down will still record 3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // original coordinates and we'll be able to print in full resolution. 3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Before playback we'll need to counter the scaling up that will happen 3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // in the service (print_system_win.cc). 3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *scale_factor = 3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::CalculatePageScale(metafile.context(), 3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf_rendering_settings_.area().right(), 3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf_rendering_settings_.area().bottom()); 3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::ScaleDC(metafile.context(), *scale_factor); 3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The underlying metafile is of type Emf and ignores the arguments passed 3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // to StartPage. 3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metafile.StartPage(gfx::Size(), gfx::Rect(), 1); 3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!g_pdf_lib.Get().RenderPDFPageToDC( 3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &pdf_data_.front(), 3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf_data_.size(), 3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci page_number, 3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metafile.context(), 3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf_rendering_settings_.dpi(), 3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf_rendering_settings_.dpi(), 3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf_rendering_settings_.area().x(), 3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf_rendering_settings_.area().y(), 3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf_rendering_settings_.area().width(), 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf_rendering_settings_.area().height(), 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf_rendering_settings_.autorotate())) { 3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metafile.FinishPage(); 3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metafile.FinishDocument(); 3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return metafile.SaveTo(&output_file); 393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 394f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // OS_WIN 3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_FULL_PRINTING) 398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool PrintingHandler::RenderPDFPagesToPWGRaster( 399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::File pdf_file, 400f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const printing::PdfRenderSettings& settings, 401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const printing::PwgRasterSettings& bitmap_settings, 402f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::File bitmap_file) { 403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool autoupdate = true; 404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!g_pdf_lib.Get().IsValid()) 405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::File::Info info; 408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!pdf_file.GetInfo(&info) || info.size <= 0) 409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string data(info.size, 0); 412f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int data_size = pdf_file.Read(0, &data[0], data.size()); 413f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (data_size != static_cast<int>(data.size())) 414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 415f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int total_page_count = 0; 417f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!g_pdf_lib.Get().GetPDFDocInfo(data.data(), data.size(), 418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &total_page_count, NULL)) { 419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cloud_print::PwgEncoder encoder; 423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string pwg_header; 424f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) encoder.EncodeDocumentHeader(&pwg_header); 425f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int bytes_written = bitmap_file.WriteAtCurrentPos(pwg_header.data(), 426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pwg_header.size()); 427f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (bytes_written != static_cast<int>(pwg_header.size())) 428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 429f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 430f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cloud_print::BitmapImage image(settings.area().size(), 431f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cloud_print::BitmapImage::BGRA); 432f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (int i = 0; i < total_page_count; ++i) { 433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int page_number = i; 434f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (bitmap_settings.reverse_page_order) { 436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) page_number = total_page_count - 1 - page_number; 437f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 439f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!g_pdf_lib.Get().RenderPDFPageToBitmap(data.data(), 440f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.size(), 441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) page_number, 442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) image.pixel_data(), 443f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) image.size().width(), 444f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) image.size().height(), 445f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) settings.dpi(), 446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) settings.dpi(), 447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) autoupdate)) { 448f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 450f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cloud_print::PwgHeaderInfo header_info; 452f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) header_info.dpi = settings.dpi(); 453f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) header_info.total_pages = total_page_count; 454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Transform odd pages. 456f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (page_number % 2) { 457f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (bitmap_settings.odd_page_transform) { 458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case printing::TRANSFORM_NORMAL: 459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) break; 460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case printing::TRANSFORM_ROTATE_180: 461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) header_info.flipx = true; 462f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) header_info.flipy = true; 463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) break; 464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case printing::TRANSFORM_FLIP_HORIZONTAL: 465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) header_info.flipx = true; 466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) break; 467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case printing::TRANSFORM_FLIP_VERTICAL: 468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) header_info.flipy = true; 469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) break; 470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (bitmap_settings.rotate_all_pages) { 474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) header_info.flipx = !header_info.flipx; 475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) header_info.flipy = !header_info.flipy; 476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string pwg_page; 479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!encoder.EncodePage(image, header_info, &pwg_page)) 480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bytes_written = bitmap_file.WriteAtCurrentPos(pwg_page.data(), 482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pwg_page.size()); 483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (bytes_written != static_cast<int>(pwg_page.size())) 484f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintingHandler::OnGetPrinterCapsAndDefaults( 490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& printer_name) { 491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<printing::PrintBackend> print_backend = 492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printing::PrintBackend::CreateInstance(NULL); 493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printing::PrinterCapsAndDefaults printer_info; 494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) crash_keys::ScopedPrinterInfo crash_key( 496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) print_backend->GetPrinterDriverInfo(printer_name)); 497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (print_backend->GetPrinterCapsAndDefaults(printer_name, &printer_info)) { 499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Send(new ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Succeeded( 500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printer_name, printer_info)); 501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Send(new ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Failed( 503f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printer_name)); 504f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 505f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ReleaseProcessIfNeeded(); 506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintingHandler::OnGetPrinterSemanticCapsAndDefaults( 509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& printer_name) { 510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<printing::PrintBackend> print_backend = 511f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printing::PrintBackend::CreateInstance(NULL); 512f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printing::PrinterSemanticCapsAndDefaults printer_info; 513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 514f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) crash_keys::ScopedPrinterInfo crash_key( 515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) print_backend->GetPrinterDriverInfo(printer_name)); 516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (print_backend->GetPrinterSemanticCapsAndDefaults(printer_name, 518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &printer_info)) { 519f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded( 520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printer_name, printer_info)); 521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed( 523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printer_name)); 524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ReleaseProcessIfNeeded(); 526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // ENABLE_FULL_PRINTING 528