• Спонсоры

  • Рубрики

  • Архивы

  • Популярное



Генерируем PDF с помощью TCPDF

Сегодня рассмотрим возможность создания PDF-файла из скрипта на PHP. Зачем нам нужно создавать PDF? Существует множество разных ситуаций, в которых это необходимо, но мы знаем точно одно – PDF как никакой другой формат отлично обеспечит точность отображения представленной в нем информации на листе бумаги. Другими словами, если мы хотим, чтобы некий документ распечатался правильно на любой системе, мы должны его подготовить в формате PDF.

Когда необходимость создать документ из PHP застала и меня, я бросился на поиски готовых решений и рассмотрел три наиболее популярных с моей точки зрения решения (может быть я и ошибаюсь):

  1. Расширение PDFLib для PHP (http://www.pdflib.com)
  2. Библиотека FPDF (http://www.fpdf.org/)
  3. Библиотека TCPDF (http://www.tcpdf.org/)

Погуляв по различным форумам и почитав про PDFLib, я решил ее не использовать, поскольку она не поддерживает UTF-8 (насколько я понял, поддерживает только платная версия), а мне именно такая возможность и была нужна. Также это расширение должно быть установлено на хостинге, где будет работать PHP-скрипт, что тоже ограничивает сферу применения скрипта.

Не зная еще про то, что FPDF тоже не поддерживает UTF-8 (но не требует дополнительных расширений для PHP), я первым делом взялся за нее, но потом тоже отбросил по понятной причине.

В итоге я узнал о библиотеке TCPDF, которая имеет поддержку UTF-8, что мне было необходимо, и которая не требовательна к функциям хостинга.

Итак, попытаемся на ее основе сгенерировать простой PDF-документ на русском языке, который будет отображаться везде (даже на тех компьютерах, где нет нужных шрифтов).

Руководство по использованию этой библиотеки я дублировать здесь не буду :). Вы с успехом сможете найти его на сайте http://www.tcpdf.org/. Там же есть примеры использования этой библиотеки с исходными кодами. Честно говоря, руководства как такового там нет, но есть справка по всем функциям и классам (http://www.tecnick.com/pagefiles/tcpdf/doc/index.html), а также различные примеры, как я уже писал предложением ранее. Из того, что там дано, несложно понять, что и как делается. Но справка по функциям, честно сказать, не очень удобна (видимо формировалась автоматически на основе комментариев в коде библиотеки).

Цель данного поста – показать, как эту библиотеку использовать, и рассказать о ньюансах использования шрифтов.

Пусть наш документ будет содержать в себе простое предложение – «Привет, Мир!», окрашенное в зеленый цвет и содержащееся в синей рамке. Пусть это предложение вместе с рамкой будет отцентрировано по горизонтали и выведено в начале листа формата A4. Мы предполагаем, что на компьютере, где этот документ будут читать, нет шрифта Arial, на котором мы напишем «Привет, Мир!» (всякое бывает), поэтому мы научимся подготавливать шрифты для их вставки в PDF, чтобы документ был автономным.

Итак, скачиваем с официального сайта библиотеку и подключаем ее, дописав несколько строк кода, которые «нарисуют» нам наш документ (предполагается, что директория tcpdf находится на одном уровне с нашим скриптом):

<?php
	require_once 'tcpdf/tcpdf.php'; // подключаем библиотеку

	// создаем объект TCPDF - документ с размерами формата A4
	// ориентация - книжная
	// единицы измерения - миллиметры
	// кодировка - UTF-8
	$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);

	// убираем на всякий случай шапку и футер документа
	$pdf->setPrintHeader(false);
	$pdf->setPrintFooter(false); 

	$pdf->SetMargins(20, 25, 25); // устанавливаем отступы (20 мм - слева, 25 мм - сверху, 25 мм - справа)

	$pdf->AddPage(); // создаем первую страницу, на которой будет содержимое

	$pdf->SetXY(90, 10);           // устанавливаем координаты вывода текста в рамке:
	                               // 90 мм - отступ от левого края бумаги, 10 мм - от верхнего

	$pdf->SetDrawColor(0, 0, 200); // устанавливаем цвет рамки (синий)
	$pdf->SetTextColor(0, 200, 0); // устанавливаем цвет текста (зеленый)

	$pdf->Cell(30, 6, 'Hello, World!', 1, 1, 'C'); // выводим ячейку с надписью шириной 30 мм и высотой 6 мм. Строка отцентрирована относительно границ ячейки

	$pdf->Output('doc.pdf', 'I'); // выводим документ в браузер, заставляя его включить плагин для отображения PDF (если имеется)
?>

Сейчас мы вывели строку «Hello, World!», поскольку по-русски мы пока вывести ничего не можем, т.к. шрифт используется стандартный – helvetica – без поддежки UTF-8.

Теперь подготовим шрифт Arial с кодировкой UTF-8. Условимся, что нам нужен пока только этот шрифт с начертанием «нормальный» (бывает еще жирный, курсивный, жирный курсив).

В TCPDF делается это не очень удобно (я бы даже сказал, очень неудобно), но скажем спасибо создателю, что хоть такая возможность есть 🙂

Все шрифты, готовые к использованию в TCPDF хранятся в папке fonts внутри директории библиотеки. Открыв ее, мы увидим множество файлов разных расширений (кстати, эта папка весит более 12 метров). Удалим все файлы, оставив только helvetica.php (т.к. она используется по умолчанию и если мы ее удалим, TCPDF работать не будет) и папку utils (она нам понадобится для подготовки файлов шрифта Arial). Теперь берем шрифт Arial (начертание — normal) из системной папки Windows (у меня Vista) – файл arial.ttf – и копируем его в папку fonts/utils.

В этой папке есть утилита ttf2ufm, которой мы должны скормить файл arial.ttf:

ttf2ufm -a -F arial.ttf

Далее запускаем скрипт makefont.php (предполагается, что путь к php есть в переменной окружения PATH системы):

php -q makefont.php arial.ttf arial.ufm

После работы данной утилиты у нас в папке utils появятся три файла: arial.php, arial.z, arial.ctg.z, которые мы должны будем переместить в папку fonts. Файлы arial.ttf и arial.ufm нам больше не нужны, поэтому можем смело их удалять.

В итоге мы подготовили шрифт Arial, который будет присоединен к формируемому PDF-файлу. Попробуем теперь вывести надпись по-русски:

<?php
	require_once 'tcpdf/tcpdf.php'; // подключаем библиотеку

	// создаем объект TCPDF - документ с размерами формата A4
	// ориентация - книжная
	// единицы измерения - миллиметры
	// кодировка - UTF-8
	$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);

	// убираем на всякий случай шапку и футер документа
	$pdf->setPrintHeader(false);
	$pdf->setPrintFooter(false); 

	$pdf->SetMargins(20, 25, 25); // устанавливаем отступы (20 мм - слева, 25 мм - сверху, 25 мм - справа)

	$pdf->AddPage(); // создаем первую страницу, на которой будет содержимое

	$pdf->SetXY(90, 10);           // устанавливаем координаты вывода текста в рамке:
	                               // 90 мм - отступ от левого края бумаги, 10 мм - от верхнего

	$pdf->SetDrawColor(0, 0, 200); // устанавливаем цвет рамки (синий)
	$pdf->SetTextColor(0, 200, 0); // устанавливаем цвет текста (зеленый)

	$pdf->SetFont('arial', '', 9); // устанавливаем имя шрифта и его размер (9 пунктов)
	$pdf->Cell(30, 6, 'Привет, Мир!', 1, 1, 'C'); // выводим ячейку с надписью шириной 30 мм и высотой 6 мм. Строка отцентрирована относительно границ ячейки

	$pdf->Output('doc.pdf', 'I'); // выводим документ в браузер, заставляя его включить плагин для отображения PDF (если имеется)
?>

Но при этом нужно учесть, что размер формируемого PDF-документа возрастет примерно на размер файла шрифта arial.z.

Также необходимо учесть, что если мы хотим вывести надпись курсивно, нам нужно будет для этого создавать отдельный шрифт ariali, или если полужирным начертанием – arialb.

В этом конечно заключается недостаток библиотеки – чем больше шрифтов используем в PDF-документе, тем он больше «весит». Создатели этой библиотеки приводят метод использования шрифтов, установленных в системе, без их присоединения к PDF-документу, но лично у меня ничего не получилось (прочитать о том, как готовить шрифты для PDF, можно в файле README.txt, который находится в папке fonts/utils).

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

Кстати, забыл написать, что TCPDF разработана как для PHP4, так и для PHP5.

А вот и получившийся документ: doc.pdf

Думаю, эта статья поможет кому-то сэкономить время на изучение этой великолепной библиотеки TCPDF 🙂

P.S. Если кто-то знает способ формирования PDF лучший (и более удобный), чем тот, что я привел – прошу в комменты 😉 Буду рад узнать о других возможностях.





Читайте также:



116 комментариев на “Генерируем PDF с помощью TCPDF”

  1. О, спасибо! Я как-то уже поднимал подобную тему, остановился на FPDF и PDFLib

  2. Полгода назад я прошел точно такой же «путь по борьбе» с PDF на PHP 🙂
    Единственная странность — чересчур большой размер документа на выходе. Т.е. понятно, что в документ включены шрифты, но у меня, простейший 2-х страничный отчет о работе менеджера (2 шрифта, 4 картинки) весил под 1.5 Мб.

  3. novice

    Видимо с этим ничего не поделаешь — из-за размера приходится ограничиваться в шрифтах.

  4. А у Zend Framework есть отдельный класс Zend_Pdf. Использовать еще не приходилось, но в документации написано буквально следующее:
    Модуль Zend_Pdf является механизмом для работы с PDF (Portable Document Format — переносимый формат документов), который написан целиком на PHP 5.
    Приходилось работать?

  5. novice

    К сожалению, не приходилось. Судя по описанию, тоже достаточно мощная библиотека для работы с PDF. У нее, видимо, даже есть возможность модифицировать ранее созданные PDF-файлы, что является преимуществом перед другими библиотеками.

  6. Евгений

    Приходилось работать с ZendPdf но еще на весрии 1.5 и были очень большие тормоза при создании файла…т.е. когда уже все определнео и идет всего этого обработка и запись в файл. TCPDF в плане скорости показал себя лучше.

    Замеров не проводил, чисто по визуальному опредлению

  7. ZlyddeN

    спасибо за статью. будет с чего начать

    >>но у меня, простейший 2-х страничный отчет о работе менеджера (2 шрифта, 4 картинки) весил под 1.5 Мб.
    а нету ли гденить в настройках скрипта чтобы задавать сжатие картинок или сокращение знакового состава шрифтов (font substitution) ?

  8. ZlyddeN

    извиняюсь — сокращение знакового состава — это subset font 🙂
    тут в самом конце есть чтото
    [ссылка]
    сейчас попробую осмыслить….

  9. novice

    ZlyddeN, по поводу сжатия картинок — попробуйте функцию setJPEGQuality. Сокращение знакового состава конечно дает уменьшение веса шрифта, но необходимо только в том случае, если Вы уверены, что будете использовать только символы определенной кодировки (на определенном языке). Если же предполагается, что шрифт будет использоваться для разных языков, то этого лучше не делать.

  10. ZlyddeN

    >>
    что будете использовать только символы определенной кодировки (на определенном языке). Если же предполагается, что шрифт будет использоваться для разных языков, то этого лучше не делать.
    >>
    я предполагал по аналогии с Acrobat Distiller — он перед внедрением в PDF сокращает знаковый состав до нужного минимума (задается в настройках). А тут как?

  11. novice

    Тут конечно нет автосокращения знакового состава. Можно сократить его вручную — инструкция по ссылке выше, оставленной вами, ZlyddeN.

  12. ZlyddeN

    >>Можно сократить его вручную

    пришел к выводу, что для моей задачи это не требуется 🙂
    но… зачем вручную.. можно к примеру каждый раз генерить шрифт с нужным знаковым составом, предварительно проанализировав текст… тока вот утилитка ttf2ufm она только пот Windows?

  13. novice

    Она под Windows, но к ней прилагаются исходники, поэтому можно перекомпилировать под Linux.

  14. ZlyddeN

    колдовал сегодня с параметрами и шрифтами.
    дано: $text в cp1251
    требуется: сделать из этого PDF с использованием Times
    проблема: шрифт идущий со скриптом не переваривает криллицу
    решение:
    1. создавать объект так:
    $pdf = new TCPDF(‘P’, ‘mm’, ‘A4’,false, ‘UTF-8’, false);
    2. генерить по мануалу шрифт, НО запускать makefont так:
    php -q makefont.php times.ttf times.afm true cp1251

  15. ZlyddeN

    3. полученные times.php и times.z перенести с заменой в папку со шрифтами

  16. ZlyddeN

    может кому и сгодится — вся семья Times тут
    Ссылка для скачивания файла: [ссылка]

  17. Зря вы так сразу FPDF отбросили 🙂 С UTF8 не пробовал, но если сконвертировать кириллические шрифты (описано в мануале), то проблем с кириллицей нет. Подозреваю, что и с UTF8 тоже не должно быть. Пара шрифтов под FPDF и подобный тьюториал — [ссылка]

  18. ovosh

    очень хорошая статья! У меня возник только один вопрос как я могу в уже имеющийся файл дописать информацию?
    Заранее спасибо!

  19. novice

    С помощью TCPDF — никак. Я и сам был бы рад узнать способ, если он существует.

  20. username

    Огромное спасибо!!
    Провел 3 дня в поисках решения генерации pdf с поддержкой юникода. Эта статья мне очень помогла

  21. Кстати, метод описанный в README.txt папки fonts\utils работает! 🙂 Мне удалось уменьшить размер минимального документа до 65 кб! Главное — в полученном .php файле шрифта закомментировать строчку «$file=…» и использовать только стандартные шрифты без пробелов в названии.

  22. germani

    Всем вечер добрый!
    Сейчас возникла нужда в пдф…. а именно bp excel->pdf что то не нашел у tcpdf этого текст выводит даже любыми цветами это все замечательно но нужно именно excel->pdf!!!
    Если знаете как скиньте ссылку благодарности не будет предела
    с ув. germani

  23. про Статью спасибо, но выбрав для себя tcpdf для реализации задачи, столкнулся с постоянными ошибками.
    Все хорошо, когда читаешь описание, смотришь примеры и документацию. Когда начинаешь что-нибудь реализовывать начинаются ошибки при открытии файла acrobate reader’ом. Особенно из-за шрифтов. Видимо внутри не хватает проверок на всякие исключения.

    Еще не понял как сделать таблицу при не одинаковой высоте ячеек. При автоматическом подборе высоты, ячейка получается с бОльшей высотой.

  24. Было бы хорошо все в chain’ах делать в библиотеке этой 🙂

  25. спасибо за статью, мне как раз не стало хватать уникода в fpdf, да и кодировку 1251 вручную там надо прописывать.
    к нему надстройка ufpdf имеется, но ее так и не заставил нормально отображать русские символы.
    тыкнулся еще в pear’овский file_pdf, но tcpdf сразу гораздо лучше показался

  26. Evgheni

    Работал с ZendPdf. Отличная библиотека, если используюте ZF то лучьшего выбора не найти. Начиная с версии 1.6 тормозов за ней не замечал. Хотя в некоторых случаях тормоза зависят от сервера и документа конечно.

  27. использую FPDF, но совет
    >>закомментировать строчку “$file=…”
    помог, но стала выскакивать ошибка при открытии pdf-ника что невозможно найти встроенный шрифт, но русский отобразился без проблем

    размер файла упал с 250кб до 40кб — что не может не радовать 🙂

    описанную мной ошибку я обшел: не закоментировал строчку а прировнял к пустой строке $file=»

    и все работает на ура!!

  28. map

    Статья очень помогла, продукт работает 🙂
    Правда не очень разобрался с качеством картинок — они как-то замыливаются в получаемом файле. Параметр setJPEGQuality (50-75-100) не влияет на качество — только размер немного экономит. Но больше всего меня напрягает высокая нагрузка сервера — файл на 40 листов (~200 картинок + текст 1 шрифт — генерится примерно 40 сек) грузит проц на 46% 🙁
    Соответственно 2 клиента с таким заданием загонят его под 100%…
    Я конечно понимаю, что десктопное железо не есть сервер…но как-то многовато имхо. Никто не смотрел у себя нагрузку?

  29. Спасибо, оч клевая статья.
    Злыдень, а выложи шрифты которые ты скомпилировал? Ариал под утф — вот это поможет еще больше. Спасибо.

  30. flee

    не как не могу понять как изменить стандартный шрифт и чтоб он понимал кирилицу… И еще как правильно собрать шрифт с помощью makefont.php на локальном компьютере?

  31. AvRUS

    Тут мною написанный скрипт генерации шрифтов для TCPDF:
    narod.ru/disk/17313273000/TCPDF_MakeRusFontsScript_1.0.rar.html

    В архиве есть описание «ReadMe_TCPDF_MakeRusFontsScript_1.0.txt». Почитайте, постарался подробно описать.
    Также в архив уже включен шрифт «Arial» с кириллицей.

    К сожалению, вывод напрямую в CP1251 победить не удалось, поэтому в работе использую «iconv(‘CP1251’, ‘UTF-8’, …)» для выводимого в TCPDF текста.

  32. shkomg

    супер статья, все помогло. я в основном перегоняю картинки в пдф — так вот эта tcpdf тормозит порядочно, но работает. и для картинок пришлось на хостинге увеличить оперативки лимит до 100Мб и с 30 сек до 5 минут поднять время выполнения скрипта (но в принципе за 3 минуты справляется). после этого как часы работает. я так понимаю все тормоза и ресурсы идут на перегонку jpg под формат листа А4. спасибо.

  33. Art

    Спасибо, Ваша статься очень помогла. Хорошо написана, и прочитав пару абзаыев, выполняя всё, создал шрифт и перенёс всё с fpdf на tcpdf. Теперь у меня и русские и французкие буквы нормально отображаются в utf-8.

    Спасибо

  34. Kio

    Спасибо, статья помогла.
    Но у меня так же (как и у map) беда с качеством картинок — они получаются размытые. setJPEGQuality не помогает (
    Да и размер получаемого файла не радует, уж очень он большой.

  35. Fros

    Привет всем.
    А у меня первый пример не работает ))) Пишет:

    Warning: Cannot modify header information — headers already sent by (output started at /home/www/proba.php:14) in /home/www/tcpdf/tcpdf.php on line 5474
    TCPDF ERROR: Some data has already been output to browser, can’t send PDF file

    Куда копать не подскажите? Спасибо

  36. AvRUS

    Fros, возможно где-то допустили пробел в коде страницы (или перенос строк).
    Возможно до тега . Скорее всего после.

    Посмотрите исходный код сгенерированной страницы.

  37. Fros

    С этим разобрался, просто до хедер никаких выводов не должно быть, в се работает. Теперь проблема с русским шрифтом.
    Вот это не получается запустить:
    php -q makefont.php arial.ttf arial.ufm
    Я ток понимаю это тоже из командной строки как утилиту ttf2ufm?

  38. Fros

    пишет ,что php не является внутренней или внешней командой

  39. Fros

    Все разобрался, не было php-cli, как раз который и отвечает за php в командной строке. Все работает спасибо за статью.

  40. maxfinger

    Сделал все как описано но после цитирую:

    (Далее запускаем скрипт makefont.php (предполагается, что путь к php есть в переменной окружения PATH системы):
    php -q makefont.php arial.ttf arial.ufm)

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

  41. Татьяна

    Такая же ерунда — запускаю php -q makefont.php arial.ttf arial.ufm и ничего. Может кто-нибудь выложит хотя бы arial? пожалуйсто!

  42. map

    2Kio
    С картинками я разобрался — параметры юзал не те…
    было
    $pdf->Image($image,$X,$Y,$w,$h,»,$link,»,true,72,»,false,false,1);
    стало
    $pdf->Image($image,$X,$Y,$w,$h,»,$link,»,false,72,»,false,false,1);
    и всё ок — качество на уровне
    джипеги жму через xnview в 50% качестве — полностью устраивает и по размеру тоже…
    кстати, заметил, если вставлять прозрачный png — весь документ как бы преобразуется со сглаживанием…

  43. Александр

    Русские буквы не выводятся

    Собрал шрифты по инструкции,всё нормально,скопировал в папку fonts, но русские буквы не выводятся,вместо них пустое место.
    Пробовал пример указанный на сайте.
    Куда копать подскажите пожалуйста?

  44. Анатолий

    Спасибо большое!

    Статья позволила сэкономить немало времени!

  45. Димон

    А как направить не в браузер а в файл?

  46. map

    2Димон
    Output( [string $name = ‘doc.pdf’], [string $dest = ‘I’])

    I: send the file inline to the browser (default). The plug-in is used if available. The name given by name is used when one selects the «Save as» option on the link generating the PDF.
    D: send to the browser and force a file download with the name given by name.
    F: save to a local file with the name given by name.
    S: return the document as a string. name is ignored.

  47. Рашит

    Спасибо большое за статью, очень помогла она мне.
    Но остался не решенным один момент: когда я вытаскиваю из базы данных строку с русским текстом и пытаюсь ее вывести в генерируемый pdf-документ, то вылезают кракозябры. Менять кодировку таблицы в базе данных пробовал, не помогло. Помогите пожалуйста!

  48. map

    2Рашит
    это проблема кодировок — нада подбирать, генерить. я не победил — вывожу текст через
    $out_txt=iconv(«WINDOWS-1251″,»UTF-8»,$in_txt);
    используя dejavuserif из поставки

  49. fpdi может загружать текущие PDF.

    Чтобы использоватm PDF как шаблон я делал следующее, когда мне понадобилось формировать квитанцию по заказу в интеренет-магазине:
    Взял fpdi, который не работает нормально с юникодом и добавил к ufpdf, который с юникодом какраз работает, но не умеет загружать. Подставив в последний родителем fpdi вместо базового fpdf ну и незначительно подкоректировав ошибки имею в своем фрэймворке нормальную связку для загрузки и редактирования юникодных документов.

    Полагаю нету никакх проблем использовать tcpdf вместо ufpdf, но я не пробовал.

  50. peetonn

    привет!
    а у меня такая проблема: не работает поиск по документу через Preview (Mac OS) для моего шрифта (Georgia или Times). шрифт делал как в статье, все отображается прекрасно как лоя русских так и для английских букв. но поиск не работает ни по тем, ни по другим. оО
    что делать?

  51. AvRUS

    Актуально для новых версий TCPDF.
    Если у Вас возникли проблемы с определением кириллических шрифтов (Arial) в конечном PDF-документе, то необходимо переопределить функцию «_puttruetypeunicode». Это можно сделать, создав наследуемый от TCPDF класс (дальнейшую работу надо будет вести с ним). Код:
    class reportPDF extends TCPDF {
    protected function _puttruetypeunicode($font) {
    $font[‘subset’] = »;
    parent::_puttruetypeunicode($font);
    }
    }

  52. Merfi

    Здраствуйте! Как именно работать с етой функцией? пробовал пример
    из статьи с руским шрифтом, отображаются квадратики:(

  53. lericen

    Уважаемые, выложите пож-ста рабочий пример с кириллицей. Не могу разобраться.

  54. AvRUS

    В архиве собранный шрифт Arial для TCPDF (все файлы поместить в папку «fonts»).
    Не забудьте для работоспособности оставить файлы шрифта «helvetica». Остальные (если Вы их не используете) можно удалить.
    Файлы сгененированы с помощью скрипта (чуть выше на этой странице).

  55. Василий

    Никак не могу понять следующую ситуацию:
    беру за основу пример №6 из папки exmples и видоизменяю под свои нужды сохраняю => запускаю и отлично все работает!!!
    Теперь беру и переношу в другую папку, меняю путь к библиотеке => запускаю и НИЧЕГО!!! Только отображается header и footer, а то что я делал НЕТ!!!
    Что делать??? Где баг???
    Пишите…

  56. Василий

    Привет.
    Помогите разобраться, с TCPDF у меня возникла следующая проблема:
    по примеру 006 с сайта разработчика TCPDF создал страницу и переменной $view присваиваю значение переменной в которой хранится html код построения таблицы, после чего вызываю перемеменную $view для создания pdf документа при помощи функции TCPDF writeHTML.
    В результате генерируется пустая стрнаица формата PDF.

    Что делать? Где ошибка?

    Если же переменной $view напрямую присваивать весь код HTML таблицы как строковую переменную (т.е. $view = ‘
    Hello World!!!’;) то все выполняется на ура за считанные секунды.

    Где ошибка???

  57. Василий

    Hello World!!! зашита в таблицу как положено (table tr td Hello /td td World!!!/td /tr /table).
    Видимо при добавление комментария удаляются HTML теги.

  58. Отличная статья!
    Действительно реально подсобило. Вдоволь натрахавшись с FPDF решил перейти на TCPDF. Прочитал твой труд и с первого раза всё настроил! Спасибки!

  59. Виктор

    Использую arial. pdf-ка формируется. Но не показывается шрифт B. Ни прямое указание типа SetFont(‘arial’, ‘B’, 14, », true); ни указание $html = ‘заголовок‘; $pdf->writeHTMLCell(0, 0, 0, 0, $html, 0, 0, 0, true, ‘L’, true); не показывают жирным, а показывают нормальным шрифтом. Что не так?

  60. Рекомендую всем попробовать как альтернативу mPDF В последней пока еще бета версии 5 есть возможность использовать непосредственно ttf шрифты и по сравнению с TCPDF генерирует гораздо быстрее. (просто никак не смог заставить TCPDF понять шрифт verdana bold поэтому пришлось искать альтернативу)

  61. Василий

    Здравствуйте сейчас я столкнулся с следующей проблемой.
    при испоьзование функции TCPDF writeHTML вывожу следующий текст:
    Пример заголовка!
    Пример первой строки абзаца
    Жирный текст
    Наклонный текст
    Подчеркнутая строка
    bbiЕРАЛАШbib
    не производится выделение жирным, применения курсивного начертания, подчеркивания.

    Я подозреваю, что проблема в шрифте. Текст я вывожу при помощи шрифта times обычный.
    Прошу Вас порекомендовать какой шрифт лучше использовать?

    На сайте разработчика tecnick.com для демонстрации вышеуказанных возможностей используется шрифт helvetica который является универсальным для вывода обычного и жирного шрифта, а есть ли такой шрифт для вывода РУССКИХ БУКВ!

    Народ жду Ваших советов!

  62. AvRUS

    Виктор, а у Вас шрифты размещены точно по правилу?

    1. Convert all font filenames to lowercase and rename using the following schema:

    * [basic-font-name-in-lowercase].ttf for regular font

    * [basic-font-name-in-lowercase]b.ttf for bold variation

    * [basic-font-name-in-lowercase]i.ttf for oblique variation

    * [basic-font-name-in-lowercase]bi.ttf for bold oblique variation

    Надо выкладывать не просто arial, но и его вариации начертания (извиняюсь, если термин неверен). Т.е.:

    arial.ttf — обычный

    arialb.ttf — жирный

    ariali.ttf — наклонный

    arialbi.ttf — жирный наклонный

    При наличии данных файлов должно все работать, как надо.

  63. Василий

    Для AvRUS
    Cформировал все вариации шрифта times, но всеравно жирным не выделяется!
    А у Вас, что работает при подключение всего одного шрифта arial?

  64. Спасибо, юзабельно…

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

  66. Василий

    Здравствуйте AvRus
    последовав Вашим рекомендациям я изменил стоявший по умолчанию шрифт helvetica на times в следующих файлах tcpdf_config.php и tcpdf_config_alt.php.
    TCPDF стал понимать тег strong и i, но вместо букв выводит знаки вопроса.
    Из-за чего это происходит? Правильно ли я определил по умолчанию шрифт times?

    Все вариации шрифта times присутствуют и сконфигурированы правильно. Все проверены!

  67. Вообще, основной файл — tcpdf_config.php. Так что менять можно только в нём.

    У Вас кодировка UTF-8? Если нет, то надо в неё конвертировать перед выводом.

    Если же все уже сделали, то выложите заархивированную папку с TCPDF в сободный доступ. Я скачаю и посмотрю в чем может быть проблема.

  68. zman

    русский шрифт trebuchet с поддержкой UTF
    ifolder.ru/20550864

  69. Есть следующая проблема:
    При генерации html кода через метод writeHTML появляются лишние переносы строк. Например текст сверху страницы, потом переносы и текст внизу. Такой баг может появится на нескольких страницах, может на одной, а может и вообще не быть. Кто-нибудь встречался с такой проблемой?

  70. Васлий

    Здравствуйте AvRus!
    С русским языком у меня TCPDF работает отлично!
    Однако возникла необходимость использования казахского языка и все пошло не лучшим образом. Вместо специфичных символов казахского языка появляются кое-где квадратики или вообще пустое место.
    я так понял, что это баг TCPDF, т.к. эти же данные при выводе на страницы сайта выводятся правильно!
    Буду рад услышать от Вас полезные советы, которые помогут разрешить эту загадку.

  71. SuperAnt

    Огромное спасибо!
    Сегодня пол дня убил с кириллицей библиотеки FPDF, а позже обнаружил библиотеку TCPDF с поддержкой utf-8, что очень приятно. Но сразу не разобрался, Ваша статья очень облегчила путь изучении.

  72. cp1251

    Блин, utf мастдай! ufpdf с кириллицей работал на ура и шустро. Tcpdf надо юзать только из-за того, что требуется текст выводить вверх ногами. В итоге полная фигня с кириллицей. Перепробовал все возможное, ничего не катит. Сайт и БД в 1251. До кучи генерация 4-х крошечных строк текста по 20-40 символов в tcpdf занимает более 2-х минут. Что за ересь?
    tcpdf фоследней версии.

  73. cp1251

    Хочется ругаться матом.
    Если вы используете шрифт Arial, то надо его либо как-то хитро переименовать, либо сделать то, что я сделал. В tcpdf производится «нормализация» имени семейства шрифта. Иными словами, если вы используете не юникодную версию и семейство arail, то она приводит семейство к helvetica и все ваши потуги запустить русский шрифт Arial в cp1251 идут в пешее эротическое дружным строем.

    Я закомментарил в функции AddFont библиотеки tcpdf строки:
    if ((!$this->isunicode) AND ($family == ‘arial’)) {
    $family = ‘helvetica’;
    }
    и о чудо! оно заработало. С другими шрифтами не проверял.

    Однако неимоверные тормоза победить не удалось. Вывод 5 коротеньких строчек занимает более 2-х минут и 46% процессорного времени после чего отлетает по таймауту 🙁 Причем если убрать хотя бы одну строку, генерация идет влет. Мистика.

  74. UTF наоборот, маст хэв. Это умереть должны сайты и скроипты юзающие однобайтовые кодировки! Тогда и проблем не будет.

  75. Василий

    Спасибо!
    Очень помогло в работе. Инструкция по шрифтам особенно.

  76. Сергей

    Одно время тоже намучился с шрифтами и с библиотеками, пришел к dompdf(она почти идеально подходила для поставленной задачи) правда пришлось допиливать немного. А так как перегон с html2pdf очень удобна с поддержкой css

  77. Эльвира

    А кто-нибудь пробовал подписывать с помощью ЭЦП pdf-документы, сгенерированные TCPDF, на этапе генерации?

  78. Oleg

    кто знает как решить проблему:
    в div вписывается текст «????», в окне браузера он нормально отображается, а в PDF’е, сгенеренном через TCPDF — квадратами. С кодировкой всё нормально, везде UTF-8. в Чем трабла?

  79. kalabro

    Привет. Спасибо за статью.
    Кстати, при генерации шрифтов mbstring.func_overload должен быть установлен в 0, иначе gzuncompress не заработает.

  80. Silence

    Добрый день.
    Все сделала, как описано в статье.
    Шрифт arial работает, только не выводит символ №.
    Что делать, подскажите пожалуйста?!

  81. cp1251

    У меня нормально работает. Но я не заморачивался на utf и делал, как писал 7 постами выше. Откуда брал шрифт не помню, но делал его не для utf версии, вроде бы.

  82. Чоп

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

    /************************ Начало
    rem Стоит сборка XAMPP
    rem [ссылка]
    rem [ссылка]

    rem путь к tcpdf
    rem D:\xampp\htdocs\tcpdf\fonts\utils — сюда скопировать файл шрифта

    rem путь к php
    rem D:\xampp\php\

    rem вместо «arial» поставить имя конвертируемого файла
    set font=arial

    del /q D:\xampp\htdocs\tcpdf\fonts\%font%.*

    cd D:\xampp\htdocs\tcpdf\fonts\utils && d:

    ttf2ufm -a -F %font%.ttf

    rem выбрать вариант Windows.7 или Windows.XP
    rem для Windows.7:
    D:\xampp\php\php-win.exe -q makefont.php %font%.ttf %font%.ufm

    rem для Windows.XP:
    rem php -q makefont.php %font%.ttf %font%.ufm

    del /q D:\xampp\htdocs\tcpdf\fonts\%font%.*

    move /y D:\xampp\htdocs\tcpdf\fonts\utils\%font%.z D:\xampp\htdocs\tcpdf\fonts
    move /y D:\xampp\htdocs\tcpdf\fonts\utils\%font%.php D:\xampp\htdocs\tcpdf\fonts
    move /y D:\xampp\htdocs\tcpdf\fonts\utils\%font%.ctg.z D:\xampp\htdocs\tcpdf\fonts

    del /q D:\xampp\htdocs\tcpdf\fonts\utils\%font%.afm
    del /q D:\xampp\htdocs\tcpdf\fonts\utils\%font%.ufm
    del /q D:\xampp\htdocs\tcpdf\fonts\utils\%font%.t1a
    /************************ Конец

  83. Naz

    Спасибо большое, мне очень помогло!

  84. Да все работает, но есть одно но!
    Если отправляю на gmail и смотрю с их web интерфейса(не загружая на локал, там есть такая возможность) то шрифта русского вообще не видно.
    Если pry=грузить все нормально,
    через web интерфейс яндекс — все нормально,
    в gmail не показывает.

    Использую trebuchet или dejavusanscondensed (т.к. они поддерживают юникод)

    Проверьте пожалуйсто на gmail у меня ли одного такой баг?

  85. Олег

    скачал отсюда ([ссылка]) tcpdf_5_9_136 распаковал, а папки «utils» нет и соответственно и утилиты ttf2ufm также нет. Скажите где можно взять ttf2ufm.exe?

  86. Олег

    Далее запускаем скрипт makefont.php (предполагается, что путь к php есть в переменной окружения PATH системы)
    А если путь в переменной окружения не хранится то как тогда указать? Запускал ttf2ufm -a -F arial.ttf файлы получил, а вот второй пункт сколько ни запускал файлы нужные не дает.

  87. cp1251

    Олег, я вообще под денвером все делал. Никаких переменных окружения. Заинклюдил makefont.php в своем и вызвал функцию с передачей имен файлов шрифтов в параметрах. Примерно так:

    Далее обратился к своему файлу в браузере.

  88. cp1251

    Блин, код не прицепился.

    require(‘makefont.php’);
    MakeFont(‘arial.pfb’, ‘arial.afm’, true, ‘cp1251’);

  89. Олег

    Скачал fpdf и там была папка makefont это подойдет? После запуска утилиты у меня появилось три файла(t1a,ufm,afm) куда их дальше? require(’makefont.php’);
    MakeFont(’arial.pfb’, ‘arial.afm’, true, ‘cp1251?);
    это подключается где формируем pdf? и как получить arial.php, arial.z, arial.ctg.z?

  90. cp1251

    Сначала мы должны из файлов шрифтов (*.ttf, к примеру) получить метрики, которые сможем использовать для создания наших шрифтов, которые уже и будут нужны для PDF.

    Значит, получил ты t1a,ufm,afm. Собираешь все файлы со шрифтами, включая и эти полученные в одной папке. Для простоты дела кидаешь в эту же папку makefont.php. Это и есть утиль по конвертации.

    Если сидишь под денвером, то сделай еще один php файлик, например, conver.php, примерно такого содержания:
    require(’makefont.php’);
    MakeFont(’arial.ttf’, ‘arial.afm’, true, ‘cp1251?);

    Последнюю команду повтори сколько нужно тебе шрифтов, названия меняй. Кодировку тоже поставь, какую нужно. Однако есть тонкость, что для кодировки и утилита должна быть соответствующей. Я делал уже не помню чем, поэтому у меня и был файл шрифта с расширением *.pfb вместо *.ttf.

    Далее вызываешь в браузере convert.php. А дальше по инструкции: После работы данной утилиты у нас в папке utils появятся три файла: arial.php, arial.z, arial.ctg.z, которые мы должны будем переместить в папку fonts. Файлы arial.ttf и arial.ufm нам больше не нужны, поэтому можем смело их удалять.

    У меня сусбурно получилось объяснить. Во первых у меня были грабли с кодировкой UTF, во-вторых, она мне нафиг не нужна. В-третьих, я использовал утилиту не от TCPDF, а от FPDF и именно по причине ненужности UTF. Словом, тут придется поломать голову и немного поэкспериментировать. Основные грабли у меня были со шрифтом arial. Из-за его названия. Я писал тут в камментах. Поэтому для теста возьми ЛЮБОЙ шрифт НЕ из СЕМЕЙСТВА arial, например courier.

  91. Олег

    Поместил в папку fonts/utils/ makefont.php и ttfparser.php поскольку в makefont.php он подключается. Создал файл с содержанием require_once($_SERVER[‘DOCUMENT_ROOT’].’/tcpdf/fonts/utils/makefont.php’);
    MakeFont(‘times.ttf’, ‘times.ufm’, true, ‘koi8-u’);
    и выдает ошибку Error: Font file not found: times.ttf ЧЕГО ТО ВООБЩЕ НИ КАК НЕ ДОГОНЮ

  92. cp1251

    Все ОК. Только файлы times.ttf и times.ufm помести в ту же папку /tcpdf/fonts/utils/ , либо пропиши пути к ним в функции. Дальше будем по факту разбираться.
    Кстати, такую кодировку я не пробовал.

  93. Олег

    Содержимое файла который открываю в браузере
    require($_SERVER[‘DOCUMENT_ROOT’].’/tcpdf/fonts/utils/makefont.php’);
    MakeFont(‘arial.ttf’, ‘arial.ufm’, true, ‘cp1251’);

    Поместил все в одну папку вот ошибка
    Deprecated: Function set_magic_quotes_runtime() is deprecated in Z:\home\test_pdf\www\tcpdf\fonts\utils\makefont.php on line 297

    Warning: file(Z:\home\test_pdf\www\tcpdf\fonts\utils/1.map) [function.file]: failed to open stream: No such file or directory in Z:\home\test_pdf\www\tcpdf\fonts\utils\makefont.php on line 12
    Error: encoding not found: 1

  94. cp1251

    Ну по первой ошибке вроде бы и так все понятно.

    А по второй он не нашел файл 1.map. А что это вообще за файл и откуда он взялся? Файлы *.map лежат в папке tcpdf\fonts\utils\map и отвечают за маппинг кодировки. Т.е. нельзя указать кодировку, если для нее в этой папке нет соответствующего map-файла.

  95. Andry

    Добрый день!
    Если вас не затруднит, то можете ли рассказать, как выводить текст, повернутый на 90 градусов, в ячейках таблиц?

    То есть, присутствует таблица с узкими вертикальными ячейками. Следовательно текст должен писаться или сверху вниз (по одной букве), или нужно строки развернуть на 90 градусов. Общая длина строки может быть больше, чем высота ячейки. Следовательно нужен автоматический перенос по словам.

    Внесу свои пять копеек в обсуждение библиотеки. Сам использую шрифт aricyr. В нем документ генерируется быстро и с русскими буквами.
    Если есть проблемы с кодировкой базы данных, то использую
    $naim_ocen=iconv(«CP1251», «UTF-8», $naim_ocen);

  96. cp1251

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

    Смотри методы
    StartTransform();
    к примеру, MirrorP(253.0, 167.2);
    ….обычный набр команд
    StopTransform();

    Хоть в зеракльном отражении печатай.

  97. Виктор

    Цепляем шрифты ttf прямо из скрипта
    $pdf->addTTFfont(‘/path-to-font/micross.ttf’, ‘TrueTypeUnicode’, », 32);
    $pdf->SetFont(‘micross’, ‘B’, 16, », ‘false’);

  98. pavlos

    А как запретить разрыв штмл таблицы при переходе на новую страницу. По умолчанию табличка рвётся вместо того чтоб переноситься целиком.

  99. aaa

    Решил проверить на локальном сервере,

    Выдает ошибку

    Warning: Cannot modify header information — headers already sent by (output started at S:\home\all.loc\www\phppdf\cli.php:1) in S:\home\all.loc\www\phppdf\tcpdf\tcpdf.php on line 8841
    TCPDF ERROR: Some data has already been output to browser, can’t send PDF file

    Подскажите, что делать

  100. cp1251

    Проблема не в библиотеке, а в ваших скриптах. Где-то в php-файле присутствует пробел в самом начале перед <?php. Но можно проверить и в библиотеке на тоже самое.

  101. Николай

    Предлагаю выложить готовый нормальный вариант tcpdf в архиве со всеми шрифтами. У меня проблема — в папке utils ничего кроме шрифтов нет. Я не могу преобразовать arial.

  102. Друзья, поделитесь рабочим вариантом, пожалуйста.

  103. Анастасия

    аналогичная ошибка.
    Warning: Cannot modify header information — headers already sent by (output started at Z:\home\localhost\www\test_pdf\new.php:1) in Z:\home\localhost\www\test_pdf\tcpdf\tcpdf.php on line 9009
    TCPDF ERROR: Some data has already been output to browser, can’t send PDF file
    уже чего только не перепробовала.и кодировки файлов меняла и разные версии php. кто сталкивался и все получилось. помогите пожлста !

  104. Анастасия

    ооооооой. вот это жесть. вообщем если с arial ничего не получается,вот вам мой совет, забейте на него используйте те шрифты, которые есть.
    freemono, dejavusans. ну это пока то что я поэксперементировала. выводит отлично и русский алфавит тоже.
    при этом в самом начале скрипта вызовете функцию ob_end_clean().
    ответ на это нашла вот здесь blog.codething.ru/posts/tag/fpdf

  105. Ребят. У кого все получилось с генерацией шрифтов, выложите пожалуйста Arial, Times, Tahoma. Спасибо большое

  106. Виктор

    Умоляю, выложите правильные шрифты. Скачал тут архива, но они не «работают».

  107. lericen

    моя аська 485695062 отпишись вышлю

  108. mrio

    А я вот столкнулся с такой проблемой.
    Мне нужно выводить шрифты в кривых, для дальнейшего сохранения. Уже все перепробовал.
    Выводит кириллицу нормально, сохраняет тоже норм, а потом открыть в короле текст квадратиками.
    Решение задачи просматривается преобразовать текст в кривые. Но как это сделать????

  109. Проблема с кириллицей возникает в Firefox. В Опере и Хроме проблем с имеющимися по дефолту шрифтами нет.
    Откройте ссылку в разных браузерах и убедитесь сами 🙂
    tcpdf.org/examples/example_008.pdf

    я использовал вот такой шрифт из комплекта поставки tcpdf
    $pdf->SetFont(‘dejavusans’, », 9); // устанавливаем имя шрифта и его размер (9 пунктов)

  110. […] источник: http://i-novice.net/generiruem-pdf-s-pomoshhyu-tcpdf/ […]

  111. еее

    Сначала мы должны из файлов шрифтов (*.ttf, к примеру) получить метрики (ttf2ufm.exe -a -F шрифт.ttf
    ), которые сможем использовать для создания наших шрифтов, которые уже и будут нужны для PDF.

    Значит, получил ты t1a,ufm,afm. Собираешь все файлы со шрифтами, включая и эти полученные в одной папке

    экзамплс.

    Запускаем их папки экзамплс файл font_creation.php с нужной первой строчкой
    $fontname = $pdf->addTTFfont(‘/path-to-font/DejaVuSans.ttf’, ‘TrueTypeUnicode’, », 32);
    (в какой-нить экзампл проще всего вставить и переименовать)

    типа
    $fontname = $pdf->addTTFfont(‘cour.ttf’, ‘TrueTypeUnicode’, », 32);

    все!!!

  112. murfel

    В одной из последних версий автор изменил метод конвертирования шрифта. Утилита для этого — tools/tcpdf_addfont.php. Использование (php -q tcpdf_addfont.php -h):

    php -q tcpdf_addfont.php -i Font_for_adding.ttf

  113. Роман

    Как сделать переносы.. например есть какой-нибудь блок или таблица, то если таблица или блок целиком не влазит на страницу, она отображалась на следующей, а не на той же с продолжением на след ???

  114. AlexSes

    В плагине FF — предварительный просмотр и печть во всех примерах (в т.ч. и родных) tcpdf с одной страницей выходит 2-я пустая страница. Как побороть, есть мысли?
    Спасибо заранее!

  115. Vitalii

    Касательно русских шрифтов под кодировку UTF-8, танцы с бубнами закончились. У библиотеки появился прекрасный метод addTTFfont(), который позволяет перекодировать любой TTF файл для работы с этой библиотекой.
    Конкретика:
    1. создаем файл php (например addmyfont.php)
    2. в файл пишем следующий код:
    addTTFfont(‘tcpdf/fonts/arial.ttf’,’TrueTypeUnicode’, », 32);

    // tcpdf/fonts/arialbd.ttf — это путь к TTF файлу
    // сам файл arialbd.ttf можно из c:\Windows\Fonts\
    // далее его скопировал в БИБЛИОТЕКУ TCPDF в папку fonts
    // остальное по образцу
    ?>
    3. После того как вы скjпировали arial.ttf в нужную директорию (в моем случае tcpdf/fonts/). Запускаете из браузера созданный вами скрипт addmyfont.php
    ВСЕ!!! ГОТОВО!!! В указанной вами директории появится три дополнительных файла (в данном случае) :
    — arial.php
    — arial.ctg.z
    — arial.z

    В файле где создаете pdf подключаете созданные вами шрифты командой setFont(‘arial’,»,null,»,’false’);
    Всем удачи!!!

  116. Тимур

    Спасибо за статью. Помогла. Генерирую файлы с русскими шрифтами без проблем. Однако, возникла загвоздка — не получается добавить арабские шрифты в файл. Как думаете, возможно решить эту проблему?

Оставить комментарий


© 2008 - 2017 i-novice.net | Все права защищены.