PHPWord — створення MS Word документів засобами PHP

24

Від автора: не так давно на нашому сайті були опубліковані уроки по роботі з таблицями Microsoft Excel засобами мови PHP, які викликали значний інтерес у нашої аудиторії та тому, сьогодні я вирішив показати Вам, як створювати документи Microsoft Word ,формат .docx, використовуючи потужну бібліотеку PHPWord.

PHPWord — створення MS Word документів засобами PHPPHPWord — створення MS Word документів засобами PHP

Актуальну версію бібліотеки PHPWord, ви знайдете на сервісі GitHub.

PHPWord — створення MS Word документів засобами PHP

На цій сторінці наведено короткий опис і інструкція по установці бібліотеки. Але дана інструкція дуже обмежена і не описує всіх можливостей бібліотеки, тому, офіційну PHPWord документацію для розробників, Ви знайдете за посиланням.

PHPWord — створення MS Word документів засобами PHP

Установка PHPWord

Установка PHPWord, може бути виконана двома способами. Перший спосіб – ручний, при якому Ви завантажуєте архів з останньої актуальної версії PHPWord, далі, виконуєте розпаковування, копіюєте файли у власний проект і підключаєте на відповідних сторінках. Тобто досить стандартний спосіб. І другий – так сказати, автоматичний спосіб установки, використовуючи інструмент Composer, який ми будемо використовувати в даному уроці.

До речі, Ви, напевно, помітили, що в своїх уроках, для встановлення різних бібліотек, я закликаю Вас використовувати Composer. Так як для простих проектів, в ручну, цілком можна завантажувати необхідні елементи, але якщо ми працюємо над більш складним скриптом, то часом важко завантажити всі необхідні елементи і правильно їх установити.

Отже, відкриваємо » командний рядок і переходимо в каталог нашого проекту, використовуючи команду «CD ім’я папки».

PHPWord — створення MS Word документів засобами PHP

Далі, використовуючи конструкцію «composer require», вказуємо з якої бібліотеки «залежить» наш проект і виконуємо інструкцію.

composer require phpoffice/phpword

PHPWord — створення MS Word документів засобами PHP

Після того як Composer, завершив завантаження і установку бібліотеки, необхідно підключити файл autoload.php, який розташований в папці vendor, до Вашого проекту.

require ‘vendor/autoload.php’;

Далі, створюємо об’єкт головного класу бібліотеки.

$phpWord = new \PhpOffice\PhpWord\PhpWord();

Зверніть увагу, що PHPWord, у своїй структурі, використовує простору імен, тому для доступу до класу, необхідно використовувати повне кваліфікаційне ім’я, якщо ми працюємо в глобальному просторі імен. На цьому установка бібліотеки завершена.

Створення документа MS Word

Тепер, ми можемо сформувати свій перший документ MS Word засобами мови PHP. Для цього, насамперед визначимо шрифт, використовуючи метод setDefaultFontName(ім’я шрифту), який буде використовуватися за замовчуванням, для відображення текстових даних.

$phpWord->setDefaultFontName(‘Times New Roman’);

Потім поставимо, розмір шрифту, за допомогою методу setDefaultFontSize(розмір шрифту).

$phpWord->setDefaultFontSize(14)

Перед додаванням текстових даних, необхідно визначити параметри всього документа в цілому. Для отримання об’єкта параметрів документа, використовуємо метод getDocInfo().

$properties = $phpWord->getDocInfo();

Використовуючи отриманий об’єкт, задамо основні параметри документа.

$properties->setCreator(‘Name’);
$properties->setCompany(‘Company’);
$properties->setTitle(‘Title’);
$properties->setDescription(‘Description’);
$properties->setCategory(‘My category’);
$properties->setLastModifiedBy(‘My name’);
$properties->setCreated(mktime(0, 0, 0, 3, 12, 2015));
$properties->setModified(mktime(0, 0, 0, 3, 14, 2015));
$properties->setSubject(‘My subject’);
$properties->setKeywords(‘my key word’);

При цьому використовувалися такі методи (кожен метод встановлює певний глобальний параметр документа):

setCreator() – автор документа;

setCompany() – організація автора документа;

setTitle() – заголовок документа;

setDescription() – короткий опис документа;

setCategory() – категорія документа;

setLastModifiedBy() – автор останнього редагування документа;

setCreated() – дата створення документа;

setModified() – дата редагування документа;

setSubject() – тема документа;

setKeywords() – ключові слова документа.

Власне, тепер ми можемо додати необхідні текстові дані в майбутній документ MS Word, але перед цим ми повинні визначитися з поняттям розділу, що використовується бібліотекою PHPWord, для роботи з документом.

Отже, розділ або секція – це спеціальна область прямокутної форми, усередині якої розташовуються елементи документа, такі як текст, зображення, списки, таблиці і т. д. А значить, перед додаванням інформації в майбутній документ, необхідно створити розділ, що ми власне і виконаємо, використовуючи метод addSection(масив стилів).

$sectionStyle = array(
‘orientation’ => ‘landscape’,
‘marginTop’ => \PhpOffice\PhpWord\Shared\Converter::pixelToTwip(10),
‘marginLeft’ => 600,
‘marginRight’ => 600,
‘colsNum’ => 1,
‘pageNumberingStart’ => 1,
‘borderBottomSize’=>100,
‘borderBottomColor’=>’C0C0C0’
);
$section = $phpWord->addSection($sectionStyle);

Даний метод, як результату роботи повертає об’єкт створеного розділу, який ми збережемо в змінну. При виклику методу, в якості першого параметра, можна передати масив параметрів, які будуть використовуватися для створення розділу (кожна настройка являє собою окрему комірку масиву). У прикладі Вище, я використовував наступні налаштування:

orientation — розташування розділу, у вигляді альбомного аркуша (значення за замовчуванням portrait);

marginTop – верхній відступ;

marginLeft – відступ від лівого краю;

marginRight – відступ від правого краю;

colsNum – кількість колонок, в яких будуть відображатись дані;

pageNumberingStart – сторінка, з якої буде розпочато нумерація сторінок;

borderBottomSize – розмір нижньої межі;

borderBottomColor – колір нижньої рамки.

Повний список параметрів наведено в розділі «Styles», офіційній документації PHPWord.

PHPWord — створення MS Word документів засобами PHP

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

Твіп (англ. twip) — друкарська одиниця вимірювання, яка дорівнює однієї двадцятої пункту, або 1/1440 дюйма, або 1/567 сантиметра (наближено).

Звичайно, розробникам не зовсім зручно використовувати дану одиницю вимірювання, для визначення розмірів, тому бібліотека PHPWord, містить у своєму складі, спеціальний клас конвертер, основних відомих одиниць в твипы. Наприклад, для конвертації «пискселей в твипы», необхідно використовувати наступний метод pixelToTwip() , який переведе значення в пікселях, передане в якості першого параметра в твипы.

\PhpOffice\PhpWord\Shared\Converter::pixelToTwip(10)

Для додавання тексту, в майбутній документ, необхідно використовувати метод addText($text, [$fontStyle], [$paragraphStyle]). В якості параметрів, при виклику цього методу, необхідно передати наступне:

$text – текст, який необхідно відобразити на сторінці документа. При цьому текст не повинен містити тегів HTML, тому, як правило, його обробляють функцією htmlspecialchars().

$fontStyle – масив з параметрами шрифту, який буде використовуватися для відображення тексту. Повний список доступних налаштувань, Ви знайдете на сторінці «Styles» в розділі «Font», офіційній документації.

$paragraphStyle – масив з налаштуваннями параграфа, або абзацу, в якому буде відображено текст. Повний список доступних налаштувань, Ви знайдете на сторінці «Styles» в розділі «Paragraph», офіційній документації.

Тепер, використовуємо розглянутий Вище метод і додамо текст у майбутній документ.

$text = «PHPWord is a library written in pure PHP that provides a set of classes to write to and read from different document file formats.»;
$fontStyle = array(‘name’=>’Arial’, ‘size’=>36, ‘color’=>’075776’, ‘bold’=>TRUE, ‘italic’=>TRUE);
$parStyle = array(‘align’=>’right’,’spaceBefore’=>10);
$section->addText(htmlspecialchars($text), $fontStyle,$parStyle);

Налаштування шрифту, використані в прикладі:

name – ім’я шрифту;

size – розмір шрифту;

color – колір шрифту;

bold – якщо, true», буде використано жирний шрифт;

italic — якщо, true», буде використано курсив.

Налаштування параграфа з прикладу:

align – вирівнювання тексту в параграфі, в нашому випадку по правому краю;

spaceBefore – відстань до параграфа.

Тепер давайте, безпосередньо, створимо документ MS Word.

$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord,’Word2007′);
$objWriter->save(‘doc.docx’);

Для створення документа, необхідно створити об’єкт спеціального класу Word2007, використовуючи статичний метод createWriter(), класу IOFactory. Клас IOFactory – реалізує шаблон проектування Factory, і необхідний для створення об’єктів інших класів, імена яких ми передаємо в якості другого параметра при виклику методу createWriter(). Далі викликаючи метод save() і передаючи в якості першого параметра, ім’я майбутнього файлу, ми формуємо документ MS Word.

PHPWord — створення MS Word документів засобами PHP

Як Ви бачите, документ успішно створений. Якщо, не потрібно створювати файл, сформований документ, необхідно віддати користувачеві на скачування, то при виклику методу save(), в якості першого параметра, необхідно передати рядок «php://output». При цьому, так само, необхідно вказати певний набір заголовків.

header(«Content-Опис: File Transfer»);
header(‘Content-Disposition: attachment; filename=»first.docx»‘);
header(‘Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document’);
header(‘Content-Transfer-Encoding: binary’);
header(‘Cache-Control: must-revalidate, post-check=0, pre-check=0’);
header(‘Expires: 0’);
$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, ‘Word2007’);
$objWriter->save(«php://output»);

Додавання списків

Для формування списків, у майбутньому документі, необхідно використовувати метод addListItem($text, [$depth], [$fontStyle], [$listStyle], [$paragraphStyle]), який за кожен свій виклик, формує елемент списку. Параметри, які необхідно передати при виклику методу:

$text – текст, елемента списку;

$depth – глибина вкладеності. Якщо створюється однорівневий список, то даний параметр дорівнює 0.

$fontStyle – масив параметрів шрифту, по аналогії з додаванням простого тексту.

$listStyle – масив параметрів списку.

$paragraphStyle – масив параметрів параграфа, по аналогії з додаванням тексту.

Масив налаштувань списку $listStyle, підтримує налаштування – listType, тобто, тип списку, наприклад, нумерований або ж ні. В якості значень, доступні спеціальні константи класу \PhpOffice\PhpWord\Style\ListItem:

TYPE_SQUARE_FILLED FILLED – не нумерований список. У вигляді маркерів використовуються квадрати.

TYPE_BULLET_FILLED – не нумерований список (значення за замовчуванням). У вигляді маркерів використовуються точки.

TYPE_BULLET_EMPTY FILLED – не нумерований список. У вигляді маркерів використовуються не зафарбовані колу.

TYPE_NUMBER – нумерований список.

TYPE_NUMBER_NESTED – багаторівневий нумерований список.

TYPE_ALPHANUM – нумерований список, з використанням літер, в якості маркерів.

Таким чином, наступний код, додасть однорівневий нумерований список у документ.

$fontStyle = array(‘name’ => ‘Times New Roman’, ‘size’ => 16,’color’ => ‘075776’,’italic’=>true);
$listStyle = array(‘listType’=>\PhpOffice\PhpWord\Style\ListItem::TYPE_BULLET_EMPTY);
$section->addListItem(‘Елемент 1’,0,$fontStyle,$listStyle);
$section->addListItem(‘Елемент 2’,0,$fontStyle,$listStyle);
$section->addListItem(‘Елемент 3’,0,$fontStyle,$listStyle);
$section->addListItem(‘Елемент 4’,0,$fontStyle,$listStyle);
$section->addListItem(‘Елемент 5’,0,$fontStyle,$listStyle);

PHPWord — створення MS Word документів засобами PHP

Додавання зображень

Для додавання зображень, необхідно використовувати метод addImage($path,[$imgStyle]). При виклику цього методу, в якості першого параметра, передається шлях до зображення, яке потрібно додати в документ. В якості другого, додаткового параметра, можна передати масив з налаштуваннями відображення зображення. Повний список параметрів зображення, Ви знайдете на сторінці «Styles», в розділі «Image».

PHPWord — створення MS Word документів засобами PHP

Відповідно, давайте додамо зображення в створюваний документ.

$section->addImage(‘picture.jpg’, array(
‘width’ => 100,
‘height’ => 100,
));

При цьому, в якості налаштувань, я визначив ширину і висоту доданого зображення.

PHPWord — створення MS Word документів засобами PHP

На цьому даний урок я буду завершувати. Як Ви бачите, бібліотека PHPWord, володіє величезним функціоналом і дозволяє формувати документи MS Word різної складності. Якщо вона Вас зацікавила, то більш докладно вивчайте офіційну документацію, тому як ми з Вами розглянули лише деякі її можливості. Всього Вам доброго і вдалого кодування!!!