Интервал между буквами FPDF

Я пытаюсь установить межбуквенный интервал для определенного «блока» текста в fpdf. Я искал и нашел только один способ установить межбуквенный интервал для всего документа, и даже это не сработало. Текст размещается в генераторе php fpdf.

$pdf->SetFont('Arial','b',85, LetterSpacing Here?);

Любая помощь?


person cantaffordavan    schedule 20.06.2012    source источник


Ответы (5)


Основываясь на других предоставленных ответах, я расширил класс FPDF, который мы используем, чтобы подчеркивание учитывало определенный пользователем интервал между буквами.

<?php
class Custom_FPDF extends FPDF
{
protected $FontSpacingPt;      // current font spacing in points
protected $FontSpacing;        // current font spacing in user units

function SetFontSpacing($size)
{
    if($this->FontSpacingPt==$size)
        return;
    $this->FontSpacingPt = $size;
    $this->FontSpacing = $size/$this->k;
    if ($this->page>0)
        $this->_out(sprintf('BT %.3f Tc ET', $size));
}

protected function _dounderline($x, $y, $txt)
{
    // Underline text
    $up = $this->CurrentFont['up'];
    $ut = $this->CurrentFont['ut'];
    $w = $this->GetStringWidth($txt)+$this->ws*substr_count($txt,' ')+(strlen($txt)-1)*$this->FontSpacing;
    return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt);
}
}

Пример использования теста:

$pdf = new Custom_FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial', 'BU', 11);
$pdf->SetFontSpacing(3);
$pdf->Cell(0, 10, 'Test of letter spacing with underline', 0, 1);
$pdf->SetFontSpacing(0);
$pdf->Cell(0, 10, 'Test of letter spacing with underline');
$pdf->Output();

Протестировано расширение FPDF версии 1.81.

person Tomi    schedule 01.09.2016
comment
Он делает свою работу довольно хорошо, но не работает идеально с выравниванием (в моем случае по центру) - person GDY; 18.06.2019
comment
@GDY, если вы все еще ищете решение для центрированного текста, вы можете попробовать мой ответ. - person Gavin; 12.02.2021

Это действительно позволит вам сделать интервал между буквами:

// letter-spacing (0 for normal, 0.3 = 33%, 1 = 100%) 
function SetCharSpacing($cs) { 
    $this->_out(sprintf('BT %.3F Tc ET',$cs*$this->k)); 
}

Авторы: http://fpdf.de/forum/showthread.php?t=3241

person simonthesorcerer    schedule 22.09.2015

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

Но подождите... кто-то уже сделал это!

Это здесь: дополнение FPDF от Патрика Бенни

Это настолько отличная работа, что вам даже не нужно что-то еще! :)

person Romain    schedule 22.07.2012
comment
Это хорошо работает, если вам нужно заполнить ячейку, но что, если я просто хочу увеличить расстояние между буквами на 10%? Дизайнеры/типографы часто имеют особые потребности, которые fpdf/fpdi не решает. - person qualbeen; 12.02.2015
comment
@qualbeen поздний ответ, но вы можете использовать GetStringWidth для вычисления «естественной» ширины, а затем передать 110% от этой ширины в качестве желаемой ширины ячейки в CellFit (..) с параметром force, установленным на true. - person Arthur; 02.10.2017

Поместите его в свой php-класс fpdf.

function SetFontSpacing( $size ) {
   if ( $this->FontSpacingPt == $size ) return;

   $this->FontSpacingPt = $size;
   $this->FontSpacing = $size / $this->k;

   if ( $this->page > 0 )
   $this->_out( sprintf( 'BT %.3f Tc ET', $size ) );
}

перед этим добавить глобальную переменную в класс fpdf; вар $FontSpacingPt;

Надеюсь, это поможет с последним классом fpdf.

person lionrajkumar    schedule 11.01.2016

Если вы используете эти ответы и у вас есть проблемы с текстом, выровненным по правому краю, я смог исправить это, используя приведенный ниже код. Я думаю, что это будет работать и для центрированного текста. Функция GetStringWidth не учитывала новый интервал между символами, поэтому возвращала неправильную ширину строки.

Часть, которая исправляет это: $wtf = $this->cs/4+1; и $w += $charw*$wtf;. Я не знаю, почему это работает, но примерно через час проб и ошибок и возни с разными числами и уравнениями эти числа, кажется, работают с любым значением межсимвольного интервала. Это может работать только с моим шрифтом (Roboto Condensed), поэтому вам, возможно, придется немного добавить или вычесть из 4, чтобы он работал с вашим шрифтом. Я не знаю.

Если кто-то умнее меня и может добавить реальное решение, я был бы очень признателен. Или, если это работает идеально для вас, я хотел бы услышать об этом.

protected $cs; // character spacing

// Sets character spacing (0 for normal, 0.5 = 50%, 1 = 100%)
function SetFontSpacing($cs=0)
{
    $this->cs = $cs;
    $this->_out(sprintf('BT %.3F Tc ET', $cs*$this->k));
}

function GetStringWidth($s)
{
    // Get width of a string in the current font
    $s = (string)$s;
    $cw = &$this->CurrentFont['cw'];
    $w = 0;
    $l = strlen($s);
    for($i=0;$i<$l;$i++) {
        $charw = $cw[$s[$i]];
        $wtf = $this->cs/4+1;
        $w += $charw*$wtf;
    }
    return $w*$this->FontSize/1000;
}
person Gavin    schedule 12.02.2021