Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1261)

Unified Diff: pdf/pdfium/pdfium_engine.cc

Issue 2524143003: Print Preview: Add option to rasterize PDFs and add JPEG compression. (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pdf/pdfium/DEPS ('k') | printing/print_job_constants.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pdf/pdfium/pdfium_engine.cc
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index 0853d79beb294ae9a103eb0e065615401ec53148..d9701332c76f7469f1d93325715e3671b145c801 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -57,6 +57,7 @@
#include "third_party/pdfium/public/fpdf_transformpage.h"
#include "third_party/pdfium/public/fpdfview.h"
#include "ui/events/keycodes/keyboard_codes.h"
+#include "ui/gfx/codec/jpeg_codec.h"
#include "ui/gfx/geometry/rect.h"
#include "v8/include/v8.h"
@@ -1250,7 +1251,6 @@ void PDFiumEngine::CancelBrowserDownload() {
void PDFiumEngine::FinishLoadingDocument() {
DCHECK(doc_loader_->IsDocumentComplete() && doc_);
-
if (!form_) {
int form_status =
FPDFAvail_IsFormAvail(fpdf_availability_, &download_hints_);
@@ -1390,7 +1390,9 @@ bool PDFiumEngine::HandleEvent(const pp::InputEvent& event) {
uint32_t PDFiumEngine::QuerySupportedPrintOutputFormats() {
if (!HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY))
return 0;
- return PP_PRINTOUTPUTFORMAT_PDF;
+ if (!HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY))
+ return PP_PRINTOUTPUTFORMAT_RASTER;
+ return PP_PRINTOUTPUTFORMAT_PDF | PP_PRINTOUTPUTFORMAT_RASTER;
}
void PDFiumEngine::PrintBegin() {
@@ -1401,13 +1403,32 @@ pp::Resource PDFiumEngine::PrintPages(
const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings) {
ScopedSubstFont scoped_subst_font(this);
- if (HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY))
+ if (HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY) &&
+ (print_settings.format & PP_PRINTOUTPUTFORMAT_PDF)) {
return PrintPagesAsPDF(page_ranges, page_range_count, print_settings);
- else if (HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY))
+ } else if (HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY)) {
return PrintPagesAsRasterPDF(page_ranges, page_range_count, print_settings);
+ }
+
return pp::Resource();
}
+struct simple_buf {
+ uint32_t size;
+ uint8_t *data;
+};
+
+int GetBlockForJpeg(void *param,
+ unsigned long pos,
+ unsigned char* pBuf,
+ unsigned long size) {
+ simple_buf * buf_p = static_cast<simple_buf *>(param);
+ if (pos + size < pos || pos + size > buf_p->size)
+ return 0;
+ memcpy(pBuf, buf_p->data, size);
+ return size;
+}
+
FPDF_DOCUMENT PDFiumEngine::CreateSinglePageRasterPdf(
double source_page_width,
double source_page_height,
@@ -1447,6 +1468,8 @@ FPDF_DOCUMENT PDFiumEngine::CreateSinglePageRasterPdf(
print_settings.orientation,
FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH);
+ unsigned char * bitmap_data =
+ static_cast<unsigned char *>(FPDFBitmap_GetBuffer(bitmap));
double ratio_x = ConvertUnitDouble(bitmap_size.width(),
print_settings.dpi,
kPointsPerInch);
@@ -1457,7 +1480,37 @@ FPDF_DOCUMENT PDFiumEngine::CreateSinglePageRasterPdf(
// Add the bitmap to an image object and add the image object to the output
// page.
FPDF_PAGEOBJECT temp_img = FPDFPageObj_NewImgeObj(temp_doc);
- FPDFImageObj_SetBitmap(&temp_page, 1, temp_img, bitmap);
+
+ std::vector <unsigned char> compressed_bitmap_data;
+ int quality = 40;
+ bool encode_success = gfx::JPEGCodec::Encode(bitmap_data,
+ gfx::JPEGCodec::FORMAT_BGRA,
+ FPDFBitmap_GetWidth(bitmap),
+ FPDFBitmap_GetHeight(bitmap),
+ FPDFBitmap_GetStride(bitmap),
+ quality,
+ &compressed_bitmap_data);
+
+// encode_success = false;
Vitaly Buka (NO REVIEWS) 2016/12/15 08:27:34 please remove
rbpotter 2016/12/16 00:06:30 This is already removed in the latest patchset.
+ if (encode_success) {
+ simple_buf buffer;
+ buffer.size = compressed_bitmap_data.size();
+ buffer.data = new uint8_t[buffer.size];
+ memcpy(buffer.data, &(compressed_bitmap_data[0]), buffer.size);
+
+ FPDF_FILEACCESS file_access;
+ memset(&file_access, '\0', sizeof(file_access));
+ file_access.m_FileLen =
+ static_cast<unsigned long>(compressed_bitmap_data.size());
+ file_access.m_GetBlock = &GetBlockForJpeg;
+ file_access.m_Param = &buffer;
+
+ FPDFImageObj_LoadJpegFile(&temp_page, 1, temp_img, &file_access);
+ delete buffer.data;
+ } else {
+ FPDFImageObj_SetBitmap(&temp_page, 1, temp_img, bitmap);
+ }
+
FPDFImageObj_SetMatrix(temp_img, ratio_x, 0, 0, ratio_y, 0, 0);
FPDFPage_InsertObject(temp_page, temp_img);
FPDFPage_GenerateContent(temp_page);
@@ -1496,7 +1549,7 @@ pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPDF(
double source_page_width = FPDF_GetPageWidth(pdf_page);
double source_page_height = FPDF_GetPageHeight(pdf_page);
source_page_sizes.push_back(std::make_pair(source_page_width,
- source_page_height));
+ source_page_height));
int width_in_pixels = ConvertUnit(source_page_width,
kPointsPerInch,
@@ -1515,25 +1568,25 @@ pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPDF(
#endif
size_t i = 0;
+ unsigned long total_doc_size = 0;
for (; i < pages_to_print.size(); ++i) {
Vitaly Buka (NO REVIEWS) 2016/12/15 08:27:34 Seems total_doc_size is not used.
rbpotter 2016/12/16 00:06:30 This is already removed in the latest patchset.
double source_page_width = source_page_sizes[i].first;
double source_page_height = source_page_sizes[i].second;
// Use temp_doc to compress image by saving PDF to buffer.
FPDF_DOCUMENT temp_doc = CreateSinglePageRasterPdf(source_page_width,
- source_page_height,
- print_settings,
- &pages_to_print[i]);
-
+ source_page_height,
+ print_settings,
+ &pages_to_print[i]);
if (!temp_doc)
break;
pp::Buffer_Dev buffer = GetFlattenedPrintData(temp_doc);
+ total_doc_size += buffer.size();
FPDF_CloseDocument(temp_doc);
PDFiumMemBufferFileRead file_read(buffer.data(), buffer.size());
temp_doc = FPDF_LoadCustomDocument(&file_read, nullptr);
-
FPDF_BOOL imported = FPDF_ImportPages(output_doc, temp_doc, "1", i);
FPDF_CloseDocument(temp_doc);
if (!imported)
« no previous file with comments | « pdf/pdfium/DEPS ('k') | printing/print_job_constants.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698