コード例 #1
0
 function getPages(&$dom_tree, $max_page_height, $first_page_top)
 {
     $current_page_top = $first_page_top;
     $heights = array();
     /**
      * Get list of footnotes and heights of footnote content blocks
      */
     $footnotes = PageBreakLocator::_getFootnotesTraverse($dom_tree);
     usort($footnotes, 'cmp_footnote_locations');
     $locations = PageBreakLocator::_getBreakLocations($dom_tree);
     if (count($locations) == 0) {
         return array($max_page_height);
     }
     $best_location = null;
     foreach ($locations as $location) {
         if ($location->location < $current_page_top) {
             if (is_null($best_location)) {
                 $best_location = $location;
             }
             $current_pos = round_units($current_page_top - $location->location);
             $available_page_height = round_units($max_page_height - $location->_getFootnotesHeight($footnotes, $current_page_top, $location->location));
             if ($current_pos > $available_page_height) {
                 /**
                  * No more locations found on current page
                  */
                 $best_location_penalty = $best_location->getPenalty($current_page_top, $max_page_height, $footnotes);
                 if ($best_location_penalty >= MAX_PAGE_BREAK_PENALTY) {
                     error_log('Could not find good page break location');
                     $heights[] = $max_page_height;
                     $current_page_top -= $max_page_height;
                     $best_location = null;
                 } else {
                     $heights[] = $current_page_top - $best_location->location;
                     $current_page_top = $best_location->location;
                     $best_location = null;
                 }
             } else {
                 $location_penalty = $location->getPenalty($current_page_top, $max_page_height, $footnotes);
                 $best_penalty = $best_location->getPenalty($current_page_top, $max_page_height, $footnotes);
                 if ($location_penalty <= $best_penalty) {
                     /**
                      * Better page break location found on current page
                      */
                     $best_location = $location;
                 }
             }
             if ($location->penalty < 0) {
                 // Forced page break
                 $heights[] = $current_page_top - $location->location;
                 $current_page_top = $location->location;
                 $best_location = null;
             }
         }
     }
     // Last page always will have maximal height
     $heights[] = $max_page_height;
     return $heights;
 }