pdf.cc 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // Copyright (c) 2010 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "pdf/pdf.h"
  5. #include <stdint.h>
  6. #include <utility>
  7. #include "build/build_config.h"
  8. #include "pdf/pdf_engine.h"
  9. #include "pdf/pdf_init.h"
  10. #include "ui/gfx/geometry/rect.h"
  11. #include "ui/gfx/geometry/size_f.h"
  12. namespace chrome_pdf {
  13. namespace {
  14. class ScopedSdkInitializer {
  15. public:
  16. explicit ScopedSdkInitializer(bool enable_v8) {
  17. if (!IsSDKInitializedViaPlugin())
  18. InitializeSDK(enable_v8, FontMappingMode::kNoMapping);
  19. }
  20. ScopedSdkInitializer(const ScopedSdkInitializer&) = delete;
  21. ScopedSdkInitializer& operator=(const ScopedSdkInitializer&) = delete;
  22. ~ScopedSdkInitializer() {
  23. if (!IsSDKInitializedViaPlugin())
  24. ShutdownSDK();
  25. }
  26. };
  27. } // namespace
  28. #if BUILDFLAG(IS_CHROMEOS)
  29. std::vector<uint8_t> CreateFlattenedPdf(
  30. base::span<const uint8_t> input_buffer) {
  31. ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/false);
  32. return PDFEngineExports::Get()->CreateFlattenedPdf(input_buffer);
  33. }
  34. #endif // BUILDFLAG(IS_CHROMEOS)
  35. #if BUILDFLAG(IS_WIN)
  36. bool RenderPDFPageToDC(base::span<const uint8_t> pdf_buffer,
  37. int page_number,
  38. HDC dc,
  39. int dpi_x,
  40. int dpi_y,
  41. int bounds_origin_x,
  42. int bounds_origin_y,
  43. int bounds_width,
  44. int bounds_height,
  45. bool fit_to_bounds,
  46. bool stretch_to_bounds,
  47. bool keep_aspect_ratio,
  48. bool center_in_bounds,
  49. bool autorotate,
  50. bool use_color) {
  51. ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/true);
  52. PDFEngineExports* engine_exports = PDFEngineExports::Get();
  53. PDFEngineExports::RenderingSettings settings(
  54. gfx::Size(dpi_x, dpi_y),
  55. gfx::Rect(bounds_origin_x, bounds_origin_y, bounds_width, bounds_height),
  56. fit_to_bounds, stretch_to_bounds, keep_aspect_ratio, center_in_bounds,
  57. autorotate, use_color, /*render_for_printing=*/true);
  58. return engine_exports->RenderPDFPageToDC(pdf_buffer, page_number, settings,
  59. dc);
  60. }
  61. void SetPDFUsePrintMode(int mode) {
  62. PDFEngineExports::Get()->SetPDFUsePrintMode(mode);
  63. }
  64. #endif // BUILDFLAG(IS_WIN)
  65. bool GetPDFDocInfo(base::span<const uint8_t> pdf_buffer,
  66. int* page_count,
  67. float* max_page_width) {
  68. ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/true);
  69. PDFEngineExports* engine_exports = PDFEngineExports::Get();
  70. return engine_exports->GetPDFDocInfo(pdf_buffer, page_count, max_page_width);
  71. }
  72. absl::optional<bool> IsPDFDocTagged(base::span<const uint8_t> pdf_buffer) {
  73. ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/true);
  74. PDFEngineExports* engine_exports = PDFEngineExports::Get();
  75. return engine_exports->IsPDFDocTagged(pdf_buffer);
  76. }
  77. base::Value GetPDFStructTreeForPage(base::span<const uint8_t> pdf_buffer,
  78. int page_index) {
  79. ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/true);
  80. PDFEngineExports* engine_exports = PDFEngineExports::Get();
  81. return engine_exports->GetPDFStructTreeForPage(pdf_buffer, page_index);
  82. }
  83. absl::optional<gfx::SizeF> GetPDFPageSizeByIndex(
  84. base::span<const uint8_t> pdf_buffer,
  85. int page_number) {
  86. ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/true);
  87. chrome_pdf::PDFEngineExports* engine_exports =
  88. chrome_pdf::PDFEngineExports::Get();
  89. return engine_exports->GetPDFPageSizeByIndex(pdf_buffer, page_number);
  90. }
  91. bool RenderPDFPageToBitmap(base::span<const uint8_t> pdf_buffer,
  92. int page_number,
  93. void* bitmap_buffer,
  94. const gfx::Size& bitmap_size,
  95. const gfx::Size& dpi,
  96. const RenderOptions& options) {
  97. ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/true);
  98. PDFEngineExports* engine_exports = PDFEngineExports::Get();
  99. PDFEngineExports::RenderingSettings settings(
  100. dpi, gfx::Rect(bitmap_size),
  101. /*fit_to_bounds=*/true, options.stretch_to_bounds,
  102. options.keep_aspect_ratio,
  103. /*center_in_bounds=*/true, options.autorotate, options.use_color,
  104. options.render_device_type == RenderDeviceType::kPrinter);
  105. return engine_exports->RenderPDFPageToBitmap(pdf_buffer, page_number,
  106. settings, bitmap_buffer);
  107. }
  108. std::vector<uint8_t> ConvertPdfPagesToNupPdf(
  109. std::vector<base::span<const uint8_t>> input_buffers,
  110. size_t pages_per_sheet,
  111. const gfx::Size& page_size,
  112. const gfx::Rect& printable_area) {
  113. ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/false);
  114. PDFEngineExports* engine_exports = PDFEngineExports::Get();
  115. return engine_exports->ConvertPdfPagesToNupPdf(
  116. std::move(input_buffers), pages_per_sheet, page_size, printable_area);
  117. }
  118. std::vector<uint8_t> ConvertPdfDocumentToNupPdf(
  119. base::span<const uint8_t> input_buffer,
  120. size_t pages_per_sheet,
  121. const gfx::Size& page_size,
  122. const gfx::Rect& printable_area) {
  123. ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/false);
  124. PDFEngineExports* engine_exports = PDFEngineExports::Get();
  125. return engine_exports->ConvertPdfDocumentToNupPdf(
  126. input_buffer, pages_per_sheet, page_size, printable_area);
  127. }
  128. } // namespace chrome_pdf