2010-07-20 3 views
1

поэтому я использую FPDF в PHP, чтобы программно генерировать PDF-файл из изображений и текста (а не HTML).PHP и FPDF: вычисление ширины выравниваемого текста

Одна из самых больших проблем, с которыми я столкнулась, - это возможность разглаживания текста вокруг изображения. Мой текущий алгоритм выглядит следующим образом:

  1. Получить текст как массив слов
  2. Добавить слова по одному за раз в переменную «текущая строка», и называют GetStringWidth() на нем, чтобы определить ширину тока line
  3. Как только я достиг предопределенной максимальной ширины, я передаю текущую строку массиву строк и начинаю новую «текущую строку».

Делать это позволяет мне получить массив строк, которые не должны быть разбивающихся неправильно, однако я обнаружил, что, потому что мой текст оправдан выровнены, GetStringWidth() не может точно дать мне ширину линии, когда это было оправдано.

Я вникнул в метод FPDF MultiCell, чтобы попытаться выяснить, как он правильно разорвал текст, но не может сделать головы или хвосты. Кажется, что сводится к аналогичному алгоритму (и он пишет каждую строку с использованием Cell), но на самом деле никогда не вычисляет ширину, он выписывает «код» PDF, такой как 0.375 Tw.

Кто-нибудь знает, как рассчитать ширину выравниваемого текста, заданную строку и максимальную ширину?

ответ

2

Ответ на действительно старый вопрос.

В конце концов, я взял функцию, которая делает оправдание из библиотеки, и переписала ее, чтобы разрешить другой параметр, который заставляет его продолжать оправдывать текст даже в последней строке.

Это приведет к тому, что текст будет полностью оправдан для конкретного абзаца, после чего вы напишите окончательный абзац без параметра и не получите окончательную строку (как обычно).

0

не уверен, что это помогает, но у меня есть связанная с этим проблема - вам нужно знать, сколько линий займет MultiCell.

Я сделал это, используя GetStringWidth()/$ maxWidth и получая ceil() от этого.

Затем я смогу оценить предполагаемую высоту (поскольку я знаю высоту линии, которую я использую) и использовать эту цифру (в моем случае для переключения столбцов или нет).

Возможно, загрузка базового текста в GetStringWidth() и оценка высоты таким образом позволит вам определить подходящее место, чтобы разбить текст на несколько MultiCell().

+0

Насколько это точно для вас? Из моего первоначального вопроса я делаю что-то с тем же намерением (при котором я вручную «подсчитываю» слова в строках, которые я буду писать) –

+0

хорошо работает в тесте! Мне нужно иметь некоторые пользовательские тесты, чтобы поймать все более странные случаи ... но GetStringWidth(), похоже, возвращает правильное количество строк. – realcals

Смежные вопросы