Задача про переводы строк

Присказка

В одной славной компании жил да был славный операционный отдел, который считал сметы клиентовы и высылал их почтою. И всё в этом отделе шло замечательно, да только смета была некрасивой. Кручинились операционисты, что шаблон у них был неказист да плох. Обратились тогда они к красным молодцам из IT-отдела, мол, помогайте, братцы.

Долго ли коротко сражались славные программисты с чудищами заморскими, что в народе кличутся MS Excel и LibreOffice Calc. Да только упёрлись в проблему невиданную, мудрёную. Не умеют чудища считать высоту ячейки, если в свойствах оной стоит галочка “Переносить по словам”, да текста много. А коли высота ячейки не рассчитана, то срам и лезет в смету.

Дано

Список услуг в виде строк текста разной длины:

1. Услуги по организации проживания
2. Авиабилет Сидоров С. Кемерово-Москва-Кемерово 17.09-20.09.2019
3. Аэроэкспресс. Пассажир: Сидоров Сидор Сидорович. Дата отправления: 2019-09-20.  г. Москва, отель Россия, Чистопрудный бул., дом 11 (Мероприятие в дивизионе -)

Задача минимум

Разбить строки с ограничением по ширине в пикселях, как это делают Excel и Calc.

Считаем, что ширина ячейки равна 200px, а текст напечатан шрифтом NotoSerif 11pt. Слова могут переноситься только целиком. Результат должен получиться следующим:

Строка 1:
    Услуги по организации 
    проживания

Строка 2:
    Авиабилет Сидоров С. 
    Кемерово-Москва-
    Кемерово 17.09-20.09.2019

Строка 3:
    Аэроэкспресс. Пассажир: 
    Сидоров Сидор 
    Сидорович. Дата 
    отправления: 2019-09-20.  
    г. Москва, отель Россия, 
    Чистопрудный бул., дом 
    11 (Мероприятие в 
    дивизионе -)

Задача максимум

Сформировать xlsx-файл, в котором высота строк задаётся в зависимости от содержимого ячеек. Файл должен одинаково отображаться в Excel и Calc.

PHP-код

<?php

$font  = realpath('NotoSerif-Regular.ttf');
$size  = 11;
$width = 200;

$orderLines = [
    'Услуги по организации проживания',
    'Авиабилет Сидоров С. Кемерово-Москва-Кемерово 17.09-20.09.2019',
    'Аэроэкспресс. Пассажир: Сидоров Сидор Сидорович. Дата отправления: 2019-09-20.  г. Москва, отель Россия, Чистопрудный бул., дом 11 (Мероприятие в дивизионе -)',
];

$splitLine = function($text, $font, $size, $width) {
    // Разбиваем текст на строки с ограничением по ширине
};

foreach($orderLines as $i => $line) {
    echo "Строка ", $i + 1, ":\n    ", join("\n    ", $splitLine($line, $font, $size, $width)), "\n\n";
}

Хорошая задача, мне понравилась. Оставлю отзыв!