DomPDF Рассчитать высоту каждого div, чтобы предотвратить несколько страниц - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время я создаю инструмент экспорта резюме с использованием domPDF. У меня есть БД, которая содержит все данные резюме (название, описание). С помощью oop я создаю свое резюме в формате 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 с помощью класса resume-information , чтобы я мог отображать 4 вместо 5 достижений в области компьютерных наук (или даже 3 при необходимости), чтобы сохранить резюме только на одной странице.

Спасибо

1 Ответ

0 голосов
/ 22 апреля 2020

Мне пришла в голову мысль подсчитать точную высоту каждого элемента в резюме. Например, строка описательного текста в моем 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();

Последний шаг - показать, например, 4 вместо 5 достижений в области компьютерных наук, если общая высота превышает 1100px (с полем в 22px), а затем еще раз вычислить общую высоту, et c.

...