Commit 49510dd0 authored by Lei Zhang's avatar Lei Zhang Committed by Commit Bot

Merge PDFiumPrint's public PrintPages methods.

Split raster PDF creation into its own function. Also add a helper
function to consistently check for PDFs with no pages.

Change-Id: I693282460b4da0e80bd1c5f2c022372bb7d58bb1
Reviewed-on: https://chromium-review.googlesource.com/1238353
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: default avatarRebekah Potter <rbpotter@chromium.org>
Cr-Commit-Position: refs/heads/master@{#593623}
parent 40abc3dd
...@@ -1151,8 +1151,8 @@ pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPdf( ...@@ -1151,8 +1151,8 @@ pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPdf(
g_last_instance_id = client_->GetPluginInstance()->pp_instance(); g_last_instance_id = client_->GetPluginInstance()->pp_instance();
#endif #endif
return print_.PrintPagesAsRasterPdf(page_ranges, page_range_count, return print_.PrintPagesAsPdf(page_ranges, page_range_count, print_settings,
print_settings, pdf_print_settings); pdf_print_settings, /*raster=*/true);
} }
pp::Buffer_Dev PDFiumEngine::PrintPagesAsPdf( pp::Buffer_Dev PDFiumEngine::PrintPagesAsPdf(
...@@ -1175,7 +1175,7 @@ pp::Buffer_Dev PDFiumEngine::PrintPagesAsPdf( ...@@ -1175,7 +1175,7 @@ pp::Buffer_Dev PDFiumEngine::PrintPagesAsPdf(
} }
return print_.PrintPagesAsPdf(page_ranges, page_range_count, print_settings, return print_.PrintPagesAsPdf(page_ranges, page_range_count, print_settings,
pdf_print_settings); pdf_print_settings, /*raster=*/false);
} }
void PDFiumEngine::KillFormFocus() { void PDFiumEngine::KillFormFocus() {
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "pdf/pdfium/pdfium_print.h" #include "pdf/pdfium/pdfium_print.h"
#include <algorithm>
#include <string> #include <string>
#include <utility> #include <utility>
...@@ -37,6 +38,11 @@ bool ShouldDoNup(int pages_per_sheet) { ...@@ -37,6 +38,11 @@ bool ShouldDoNup(int pages_per_sheet) {
return pages_per_sheet > 1; return pages_per_sheet > 1;
} }
// Returns the valid, positive page count, or 0 on failure.
int GetDocumentPageCount(FPDF_DOCUMENT doc) {
return std::max(FPDF_GetPageCount(doc), 0);
}
// Set the destination page size and content area in points based on source // Set the destination page size and content area in points based on source
// page rotation and orientation. // page rotation and orientation.
// //
...@@ -273,51 +279,19 @@ void PDFiumPrint::FitContentsToPrintableArea(FPDF_DOCUMENT doc, ...@@ -273,51 +279,19 @@ void PDFiumPrint::FitContentsToPrintableArea(FPDF_DOCUMENT doc,
FitContentsToPrintableAreaIfRequired(doc, 1.0, print_settings); FitContentsToPrintableAreaIfRequired(doc, 1.0, print_settings);
} }
pp::Buffer_Dev PDFiumPrint::PrintPagesAsRasterPdf(
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings,
const PP_PdfPrintSettings_Dev& pdf_print_settings) {
ScopedFPDFDocument output_doc = CreatePrintPdf(
page_ranges, page_range_count, print_settings, pdf_print_settings);
if (!output_doc)
return pp::Buffer_Dev();
int page_count = FPDF_GetPageCount(output_doc.get());
if (page_count <= 0)
return pp::Buffer_Dev();
ScopedFPDFDocument rasterized_output_doc(FPDF_CreateNewDocument());
DCHECK(rasterized_output_doc);
for (int i = 0; i < page_count; ++i) {
ScopedFPDFPage pdf_page(FPDF_LoadPage(output_doc.get(), i));
if (!pdf_page)
return pp::Buffer_Dev();
ScopedFPDFDocument temp_doc =
CreateSinglePageRasterPdf(pdf_page.get(), print_settings);
if (!temp_doc)
return pp::Buffer_Dev();
if (!FPDF_ImportPages(rasterized_output_doc.get(), temp_doc.get(), "1", i))
return pp::Buffer_Dev();
}
FPDF_CopyViewerPreferences(rasterized_output_doc.get(), engine_->doc());
return GetPrintData(rasterized_output_doc.get());
}
pp::Buffer_Dev PDFiumPrint::PrintPagesAsPdf( pp::Buffer_Dev PDFiumPrint::PrintPagesAsPdf(
const PP_PrintPageNumberRange_Dev* page_ranges, const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count, uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings, const PP_PrintSettings_Dev& print_settings,
const PP_PdfPrintSettings_Dev& pdf_print_settings) { const PP_PdfPrintSettings_Dev& pdf_print_settings,
bool raster) {
pp::Buffer_Dev buffer; pp::Buffer_Dev buffer;
ScopedFPDFDocument output_doc = CreatePrintPdf( ScopedFPDFDocument output_doc = CreatePrintPdf(
page_ranges, page_range_count, print_settings, pdf_print_settings); page_ranges, page_range_count, print_settings, pdf_print_settings);
if (output_doc) if (raster)
buffer = GetPrintData(output_doc.get()); output_doc = CreateRasterPdf(std::move(output_doc), print_settings);
if (GetDocumentPageCount(output_doc.get()))
buffer = ConvertDocToBuffer(std::move(output_doc));
return buffer; return buffer;
} }
...@@ -352,6 +326,34 @@ ScopedFPDFDocument PDFiumPrint::CreatePrintPdf( ...@@ -352,6 +326,34 @@ ScopedFPDFDocument PDFiumPrint::CreatePrintPdf(
return output_doc; return output_doc;
} }
ScopedFPDFDocument PDFiumPrint::CreateRasterPdf(
ScopedFPDFDocument doc,
const PP_PrintSettings_Dev& print_settings) {
int page_count = GetDocumentPageCount(doc.get());
if (page_count == 0)
return nullptr;
ScopedFPDFDocument rasterized_doc(FPDF_CreateNewDocument());
DCHECK(rasterized_doc);
FPDF_CopyViewerPreferences(rasterized_doc.get(), doc.get());
for (int i = 0; i < page_count; ++i) {
ScopedFPDFPage pdf_page(FPDF_LoadPage(doc.get(), i));
if (!pdf_page)
return nullptr;
ScopedFPDFDocument temp_doc =
CreateSinglePageRasterPdf(pdf_page.get(), print_settings);
if (!temp_doc)
return nullptr;
if (!FPDF_ImportPages(rasterized_doc.get(), temp_doc.get(), "1", i))
return nullptr;
}
return rasterized_doc;
}
ScopedFPDFDocument PDFiumPrint::CreateSinglePageRasterPdf( ScopedFPDFDocument PDFiumPrint::CreateSinglePageRasterPdf(
FPDF_PAGE page_to_print, FPDF_PAGE page_to_print,
const PP_PrintSettings_Dev& print_settings) { const PP_PrintSettings_Dev& print_settings) {
...@@ -448,12 +450,12 @@ bool PDFiumPrint::FlattenPrintData(FPDF_DOCUMENT doc) const { ...@@ -448,12 +450,12 @@ bool PDFiumPrint::FlattenPrintData(FPDF_DOCUMENT doc) const {
return true; return true;
} }
pp::Buffer_Dev PDFiumPrint::GetPrintData(FPDF_DOCUMENT doc) const { pp::Buffer_Dev PDFiumPrint::ConvertDocToBuffer(ScopedFPDFDocument doc) const {
DCHECK(doc); DCHECK(doc);
pp::Buffer_Dev buffer; pp::Buffer_Dev buffer;
PDFiumMemBufferFileWrite output_file_write; PDFiumMemBufferFileWrite output_file_write;
if (FPDF_SaveAsCopy(doc, &output_file_write, 0)) { if (FPDF_SaveAsCopy(doc.get(), &output_file_write, 0)) {
size_t size = output_file_write.size(); size_t size = output_file_write.size();
buffer = pp::Buffer_Dev(engine_->GetPluginInstance(), size); buffer = pp::Buffer_Dev(engine_->GetPluginInstance(), size);
if (!buffer.is_null()) if (!buffer.is_null())
......
...@@ -47,16 +47,12 @@ class PDFiumPrint { ...@@ -47,16 +47,12 @@ class PDFiumPrint {
const gfx::Size& page_size, const gfx::Size& page_size,
const gfx::Rect& printable_area); const gfx::Rect& printable_area);
pp::Buffer_Dev PrintPagesAsRasterPdf(
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings,
const PP_PdfPrintSettings_Dev& pdf_print_settings);
pp::Buffer_Dev PrintPagesAsPdf( pp::Buffer_Dev PrintPagesAsPdf(
const PP_PrintPageNumberRange_Dev* page_ranges, const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count, uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings, const PP_PrintSettings_Dev& print_settings,
const PP_PdfPrintSettings_Dev& pdf_print_settings); const PP_PdfPrintSettings_Dev& pdf_print_settings,
bool raster);
private: private:
ScopedFPDFDocument CreatePrintPdf( ScopedFPDFDocument CreatePrintPdf(
...@@ -65,12 +61,16 @@ class PDFiumPrint { ...@@ -65,12 +61,16 @@ class PDFiumPrint {
const PP_PrintSettings_Dev& print_settings, const PP_PrintSettings_Dev& print_settings,
const PP_PdfPrintSettings_Dev& pdf_print_settings); const PP_PdfPrintSettings_Dev& pdf_print_settings);
ScopedFPDFDocument CreateRasterPdf(
ScopedFPDFDocument doc,
const PP_PrintSettings_Dev& print_settings);
ScopedFPDFDocument CreateSinglePageRasterPdf( ScopedFPDFDocument CreateSinglePageRasterPdf(
FPDF_PAGE page_to_print, FPDF_PAGE page_to_print,
const PP_PrintSettings_Dev& print_settings); const PP_PrintSettings_Dev& print_settings);
bool FlattenPrintData(FPDF_DOCUMENT doc) const; bool FlattenPrintData(FPDF_DOCUMENT doc) const;
pp::Buffer_Dev GetPrintData(FPDF_DOCUMENT doc) const; pp::Buffer_Dev ConvertDocToBuffer(ScopedFPDFDocument doc) const;
PDFiumEngine* const engine_; PDFiumEngine* const engine_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment