Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "pdf/pdfium/pdfium_engine.h" | 5 #include "pdf/pdfium/pdfium_engine.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 50 #include "third_party/pdfium/public/fpdf_edit.h" | 50 #include "third_party/pdfium/public/fpdf_edit.h" |
| 51 #include "third_party/pdfium/public/fpdf_ext.h" | 51 #include "third_party/pdfium/public/fpdf_ext.h" |
| 52 #include "third_party/pdfium/public/fpdf_flatten.h" | 52 #include "third_party/pdfium/public/fpdf_flatten.h" |
| 53 #include "third_party/pdfium/public/fpdf_ppo.h" | 53 #include "third_party/pdfium/public/fpdf_ppo.h" |
| 54 #include "third_party/pdfium/public/fpdf_save.h" | 54 #include "third_party/pdfium/public/fpdf_save.h" |
| 55 #include "third_party/pdfium/public/fpdf_searchex.h" | 55 #include "third_party/pdfium/public/fpdf_searchex.h" |
| 56 #include "third_party/pdfium/public/fpdf_sysfontinfo.h" | 56 #include "third_party/pdfium/public/fpdf_sysfontinfo.h" |
| 57 #include "third_party/pdfium/public/fpdf_transformpage.h" | 57 #include "third_party/pdfium/public/fpdf_transformpage.h" |
| 58 #include "third_party/pdfium/public/fpdfview.h" | 58 #include "third_party/pdfium/public/fpdfview.h" |
| 59 #include "ui/events/keycodes/keyboard_codes.h" | 59 #include "ui/events/keycodes/keyboard_codes.h" |
| 60 #include "ui/gfx/codec/jpeg_codec.h" | |
| 60 #include "ui/gfx/geometry/rect.h" | 61 #include "ui/gfx/geometry/rect.h" |
| 61 #include "v8/include/v8.h" | 62 #include "v8/include/v8.h" |
| 62 | 63 |
| 63 using printing::ConvertUnit; | 64 using printing::ConvertUnit; |
| 64 using printing::ConvertUnitDouble; | 65 using printing::ConvertUnitDouble; |
| 65 using printing::kPointsPerInch; | 66 using printing::kPointsPerInch; |
| 66 using printing::kPixelsPerInch; | 67 using printing::kPixelsPerInch; |
| 67 | 68 |
| 68 namespace chrome_pdf { | 69 namespace chrome_pdf { |
| 69 | 70 |
| (...skipping 1173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1243 else | 1244 else |
| 1244 OnDocumentComplete(); | 1245 OnDocumentComplete(); |
| 1245 } | 1246 } |
| 1246 | 1247 |
| 1247 void PDFiumEngine::CancelBrowserDownload() { | 1248 void PDFiumEngine::CancelBrowserDownload() { |
| 1248 client_->CancelBrowserDownload(); | 1249 client_->CancelBrowserDownload(); |
| 1249 } | 1250 } |
| 1250 | 1251 |
| 1251 void PDFiumEngine::FinishLoadingDocument() { | 1252 void PDFiumEngine::FinishLoadingDocument() { |
| 1252 DCHECK(doc_loader_->IsDocumentComplete() && doc_); | 1253 DCHECK(doc_loader_->IsDocumentComplete() && doc_); |
| 1253 | |
| 1254 if (!form_) { | 1254 if (!form_) { |
| 1255 int form_status = | 1255 int form_status = |
| 1256 FPDFAvail_IsFormAvail(fpdf_availability_, &download_hints_); | 1256 FPDFAvail_IsFormAvail(fpdf_availability_, &download_hints_); |
| 1257 if (form_status != PDF_FORM_NOTAVAIL) { | 1257 if (form_status != PDF_FORM_NOTAVAIL) { |
| 1258 form_ = FPDFDOC_InitFormFillEnvironment( | 1258 form_ = FPDFDOC_InitFormFillEnvironment( |
| 1259 doc_, static_cast<FPDF_FORMFILLINFO*>(this)); | 1259 doc_, static_cast<FPDF_FORMFILLINFO*>(this)); |
| 1260 #if defined(PDF_ENABLE_XFA) | 1260 #if defined(PDF_ENABLE_XFA) |
| 1261 FPDF_LoadXFA(doc_); | 1261 FPDF_LoadXFA(doc_); |
| 1262 #endif | 1262 #endif |
| 1263 | 1263 |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1383 defer_page_unload_ = false; | 1383 defer_page_unload_ = false; |
| 1384 for (int page_index : deferred_page_unloads_) | 1384 for (int page_index : deferred_page_unloads_) |
| 1385 pages_[page_index]->Unload(); | 1385 pages_[page_index]->Unload(); |
| 1386 deferred_page_unloads_.clear(); | 1386 deferred_page_unloads_.clear(); |
| 1387 return rv; | 1387 return rv; |
| 1388 } | 1388 } |
| 1389 | 1389 |
| 1390 uint32_t PDFiumEngine::QuerySupportedPrintOutputFormats() { | 1390 uint32_t PDFiumEngine::QuerySupportedPrintOutputFormats() { |
| 1391 if (!HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY)) | 1391 if (!HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY)) |
| 1392 return 0; | 1392 return 0; |
| 1393 return PP_PRINTOUTPUTFORMAT_PDF; | 1393 if (!HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY)) |
| 1394 return PP_PRINTOUTPUTFORMAT_RASTER; | |
| 1395 return PP_PRINTOUTPUTFORMAT_PDF | PP_PRINTOUTPUTFORMAT_RASTER; | |
| 1394 } | 1396 } |
| 1395 | 1397 |
| 1396 void PDFiumEngine::PrintBegin() { | 1398 void PDFiumEngine::PrintBegin() { |
| 1397 FORM_DoDocumentAAction(form_, FPDFDOC_AACTION_WP); | 1399 FORM_DoDocumentAAction(form_, FPDFDOC_AACTION_WP); |
| 1398 } | 1400 } |
| 1399 | 1401 |
| 1400 pp::Resource PDFiumEngine::PrintPages( | 1402 pp::Resource PDFiumEngine::PrintPages( |
| 1401 const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count, | 1403 const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count, |
| 1402 const PP_PrintSettings_Dev& print_settings) { | 1404 const PP_PrintSettings_Dev& print_settings) { |
| 1403 ScopedSubstFont scoped_subst_font(this); | 1405 ScopedSubstFont scoped_subst_font(this); |
| 1404 if (HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY)) | 1406 if (HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY) && |
| 1407 (print_settings.format & PP_PRINTOUTPUTFORMAT_PDF)) { | |
| 1405 return PrintPagesAsPDF(page_ranges, page_range_count, print_settings); | 1408 return PrintPagesAsPDF(page_ranges, page_range_count, print_settings); |
| 1406 else if (HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY)) | 1409 } else if (HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY)) { |
| 1407 return PrintPagesAsRasterPDF(page_ranges, page_range_count, print_settings); | 1410 return PrintPagesAsRasterPDF(page_ranges, page_range_count, print_settings); |
| 1411 } | |
| 1412 | |
| 1408 return pp::Resource(); | 1413 return pp::Resource(); |
| 1409 } | 1414 } |
| 1410 | 1415 |
| 1416 struct simple_buf { | |
| 1417 uint32_t size; | |
| 1418 uint8_t *data; | |
| 1419 }; | |
| 1420 | |
| 1421 int GetBlockForJpeg(void *param, | |
| 1422 unsigned long pos, | |
| 1423 unsigned char* pBuf, | |
| 1424 unsigned long size) { | |
| 1425 simple_buf * buf_p = static_cast<simple_buf *>(param); | |
| 1426 if (pos + size < pos || pos + size > buf_p->size) | |
| 1427 return 0; | |
| 1428 memcpy(pBuf, buf_p->data, size); | |
| 1429 return size; | |
| 1430 } | |
| 1431 | |
| 1411 FPDF_DOCUMENT PDFiumEngine::CreateSinglePageRasterPdf( | 1432 FPDF_DOCUMENT PDFiumEngine::CreateSinglePageRasterPdf( |
| 1412 double source_page_width, | 1433 double source_page_width, |
| 1413 double source_page_height, | 1434 double source_page_height, |
| 1414 const PP_PrintSettings_Dev& print_settings, | 1435 const PP_PrintSettings_Dev& print_settings, |
| 1415 PDFiumPage* page_to_print) { | 1436 PDFiumPage* page_to_print) { |
| 1416 FPDF_DOCUMENT temp_doc = FPDF_CreateNewDocument(); | 1437 FPDF_DOCUMENT temp_doc = FPDF_CreateNewDocument(); |
| 1417 if (!temp_doc) | 1438 if (!temp_doc) |
| 1418 return temp_doc; | 1439 return temp_doc; |
| 1419 | 1440 |
| 1420 const pp::Size& bitmap_size(page_to_print->rect().size()); | 1441 const pp::Size& bitmap_size(page_to_print->rect().size()); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1440 pp::Rect page_rect = page_to_print->rect(); | 1461 pp::Rect page_rect = page_to_print->rect(); |
| 1441 FPDF_RenderPageBitmap(bitmap, | 1462 FPDF_RenderPageBitmap(bitmap, |
| 1442 page_to_print->GetPrintPage(), | 1463 page_to_print->GetPrintPage(), |
| 1443 page_rect.x(), | 1464 page_rect.x(), |
| 1444 page_rect.y(), | 1465 page_rect.y(), |
| 1445 page_rect.width(), | 1466 page_rect.width(), |
| 1446 page_rect.height(), | 1467 page_rect.height(), |
| 1447 print_settings.orientation, | 1468 print_settings.orientation, |
| 1448 FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); | 1469 FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); |
| 1449 | 1470 |
| 1471 unsigned char * bitmap_data = | |
| 1472 static_cast<unsigned char *>(FPDFBitmap_GetBuffer(bitmap)); | |
| 1450 double ratio_x = ConvertUnitDouble(bitmap_size.width(), | 1473 double ratio_x = ConvertUnitDouble(bitmap_size.width(), |
| 1451 print_settings.dpi, | 1474 print_settings.dpi, |
| 1452 kPointsPerInch); | 1475 kPointsPerInch); |
| 1453 double ratio_y = ConvertUnitDouble(bitmap_size.height(), | 1476 double ratio_y = ConvertUnitDouble(bitmap_size.height(), |
| 1454 print_settings.dpi, | 1477 print_settings.dpi, |
| 1455 kPointsPerInch); | 1478 kPointsPerInch); |
| 1456 | 1479 |
| 1457 // Add the bitmap to an image object and add the image object to the output | 1480 // Add the bitmap to an image object and add the image object to the output |
| 1458 // page. | 1481 // page. |
| 1459 FPDF_PAGEOBJECT temp_img = FPDFPageObj_NewImgeObj(temp_doc); | 1482 FPDF_PAGEOBJECT temp_img = FPDFPageObj_NewImgeObj(temp_doc); |
| 1460 FPDFImageObj_SetBitmap(&temp_page, 1, temp_img, bitmap); | 1483 |
| 1484 std::vector <unsigned char> compressed_bitmap_data; | |
| 1485 int quality = 40; | |
| 1486 bool encode_success = gfx::JPEGCodec::Encode(bitmap_data, | |
| 1487 gfx::JPEGCodec::FORMAT_BGRA, | |
| 1488 FPDFBitmap_GetWidth(bitmap), | |
| 1489 FPDFBitmap_GetHeight(bitmap), | |
| 1490 FPDFBitmap_GetStride(bitmap), | |
| 1491 quality, | |
| 1492 &compressed_bitmap_data); | |
| 1493 | |
| 1494 // 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.
| |
| 1495 if (encode_success) { | |
| 1496 simple_buf buffer; | |
| 1497 buffer.size = compressed_bitmap_data.size(); | |
| 1498 buffer.data = new uint8_t[buffer.size]; | |
| 1499 memcpy(buffer.data, &(compressed_bitmap_data[0]), buffer.size); | |
| 1500 | |
| 1501 FPDF_FILEACCESS file_access; | |
| 1502 memset(&file_access, '\0', sizeof(file_access)); | |
| 1503 file_access.m_FileLen = | |
| 1504 static_cast<unsigned long>(compressed_bitmap_data.size()); | |
| 1505 file_access.m_GetBlock = &GetBlockForJpeg; | |
| 1506 file_access.m_Param = &buffer; | |
| 1507 | |
| 1508 FPDFImageObj_LoadJpegFile(&temp_page, 1, temp_img, &file_access); | |
| 1509 delete buffer.data; | |
| 1510 } else { | |
| 1511 FPDFImageObj_SetBitmap(&temp_page, 1, temp_img, bitmap); | |
| 1512 } | |
| 1513 | |
| 1461 FPDFImageObj_SetMatrix(temp_img, ratio_x, 0, 0, ratio_y, 0, 0); | 1514 FPDFImageObj_SetMatrix(temp_img, ratio_x, 0, 0, ratio_y, 0, 0); |
| 1462 FPDFPage_InsertObject(temp_page, temp_img); | 1515 FPDFPage_InsertObject(temp_page, temp_img); |
| 1463 FPDFPage_GenerateContent(temp_page); | 1516 FPDFPage_GenerateContent(temp_page); |
| 1464 FPDF_ClosePage(temp_page); | 1517 FPDF_ClosePage(temp_page); |
| 1465 | 1518 |
| 1466 page_to_print->ClosePrintPage(); | 1519 page_to_print->ClosePrintPage(); |
| 1467 FPDFBitmap_Destroy(bitmap); | 1520 FPDFBitmap_Destroy(bitmap); |
| 1468 | 1521 |
| 1469 return temp_doc; | 1522 return temp_doc; |
| 1470 } | 1523 } |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 1489 // width and height of source PDF pages. | 1542 // width and height of source PDF pages. |
| 1490 std::vector<std::pair<double, double> > source_page_sizes; | 1543 std::vector<std::pair<double, double> > source_page_sizes; |
| 1491 // Collect pages to print and sizes of source pages. | 1544 // Collect pages to print and sizes of source pages. |
| 1492 std::vector<uint32_t> page_numbers = | 1545 std::vector<uint32_t> page_numbers = |
| 1493 GetPageNumbersFromPrintPageNumberRange(page_ranges, page_range_count); | 1546 GetPageNumbersFromPrintPageNumberRange(page_ranges, page_range_count); |
| 1494 for (uint32_t page_number : page_numbers) { | 1547 for (uint32_t page_number : page_numbers) { |
| 1495 FPDF_PAGE pdf_page = FPDF_LoadPage(doc_, page_number); | 1548 FPDF_PAGE pdf_page = FPDF_LoadPage(doc_, page_number); |
| 1496 double source_page_width = FPDF_GetPageWidth(pdf_page); | 1549 double source_page_width = FPDF_GetPageWidth(pdf_page); |
| 1497 double source_page_height = FPDF_GetPageHeight(pdf_page); | 1550 double source_page_height = FPDF_GetPageHeight(pdf_page); |
| 1498 source_page_sizes.push_back(std::make_pair(source_page_width, | 1551 source_page_sizes.push_back(std::make_pair(source_page_width, |
| 1499 source_page_height)); | 1552 source_page_height)); |
| 1500 | 1553 |
| 1501 int width_in_pixels = ConvertUnit(source_page_width, | 1554 int width_in_pixels = ConvertUnit(source_page_width, |
| 1502 kPointsPerInch, | 1555 kPointsPerInch, |
| 1503 print_settings.dpi); | 1556 print_settings.dpi); |
| 1504 int height_in_pixels = ConvertUnit(source_page_height, | 1557 int height_in_pixels = ConvertUnit(source_page_height, |
| 1505 kPointsPerInch, | 1558 kPointsPerInch, |
| 1506 print_settings.dpi); | 1559 print_settings.dpi); |
| 1507 | 1560 |
| 1508 pp::Rect rect(width_in_pixels, height_in_pixels); | 1561 pp::Rect rect(width_in_pixels, height_in_pixels); |
| 1509 pages_to_print.push_back(PDFiumPage(this, page_number, rect, true)); | 1562 pages_to_print.push_back(PDFiumPage(this, page_number, rect, true)); |
| 1510 FPDF_ClosePage(pdf_page); | 1563 FPDF_ClosePage(pdf_page); |
| 1511 } | 1564 } |
| 1512 | 1565 |
| 1513 #if defined(OS_LINUX) | 1566 #if defined(OS_LINUX) |
| 1514 g_last_instance_id = client_->GetPluginInstance()->pp_instance(); | 1567 g_last_instance_id = client_->GetPluginInstance()->pp_instance(); |
| 1515 #endif | 1568 #endif |
| 1516 | 1569 |
| 1517 size_t i = 0; | 1570 size_t i = 0; |
| 1571 unsigned long total_doc_size = 0; | |
| 1518 for (; i < pages_to_print.size(); ++i) { | 1572 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.
| |
| 1519 double source_page_width = source_page_sizes[i].first; | 1573 double source_page_width = source_page_sizes[i].first; |
| 1520 double source_page_height = source_page_sizes[i].second; | 1574 double source_page_height = source_page_sizes[i].second; |
| 1521 | 1575 |
| 1522 // Use temp_doc to compress image by saving PDF to buffer. | 1576 // Use temp_doc to compress image by saving PDF to buffer. |
| 1523 FPDF_DOCUMENT temp_doc = CreateSinglePageRasterPdf(source_page_width, | 1577 FPDF_DOCUMENT temp_doc = CreateSinglePageRasterPdf(source_page_width, |
| 1524 source_page_height, | 1578 source_page_height, |
| 1525 print_settings, | 1579 print_settings, |
| 1526 &pages_to_print[i]); | 1580 &pages_to_print[i]); |
| 1527 | |
| 1528 if (!temp_doc) | 1581 if (!temp_doc) |
| 1529 break; | 1582 break; |
| 1530 | 1583 |
| 1531 pp::Buffer_Dev buffer = GetFlattenedPrintData(temp_doc); | 1584 pp::Buffer_Dev buffer = GetFlattenedPrintData(temp_doc); |
| 1585 total_doc_size += buffer.size(); | |
| 1532 FPDF_CloseDocument(temp_doc); | 1586 FPDF_CloseDocument(temp_doc); |
| 1533 | 1587 |
| 1534 PDFiumMemBufferFileRead file_read(buffer.data(), buffer.size()); | 1588 PDFiumMemBufferFileRead file_read(buffer.data(), buffer.size()); |
| 1535 temp_doc = FPDF_LoadCustomDocument(&file_read, nullptr); | 1589 temp_doc = FPDF_LoadCustomDocument(&file_read, nullptr); |
| 1536 | |
| 1537 FPDF_BOOL imported = FPDF_ImportPages(output_doc, temp_doc, "1", i); | 1590 FPDF_BOOL imported = FPDF_ImportPages(output_doc, temp_doc, "1", i); |
| 1538 FPDF_CloseDocument(temp_doc); | 1591 FPDF_CloseDocument(temp_doc); |
| 1539 if (!imported) | 1592 if (!imported) |
| 1540 break; | 1593 break; |
| 1541 } | 1594 } |
| 1542 | 1595 |
| 1543 pp::Buffer_Dev buffer; | 1596 pp::Buffer_Dev buffer; |
| 1544 if (i == pages_to_print.size()) { | 1597 if (i == pages_to_print.size()) { |
| 1545 FPDF_CopyViewerPreferences(output_doc, doc_); | 1598 FPDF_CopyViewerPreferences(output_doc, doc_); |
| 1546 FitContentsToPrintableAreaIfRequired(output_doc, print_settings); | 1599 FitContentsToPrintableAreaIfRequired(output_doc, print_settings); |
| (...skipping 2606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4153 | 4206 |
| 4154 bool PDFiumEngineExports::GetPDFPageSizeByIndex(void* pdf_handle, | 4207 bool PDFiumEngineExports::GetPDFPageSizeByIndex(void* pdf_handle, |
| 4155 int page_number, | 4208 int page_number, |
| 4156 double* width, | 4209 double* width, |
| 4157 double* height) { | 4210 double* height) { |
| 4158 FPDF_DOCUMENT doc = pdf_handle; | 4211 FPDF_DOCUMENT doc = pdf_handle; |
| 4159 return doc && FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; | 4212 return doc && FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; |
| 4160 } | 4213 } |
| 4161 | 4214 |
| 4162 } // namespace chrome_pdf | 4215 } // namespace chrome_pdf |
| OLD | NEW |