TCPDF - номера страниц не совсем правильно выровнены

Я использую TCPDF для создания PDF-файла.

Моя проблема заключается в следующей строке из метода Footer():

$this->Cell(0, 10, 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 'T', false, 'R');

Это стандартная строка для вставки номера страницы в нижний колонтитул документа, но в выводе есть небольшое пространство справа. Вы можете увидеть это в примере 1 на веб-сайте: http://www.tcpdf.org/examples/example_001.pdf

Если я вставлю обычный текст следующим образом:

$this->Cell(0, 10, 'Foobar', 'T', false, 'R');

текст идеально выровнен по правому краю без проблем.

Покопался в исходниках, вроде что-то с кодировкой, но не очень понял.. может кто поможет?

С Уважением


person hubbl    schedule 30.03.2011    source источник


Ответы (9)


я решил это так:

$this->Cell(0, 0, $this->getAliasRightShift().$this->PageNo().'/'.$this->getAliasNbPages(), 1, 0, 'R');

если у вас больше 99 страниц, у вас снова будут проблемы с выравниванием! используйте что-то еще, чтобы создать PDF-файл вашей дипломной работы! :)

person njmu83    schedule 20.10.2011

Я решил использовать:

$txt='Page '.$this->PageNo().' of '.$this->getNumPages()

вместо:

$txt='Page '.$this->getAliasNumPage().' of '.$this->getAliasNbPages()

Итальянский перевод и обновления на Isotypelab.org

person Lorenzo De Tomasi    schedule 02.07.2012
comment
На самом деле это не работает, так как печатает страницу 1 из 1 и страницу 2 из 2. - person Mario Cesar; 07.11.2012
comment
Не работает, решение для меня - разместить информацию об этой странице, чтобы выровнять ее по ЛЕВОМУ :) - person Jawaad; 30.01.2015

Вы можете добавить номер страницы после генерации, псевдонимы не нужны. Сделайте это в конце как раз перед $pdf->Output(...);

$numPages = $pdf->getNumPages();

for($int=1;$int < $numPages + 1; $int++)
{
    $pdf->setPage($int);
    $pdf->SetY(-15);
    $pdf->SetFont('helvetica', '', 9);
    $pdf->writeHTML('Page '.$int.'/'.$numPages,true,false,true,false,'R');
}
person Roméo S.    schedule 25.02.2019
comment
Отличное решение! Кстати, если вы используете автоматический разрыв страницы, вы можете использовать $pdf->SetAutoPageBreak(false, 0); внутри цикла for после setPage(), чтобы убедиться, что добавленный контент остается на этой странице. (Поскольку вы, вероятно, рисуете внутри области полей страницы, что в противном случае привело бы к переходу на следующую страницу.) - person Philip; 01.01.2020

К сожалению, TCPDF выравнивает псевдоним и не окончательный номер, который заменяет псевдоним. Использование $this->AliasNbPages('{p}') и $this->AliasNumPage('{n}') не сильно поможет. Дополнительная прокладка останется на месте.

Единственное решение — поставить номера страниц вместо псевдонимов.

Исходная ошибка на SourceForge.net (система отслеживания ошибок TCPDF)

person melekes    schedule 29.06.2011

Поскольку мой документ не более 10 страниц, у меня есть 2 решения, дайте ему больше ШИРИНЫ (260 в моем случае, потому что у меня PDF_PAGE_ORIENTATION='L') и выровняйте 'R':

$this->Cell(260, 6, 'Page '.$this->getAliasNumPage().' of '.$this->getAliasNbPages(), 0, 0, 'R', 0, '', 0, false, 'T', 'C');

или две ячейки с WIDTH = 0, выровняйте «C» и вторую ячейку с некоторыми пробелами:

$this->Cell(0, 6, '', 0, 0, 'C', 0, '', 0, false, 'T', 'C');
$this->Cell(0, 6, 'Page '.$this->getAliasNumPage().' of '.$this->getAliasNbPages().'        ', 0, 0, 'C', 0, '', 0, false, 'T', 'C');

так что играйте с WIDTH и SPACES, если у вас более 10 страниц.

В моем случае это выровненные номера страниц справа.

person Kaax    schedule 10.03.2016

Я считаю, что проблема в псевдонимах. Это просто куски текста, ширина которых вычисляется в момент вставки, а не в момент замены их цифрами.

Таким образом, ширина текста вычисляется для строки (буквально) {np}/{nb}. И когда его заменяют числами в самом конце, 1/9 меньше этого, а 23/109 больше.

Вы можете заменить используемый псевдоним NbPages (setAliasNbPages()?) чем-то, что отражает ширину the total number of pages, если вы можете оценить, сколько их будет. И я считаю, что вы можете напрямую использовать номер текущей страницы без использования псевдонима, чтобы проблема, по крайней мере, не появлялась для этого псевдонима.

person ontrack    schedule 30.03.2011

getNumPages этого не сделает. Если у вас 3 страницы, то getNumPages() даст 1/1, 2/2 и 3/3 getAliasNbPages() даст 1/3, 2/3 и 3/3, поэтому проблема остается!

person Dany Dhondt    schedule 30.06.2013
comment
должен быть опубликован в виде комментария, что вы сможете сделать, когда у вас будет достаточно репутации :-) - person kleopatra; 30.06.2013

TCPDF выравнивает псевдоним вместо реального номера страницы. Чтобы выровнять по правому краю, не используйте псевдоним:

$pageNumber = $this->getPage();
$this->Cell(0, 10, 'Page '.$pageNumber, 'T', false, 'R');

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

person Maxence    schedule 14.10.2019

Попробуй это

$txt='Page '.$this->PageNo().' of '.$this->getNumPages()

работает на меня

person zeezoo    schedule 26.02.2013
comment
вы повторили неработающее решение: это на самом деле не работает, так как печатает страницу 1 из 1 и страницу 2 из 2 - person user2345998; 21.10.2015