1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef PDF_PDFIUM_PDFIUM_PAGE_H_ 6 #define PDF_PDFIUM_PDFIUM_PAGE_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/strings/string16.h" 12 #include "ppapi/cpp/rect.h" 13 #include "third_party/pdfium/fpdfsdk/include/fpdfdoc.h" 14 #include "third_party/pdfium/fpdfsdk/include/fpdfformfill.h" 15 #include "third_party/pdfium/fpdfsdk/include/fpdftext.h" 16 17 namespace base { 18 class Value; 19 } 20 21 namespace chrome_pdf { 22 23 class PDFiumEngine; 24 25 // Wrapper around a page from the document. 26 class PDFiumPage { 27 public: 28 PDFiumPage(PDFiumEngine* engine, 29 int i, 30 const pp::Rect& r, 31 bool available); 32 ~PDFiumPage(); 33 // Unloads the PDFium data for this page from memory. 34 void Unload(); 35 // Gets the FPDF_PAGE for this page, loading and parsing it if necessary. 36 FPDF_PAGE GetPage(); 37 //Get the FPDF_PAGE for printing. 38 FPDF_PAGE GetPrintPage(); 39 //Close the printing page. 40 void ClosePrintPage(); 41 42 // Returns FPDF_TEXTPAGE for the page, loading and parsing it if necessary. 43 FPDF_TEXTPAGE GetTextPage(); 44 45 // Returns a DictionaryValue version of the page. 46 base::Value* GetAccessibleContentAsValue(int rotation); 47 48 enum Area { 49 NONSELECTABLE_AREA, 50 TEXT_AREA, 51 WEBLINK_AREA, // Area is a hyperlink. 52 DOCLINK_AREA, // Area is a link to a different part of the same document. 53 }; 54 55 struct LinkTarget { 56 // We are using std::string here which have a copy contructor. 57 // That prevents us from using union here. 58 std::string url; // Valid for WEBLINK_AREA only. 59 int page; // Valid for DOCLINK_AREA only. 60 }; 61 62 // Given a point in the document that's in this page, returns its character 63 // index if it's near a character, and also the type of text. 64 // Target is optional. It will be filled in for WEBLINK_AREA or 65 // DOCLINK_AREA only. 66 Area GetCharIndex(const pp::Point& point, int rotation, int* char_index, 67 LinkTarget* target); 68 69 // Gets the character at the given index. 70 base::char16 GetCharAtIndex(int index); 71 72 // Gets the number of characters in the page. 73 int GetCharCount(); 74 75 // Converts from page coordinates to screen coordinates. 76 pp::Rect PageToScreen(const pp::Point& offset, 77 double zoom, 78 double left, 79 double top, 80 double right, 81 double bottom, 82 int rotation); 83 index()84 int index() const { return index_; } rect()85 pp::Rect rect() const { return rect_; } set_rect(const pp::Rect & r)86 void set_rect(const pp::Rect& r) { rect_ = r; } available()87 bool available() const { return available_; } set_available(bool available)88 void set_available(bool available) { available_ = available; } set_calculated_links(bool calculated_links)89 void set_calculated_links(bool calculated_links) { 90 calculated_links_ = calculated_links; 91 } 92 93 private: 94 // Returns a link index if the given character index is over a link, or -1 95 // otherwise. 96 int GetLink(int char_index, LinkTarget* target); 97 // Returns the link indices if the given rect intersects a link rect, or an 98 // empty vector otherwise. 99 std::vector<int> GetLinks(pp::Rect text_area, 100 std::vector<LinkTarget>* targets); 101 // Calculate the locations of any links on the page. 102 void CalculateLinks(); 103 // Returns link type and target associated with a link. Returns 104 // NONSELECTABLE_AREA if link detection failed. 105 Area GetLinkTarget(FPDF_LINK link, LinkTarget* target); 106 // Returns target associated with a destination. 107 Area GetDestinationTarget(FPDF_DEST destination, LinkTarget* target); 108 // Returns the text in the supplied box as a Value Node 109 base::Value* GetTextBoxAsValue(double page_height, double left, double top, 110 double right, double bottom, int rotation); 111 // Helper functions for JSON generation 112 base::Value* CreateTextNode(std::string text); 113 base::Value* CreateURLNode(std::string text, std::string url); 114 115 struct Link { 116 Link(); 117 ~Link(); 118 119 std::string url; 120 // Bounding rectangles of characters. 121 std::vector<pp::Rect> rects; 122 }; 123 124 PDFiumEngine* engine_; 125 FPDF_PAGE page_; 126 FPDF_TEXTPAGE text_page_; 127 int index_; 128 pp::Rect rect_; 129 bool calculated_links_; 130 std::vector<Link> links_; 131 bool available_; 132 }; 133 134 } // namespace chrome_pdf 135 136 #endif // PDF_PDFIUM_PDFIUM_PAGE_H_ 137