#include "pdf/pdf.h"
#include <stdint.h>
#include <optional>
#include <utility>
#include "base/check.h"
#include "base/feature_list.h"
#include "build/build_config.h"
#include "pdf/pdf_features.h"
#include "pdf/pdf_init.h"
#include "pdf/pdfium/pdfium_engine.h"
#include "pdf/pdfium/pdfium_engine_exports.h"
#include "services/screen_ai/buildflags/buildflags.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size_f.h"
#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
#include <memory>
#include "base/functional/callback.h"
#include "pdf/pdf_progressive_searchifier.h"
#include "services/screen_ai/public/mojom/screen_ai_service.mojom.h"
#include "third_party/skia/include/core/SkBitmap.h"
#endif
namespace chrome_pdf {
namespace {
std::optional<bool> g_use_skia_renderer_enabled_by_policy;
class ScopedSdkInitializer { … };
}
void SetUseSkiaRendererPolicy(bool use_skia) { … }
#if BUILDFLAG(IS_CHROMEOS)
std::optional<FlattenPdfResult> CreateFlattenedPdf(
base::span<const uint8_t> input_buffer) {
ScopedSdkInitializer scoped_sdk_initializer(false);
return PDFiumEngineExports::Get()->CreateFlattenedPdf(input_buffer);
}
#endif
#if BUILDFLAG(IS_WIN)
bool RenderPDFPageToDC(base::span<const uint8_t> pdf_buffer,
int page_index,
HDC dc,
int dpi_x,
int dpi_y,
int bounds_origin_x,
int bounds_origin_y,
int bounds_width,
int bounds_height,
bool fit_to_bounds,
bool stretch_to_bounds,
bool keep_aspect_ratio,
bool center_in_bounds,
bool autorotate,
bool use_color) {
ScopedSdkInitializer scoped_sdk_initializer(true);
PDFiumEngineExports* engine_exports = PDFiumEngineExports::Get();
PDFiumEngineExports::RenderingSettings settings(
gfx::Size(dpi_x, dpi_y),
gfx::Rect(bounds_origin_x, bounds_origin_y, bounds_width, bounds_height),
fit_to_bounds, stretch_to_bounds, keep_aspect_ratio, center_in_bounds,
autorotate, use_color, true);
return engine_exports->RenderPDFPageToDC(pdf_buffer, page_index, settings,
dc);
}
void SetPDFUsePrintMode(int mode) {
PDFiumEngineExports::Get()->SetPDFUsePrintMode(mode);
}
#endif
bool GetPDFDocInfo(base::span<const uint8_t> pdf_buffer,
int* page_count,
float* max_page_width) { … }
std::optional<DocumentMetadata> GetPDFDocMetadata(
base::span<const uint8_t> pdf_buffer) { … }
std::optional<bool> IsPDFDocTagged(base::span<const uint8_t> pdf_buffer) { … }
base::Value GetPDFStructTreeForPage(base::span<const uint8_t> pdf_buffer,
int page_index) { … }
std::optional<bool> PDFDocHasOutline(base::span<const uint8_t> pdf_buffer) { … }
std::optional<gfx::SizeF> GetPDFPageSizeByIndex(
base::span<const uint8_t> pdf_buffer,
int page_index) { … }
bool RenderPDFPageToBitmap(base::span<const uint8_t> pdf_buffer,
int page_index,
void* bitmap_buffer,
const gfx::Size& bitmap_size,
const gfx::Size& dpi,
const RenderOptions& options) { … }
std::vector<uint8_t> ConvertPdfPagesToNupPdf(
std::vector<base::span<const uint8_t>> input_buffers,
size_t pages_per_sheet,
const gfx::Size& page_size,
const gfx::Rect& printable_area) { … }
std::vector<uint8_t> ConvertPdfDocumentToNupPdf(
base::span<const uint8_t> input_buffer,
size_t pages_per_sheet,
const gfx::Size& page_size,
const gfx::Rect& printable_area) { … }
#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
std::vector<uint8_t> Searchify(
base::span<const uint8_t> pdf_buffer,
base::RepeatingCallback<screen_ai::mojom::VisualAnnotationPtr(
const SkBitmap& bitmap)> perform_ocr_callback) { … }
std::unique_ptr<PdfProgressiveSearchifier> CreateProgressiveSearchifier() { … }
#endif
}