LINUX.ORG.RU

Как определить рельную ширину текста (PHP)


0

0

Я собираюсь с помощью Zend_PDF нарезать PDF'ы. Вот есть только одна проблема, как можно определить реальную ширину строчки в зависимости от шрифта и его размера? Есть ли какие-либо библиотеки для этого?

P.S. Смотрел про PDF_stringwidth(), но она юзает pdflib, который не поддерживается, насколько я понимаю. С ps_stringwidth() тоэе не получилось разобраться

★★

В: как найти площадь ленина? О: нужно длину ленина умножить на ширину ленина

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

Мне, конечно, стало веселее от бородатого анекдота, но Вы не могли бы расшифровать, для чего Вы его тут привели?

SaBo ★★
() автор топика

У фонта можно получить глифы которые будут использоватся для написания той или иной буквы(glyphNumberForCharacter(), glyphNumberForCharacters().

У глифа можно получить ширину(widthForGlyph(), widthForGlyphs()).

Далее складывай.

roller ★★★
()
Ответ на: комментарий от SaBo

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

Но вобще задача странная, не знаю как Zend_PDF, но явовский fop, который может быть использован через cli или даже напрямую из пхп, а так же latex (который может быть использован для этих же целей тоже через cli). Могут менять межсимвольный интервал для лучшей читаемости текста, а уследить за этим сложнее.

P.S. пользовал из php fop для создания квитанций в pdf (где все ширины должны были быть точными) остался доволен.

P.P.S. если задача обратная из pdf что-то то и анекдот и всё вышепреведённое я написал зря

qnikst ★★★★★
()
Ответ на: комментарий от roller

О, спасибо, это уже что-то.
А как к glyphNumberForCharacter() обращаться? Из какого класса его доставать?

SaBo ★★
() автор топика
Ответ на: комментарий от SaBo

$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
$page->setFont($font, $size);


Вот у этого фонта и брать.
Только он там вродже в своих едегицах вернет, сконвертишь их тогда. Где то там есть готовая функция вроде.

roller ★★★
()
Ответ на: комментарий от roller

Во, нашёл в комментах:

function widthForStringUsingFontSize($string, $font, $fontSize)
{
$drawingString = iconv('UTF-8', 'UTF-16BE//IGNORE', $string);
$characters = array();
for ($i = 0; $i < strlen($drawingString); $i++) {
$characters[] = (ord($drawingString[$i++]) << 8 ) | ord($drawingString[$i]);
}
$glyphs = $font->glyphNumbersForCharacters($characters);
$widths = $font->widthsForGlyphs($glyphs);
$stringWidth = (array_sum($widths) / $font->getUnitsPerEm()) * $fontSize;
return $stringWidth;
}


Спасибо большое за помощь! :)

SaBo ★★
() автор топика
Ответ на: комментарий от roller

> У фонта можно получить глифы которые будут использоватся для написания той или иной буквы(glyphNumberForCharacter(), glyphNumberForCharacters().

> У глифа можно получить ширину(widthForGlyph(), widthForGlyphs()).


> Далее складывай.


У хода ваших мыслей есть один противный изъян: есть такая штука, как кернинг, и из-за нее ширина фактически не будет соответствовать той, которую мы получили складыванием.

shimon ★★★★★
()
Ответ на: комментарий от shimon

наверное вы правы, но мне это помогало(правда для fpdf)

roller ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.