arc: Use PrintRenderer to render a preview document
When printing from an ARC app, use the provided PrintRenderer to render a preview document for pint preview. Also, flatten the preview document received from ARC before displaying it in print preview. Bug: b:140576300 Test: Print from an ARC app and verify a preview document is displayed Change-Id: Iae7dcb2184afea51300f2d68edf3af40e55e6f13 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1853324 Reviewed-by: Daniel Cheng <dcheng@chromium.org> Reviewed-by: Brian White <bcwhite@chromium.org> Reviewed-by: Yusuke Sato <yusukes@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Jesse Schettler <jschettler@chromium.org> Cr-Commit-Position: refs/heads/master@{#713013}
This commit is contained in:

committed by
Commit Bot

parent
6ad2f520d9
commit
a092a99c42
@ -34,6 +34,14 @@ class ScopedSdkInitializer {
|
||||
|
||||
} // namespace
|
||||
|
||||
#if defined(OS_CHROMEOS)
|
||||
std::vector<uint8_t> CreateFlattenedPdf(
|
||||
base::span<const uint8_t> input_buffer) {
|
||||
ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/false);
|
||||
return PDFEngineExports::Get()->CreateFlattenedPdf(input_buffer);
|
||||
}
|
||||
#endif // defined(OS_CHROMEOS)
|
||||
|
||||
#if defined(OS_WIN)
|
||||
bool RenderPDFPageToDC(base::span<const uint8_t> pdf_buffer,
|
||||
int page_number,
|
||||
|
@ -27,6 +27,13 @@ class Size;
|
||||
|
||||
namespace chrome_pdf {
|
||||
|
||||
#if defined(OS_CHROMEOS)
|
||||
// Create a flattened PDF document from an existing PDF document.
|
||||
// |input_buffer| is the buffer that contains the entire PDF document to be
|
||||
// flattened.
|
||||
std::vector<uint8_t> CreateFlattenedPdf(base::span<const uint8_t> input_buffer);
|
||||
#endif // defined(OS_CHROMEOS)
|
||||
|
||||
#if defined(OS_WIN)
|
||||
// Printing modes - type to convert PDF to for printing
|
||||
enum PrintingMode {
|
||||
|
@ -474,6 +474,12 @@ class PDFEngineExports {
|
||||
|
||||
static PDFEngineExports* Get();
|
||||
|
||||
#if defined(OS_CHROMEOS)
|
||||
// See the definition of CreateFlattenedPdf in pdf.cc for details.
|
||||
virtual std::vector<uint8_t> CreateFlattenedPdf(
|
||||
base::span<const uint8_t> input_buffer) = 0;
|
||||
#endif // defined(OS_CHROMEOS)
|
||||
|
||||
#if defined(OS_WIN)
|
||||
// See the definition of RenderPDFPageToDC in pdf.cc for details.
|
||||
virtual bool RenderPDFPageToDC(base::span<const uint8_t> pdf_buffer,
|
||||
|
@ -161,6 +161,16 @@ PDFiumEngineExports::PDFiumEngineExports() {}
|
||||
|
||||
PDFiumEngineExports::~PDFiumEngineExports() {}
|
||||
|
||||
#if defined(OS_CHROMEOS)
|
||||
std::vector<uint8_t> PDFiumEngineExports::CreateFlattenedPdf(
|
||||
base::span<const uint8_t> input_buffer) {
|
||||
ScopedFPDFDocument doc = LoadPdfData(input_buffer);
|
||||
if (!doc)
|
||||
return std::vector<uint8_t>();
|
||||
return PDFiumPrint::CreateFlattenedPdf(std::move(doc));
|
||||
}
|
||||
#endif // defined(OS_CHROMEOS)
|
||||
|
||||
#if defined(OS_WIN)
|
||||
bool PDFiumEngineExports::RenderPDFPageToDC(
|
||||
base::span<const uint8_t> pdf_buffer,
|
||||
|
@ -19,6 +19,10 @@ class PDFiumEngineExports : public PDFEngineExports {
|
||||
~PDFiumEngineExports() override;
|
||||
|
||||
// PDFEngineExports:
|
||||
#if defined(OS_CHROMEOS)
|
||||
std::vector<uint8_t> CreateFlattenedPdf(
|
||||
base::span<const uint8_t> input_buffer) override;
|
||||
#endif // defined(OS_CHROMEOS)
|
||||
#if defined(OS_WIN)
|
||||
bool RenderPDFPageToDC(base::span<const uint8_t> pdf_buffer,
|
||||
int page_number,
|
||||
|
@ -254,12 +254,34 @@ std::string GetPageRangeStringFromRange(
|
||||
return page_number_str;
|
||||
}
|
||||
|
||||
bool FlattenPrintData(FPDF_DOCUMENT doc) {
|
||||
DCHECK(doc);
|
||||
|
||||
int page_count = FPDF_GetPageCount(doc);
|
||||
for (int i = 0; i < page_count; ++i) {
|
||||
ScopedFPDFPage page(FPDF_LoadPage(doc, i));
|
||||
DCHECK(page);
|
||||
if (FPDFPage_Flatten(page.get(), FLAT_PRINT) == FLATTEN_FAIL)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
PDFiumPrint::PDFiumPrint(PDFiumEngine* engine) : engine_(engine) {}
|
||||
|
||||
PDFiumPrint::~PDFiumPrint() = default;
|
||||
|
||||
#if defined(OS_CHROMEOS)
|
||||
// static
|
||||
std::vector<uint8_t> PDFiumPrint::CreateFlattenedPdf(ScopedFPDFDocument doc) {
|
||||
if (!FlattenPrintData(doc.get()))
|
||||
return std::vector<uint8_t>();
|
||||
return ConvertDocToBuffer(std::move(doc));
|
||||
}
|
||||
#endif // defined(OS_CHROMEOS)
|
||||
|
||||
// static
|
||||
std::vector<uint32_t> PDFiumPrint::GetPageNumbersFromPrintPageNumberRange(
|
||||
const PP_PrintPageNumberRange_Dev* page_ranges,
|
||||
@ -477,17 +499,4 @@ ScopedFPDFDocument PDFiumPrint::CreateSinglePageRasterPdf(
|
||||
return temp_doc;
|
||||
}
|
||||
|
||||
bool PDFiumPrint::FlattenPrintData(FPDF_DOCUMENT doc) const {
|
||||
DCHECK(doc);
|
||||
|
||||
int page_count = FPDF_GetPageCount(doc);
|
||||
for (int i = 0; i < page_count; ++i) {
|
||||
ScopedFPDFPage page(FPDF_LoadPage(doc, i));
|
||||
DCHECK(page);
|
||||
if (FPDFPage_Flatten(page.get(), FLAT_PRINT) == FLATTEN_FAIL)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace chrome_pdf
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include <vector>
|
||||
|
||||
#include "base/macros.h"
|
||||
#include "build/build_config.h"
|
||||
#include "third_party/pdfium/public/cpp/fpdf_scopers.h"
|
||||
#include "third_party/pdfium/public/fpdfview.h"
|
||||
|
||||
@ -29,6 +30,13 @@ class PDFiumPrint {
|
||||
explicit PDFiumPrint(PDFiumEngine* engine);
|
||||
~PDFiumPrint();
|
||||
|
||||
#if defined(OS_CHROMEOS)
|
||||
// Flattens the |doc|.
|
||||
// On success, returns the flattened version of |doc| as a vector.
|
||||
// On failure, returns an empty vector.
|
||||
static std::vector<uint8_t> CreateFlattenedPdf(ScopedFPDFDocument doc);
|
||||
#endif // defined(OS_CHROMEOS)
|
||||
|
||||
static std::vector<uint32_t> GetPageNumbersFromPrintPageNumberRange(
|
||||
const PP_PrintPageNumberRange_Dev* page_ranges,
|
||||
uint32_t page_range_count);
|
||||
@ -77,8 +85,6 @@ class PDFiumPrint {
|
||||
FPDF_PAGE page_to_print,
|
||||
const PP_PrintSettings_Dev& print_settings);
|
||||
|
||||
bool FlattenPrintData(FPDF_DOCUMENT doc) const;
|
||||
|
||||
PDFiumEngine* const engine_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(PDFiumPrint);
|
||||
|
Reference in New Issue
Block a user