reflow_text($driver))) { error_log("LayoutEngineDefault::process: reflow_text call failed"); return null; }; // Explicitly remove any height declarations from the BODY-generated box; // BODY should always fill last page completely. Percentage height of the BODY is meaningless // on the paged media. $box->_height_constraint = new HCConstraint(null, null, null); $margin = $box->get_css_property(CSS_MARGIN); $margin->calcPercentages(mm2pt($media->width() - $media->margins['left'] - $media->margins['right'])); $box->setCSSProperty(CSS_MARGIN, $margin); $box->width = mm2pt($media->width() - $media->margins['left'] - $media->margins['right']) - $box->_get_hor_extra(); $box->setCSSProperty(CSS_WIDTH, new WCConstant($box->width)); $box->height = mm2pt($media->real_height()) - $box->_get_vert_extra(); $box->put_top(mm2pt($media->height() - $media->margins['top']) - $box->get_extra_top()); $box->put_left(mm2pt($media->margins['left']) + $box->get_extra_left()); $flag = false; $whitespace_flag = false; $box->reflow_whitespace($flag, $whitespace_flag); $box->pre_reflow_images(); $viewport = new FlowViewport(); $viewport->left = mm2pt($media->margins['left']); $viewport->top = mm2pt($media->height() - $media->margins['top']); $viewport->width = mm2pt($media->width() - $media->margins['left'] - $media->margins['right']); $viewport->height = mm2pt($media->height() - $media->margins['top'] - $media->margins['bottom']); $fake_parent = null; $context->push_viewport($viewport); $box->reflow($fake_parent, $context); // Make the top-level box competely fill the last page $page_real_height = mm2pt($media->real_height()); // Note we cannot have less than 1 page in our doc; max() call // is required as we, in general, CAN have the content height strictly equal to 0. // In this case wi still render the very first page $pages = max(1,ceil($box->get_full_height() / $page_real_height)); /** * Set body box height so it will fit the page exactly */ $box->height = $pages * $page_real_height - $box->_get_vert_extra(); $driver->set_expected_pages($pages); /** * Flow absolute-positioned boxes; * note that we should know the number of expected pages at this moment, unless * we will not be able to calculate positions for elements using 'bottom: ...' CSS property */ for ($i=0, $num_positioned = count($context->absolute_positioned); $i < $num_positioned; $i++) { $context->push(); $context->absolute_positioned[$i]->reflow_absolute($context); $context->pop(); }; // Flow fixed-positioned box for ($i=0, $num_positioned = count($context->fixed_positioned); $i < $num_positioned; $i++) { $context->push(); $context->fixed_positioned[$i]->reflow_fixed($context); $context->pop(); }; $box->reflow_inline(); return true; } } ?>