DomPDF 计算每个div的高度以防止多页。

问题描述 投票:0回答:1

我目前正在使用domPDF创建一个简历导出工具。我有一个包含所有简历数据(标题、描述)的数据库。通过一个循环,我正在创建PDF简历,它看起来像这样。

resume

这是简历左栏的代码。

$q_cv_categories = $bdd->query('SELECT * FROM cv_category WHERE cv_column = "left"');
$q_cv_categories->execute();

while($cv_categories = $q_cv_categories->fetch()){

  $html .= '<div class="special-heading-pdf">';
  $html .= '<h3>'.constant($cv_categories['category_name']).'</h3>';
  $html .= '</div>';

  $q_cv_data = $bdd->prepare('SELECT * FROM cv_data WHERE category_id = :category ORDER BY importance DESC LIMIT 5');
  $q_cv_data->bindValue('category', $cv_categories['id'], PDO::PARAM_INT);
  $q_cv_data->execute();
  while($cv_data = $q_cv_data->fetch()){

    $html .= '<div class="resume-information"><h4 class="title-resume-data">'.constant($cv_data['title']).'</h4>';
    $html .= '<p class="description-resume-data">'.constant($cv_data['description']).'</p></div>';

  }
  $q_cv_data->closeCursor();
}
$q_cv_categories->closeCursor();

我希望能够用以下方法计算每个div的渲染高度。履历信息 类,所以我可以显示4个而不是5个计算机科学成就(如果需要的话,甚至可以显示3个),以保持简历只有一页。

谅谅

php html dompdf
1个回答
0
投票

我想到了计算简历中每个元素的准确高度。例如,在我的PDF中,一行描述性文字的高度为17px(A4,高度为1122px)。

对于简历的右栏,一行文字的平均高度为78个字符。通过对描述进行strlen(),我可以很精确地估计出它的行数。

下面是我用来计算右栏高度的脚本的例子。

$q_cv_categories = $bdd->query('SELECT * FROM cv_category WHERE cv_column = "right"');
$q_cv_categories->execute();

while($cv_categories = $q_cv_categories->fetch()){

  $right_height += CFG_RESUME_PDF_CSS_MARGIN_TOP_HEADING; // margin-top of heading computer achievement, work exp, etc.
  $right_height += CFG_RESUME_PDF_LINE_HEIGHT_PX*GetResumeLineCount(constant($cv_categories['category_name']), "right", "heading"); // heading
  $right_height += CFG_RESUME_PDF_CSS_PADDING_HEADING_BLUELINE+CFG_RESUME_PDF_CSS_HEADING_GREYLINE+CFG_RESUME_PDF_CSS_HEADING_BLUELINE; // blue line of heading
  $right_height += CFG_RESUME_PDF_CSS_MARGIN_BOTTOM_HEADING; // margin-bottom of heading

  $q_cv_data = $bdd->prepare('SELECT * FROM cv_data WHERE category_id = :category ORDER BY importance DESC LIMIT 5');
  $q_cv_data->bindValue('category', $cv_categories['id'], PDO::PARAM_INT);
  $q_cv_data->execute();
  while($cv_data = $q_cv_data->fetch()){

      $right_height += CFG_RESUME_PDF_LINE_HEIGHT_PX*GetResumeLineCount(constant($cv_data['title']), "right", "title");
      $right_height += CFG_RESUME_PDF_LINE_HEIGHT_PX*GetResumeLineCount(constant($cv_data['description']), "right", "description");
      $right_height += CFG_RESUME_PDF_CSS_MARGIN_BOTTOM_RESUME_INFORMATION; // margin-bottom of resume-information

  }
  $q_cv_data->closeCursor();
}
$q_cv_categories->closeCursor();

最后一步是,如果总高度超过1100px,就以4个而不是5个计算机科学成就为例进行显示(留有22px的边距),然后再计算一次总高度,等等。

© www.soinside.com 2019 - 2024. All rights reserved.