@Comport

Как при генерации PDF в wkhtmltopdf подогнать последнюю страницу документа для корректного переноса блока с подписями?

Генерируем отчетность в PDF, используем wkhtmltopdf - длина документа бывает разной и частенько блок с подписями в конце переносится на новую страницу вследствие чего ответственное лицо отказывается подписывать пустой лист.

Покурил мануал madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf-0.9... подходящей опции вроде "~переносить на новую страницу "кусками" не менее N% от высоты страницы" (конечно же не прямо такую формулировку искал, но смысл, надеюсь, передал) - не нашел. Наверное, было бы странным разработчикам пилить такую опцию ибо, скорее, это задача самого HTML документа (вставлять разрывы).

Далее, пошел со стороны документа: первое, что приходит в голову - каким-то образом на стороне HTML размечать разрывами документ.. Может быть есть какой-то вариант с помощью CSS измерять высоту документа и вставлять разрыв размечая порциями под формат А4??

Но даже не это самое главное - разметить под А4 - это и сам wkhtmltopdf делает перенося на новую страницу то, что не влезает... Смысл то в том, чтобы контент для последней страницы перенести так, чтобы на ней не остался только блок с подписями... Понятное дело - то же самое происходит и на обычном принтере если на него, например, отправить документ из Word'a или откуда угодно еще. При этом контент может точно так же распределиться и на последнюю страницу перенесется только блок с подписями.. Что бы я сделал в таком случае - исправил бы руками - на предыдущих страницах равномерно вставил бы переносы и по чуть-чуть отрезал контент, чтобы на последнюю страницу перенеслось больше и блок с подписями не остался в гордом одиночестве. При этом на предыдущих страницах эти мои "чуть-чуть" небыли заметны..

Мысль приходит к такому выводу, что нужно сделать то же самое, только CSS'ом - после генерации HTML нужно как-то посчитать его высоту (пропорционально единицам, которые будут при печати), поделить всю длину на высоту A4 и вычислить высоту последнего блока, если она меньше или примерно равна заданной (заданная - это высота блока с подписями), то для всех предыдущих блоков уменьшить высоту так, чтобы высота последнего блока увеличилась и вставить в рассчитанные места разрывы...

Причем нужно не перестараться и не "надобавлять" контента на последнюю страницу в таком кол-ве, что он не влезет на нее ))) То есть в документе может быть 5 страниц, а может быть и 105 страниц и если отрезать просто фикс от каждой страницы, то мы рискуем получить еще N страниц и не факт, что на последней не будет той же проблемы с одиноком блоком с подписями...

В общем, чувсвтую, что вопрос выходит за рамки технологий ) и переходит в разряд логики решения задачи и танцев с бубном )))

Буду признателен за размышления и советы.
  • Вопрос задан
  • 2678 просмотров
Решения вопроса 1
@Comport Автор вопроса
В общем поразмышлял и склоняюсь к варианту при котором нужно после генерации HTML JS'сом считать высоту всего контента, затем разбивать эту высоту на А4, находить высоту последнего листа, на котором расположиться блок с подписями и проверять: если на последней странице расположился только блок с подписями, то случайным образом проходить по произвольным страницам, ставить перед последней строкой таблицы разрыв (чтобы сдвинуть строку таблицы на сл. страницу) параллельно суммируя высоту сдвинутых строки. Делать это пока высота сдвинутых строк + высота блока с подписями не будет >= {высота А4 / 2}.

Простым языком - будем сдвигать по одной строке таблицы с произвольных листов пока на последней странице таблицы ими не заполнится половина листа...

Решение конечно не очень изящное, но иного выхода я не вижу.
Можно сказать, что мой вывод это перефразированный ответ wazza (за что ему спасибо), только более конкретизированное и приближенное к нашим реалиям.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
wazza
@wazza
Попробуйте добавить в css специальный класс для последнего блока:
div.alwaysbreak { page-break-before: always; }
И затем в html добавить все что нужно для последней страницы в этот блок div.alwaysbreak. То есть чтобы внутри находился какой-то текст с подписями, а не только подписи. В таком случае этот блок всегда будет переноситься на новую страницу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы