0

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:
Jesse Schettler
2019-11-06 15:21:27 +00:00
committed by Commit Bot
parent 6ad2f520d9
commit a092a99c42
25 changed files with 573 additions and 49 deletions

@ -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);