Word перенос строки php
Как я могу добавить разрыв текста или перейти к следующей строке / строке во время выполнения текста? Я пытался просто делать это $section->addTextBreak(2); во время выполнения текста, но он просто добавлял перерывы в раздел после выполнения текста. Я тоже пробовал, $textrun->addTextBreak(2); но это дало мне фатальную ошибку. Будем признательны за любые ответы.
Вопрос был задан 3 года назад, но у меня такая же проблема, и я нашел решение. Возможно, это поможет новым пользователям PHPWord.
Чтобы добавить crlf в документ Word, может помочь тег:
Для этого необходимо \PhpOffice\PhpWord\Settings::setOutputEscapingEnabled(false); самостоятельно экранировать весь текст XML.
Обратите внимание, что это решение также работает при использовании setValue для TemplateProcessor: $templateProcessor->setValue('contact_address', '1st Line
Боюсь, что в текущей версии это будет невозможно. У меня нет глубокого понимания этой библиотеки, но, посмотрев на код, я обнаружил, что textRun класс состоит только из методов addText и . addLink
Но мне также нужна эта функция вместе с несколькими другими, поэтому я собираюсь написать ее сам и создать запрос на перенос, чтобы включить ее в следующий выпуск (если таковой будет).
В основном это можно сделать, изменив textRun класс, добавив addLineBreak метод (аналогично тому, как это делается в классе раздела), а затем изменив класс Base.php , чтобы создать правильные элементы в окончательном документе.
В Docx xml эти строковые прерывания аналогичны br тегу html, но предыдущий текст должен быть закрыт и снова открыт после использования такого прерывания:
вместо того, чтобы просто делать
Итак base.php , вам нужно отредактировать поведение, чтобы создать этот блок кода.
Надеюсь, это было полезно!
Я понял, что реализовать это очень просто. Просто textRun.php добавьте этот метод:
и в Base.php методе _writeTextRun в конце этого метода добавьте это условие:
Wraps a string to a given number of characters using a string break character.
Parameters
The input string.
The number of characters at which the string will be wrapped.
The line is broken using the optional break parameter.
If the cut_long_words is set to true , the string is always wrapped at or before the specified width . So if you have a word that is larger than the given width, it is broken apart. (See second example). When false the function does not split the word even if the width is smaller than the word width.
Return Values
Returns the given string wrapped at the specified length.
Examples
$text = "The quick brown fox jumped over the lazy dog." ;
$newtext = wordwrap ( $text , 20 , "
\n" );
The above example will output:
$text = "A very long woooooooooooord." ;
$newtext = wordwrap ( $text , 8 , "\n" , true );
The above example will output:
$text = "A very long woooooooooooooooooord. and something" ;
$newtext = wordwrap ( $text , 8 , "\n" , false );
The above example will output:
See Also
- nl2br() - Inserts HTML line breaks before all newlines in a string
- chunk_split() - Split a string into smaller chunks
User Contributed Notes 22 notes
For those interested in wrapping text to fit a width in *pixels* (instead of characters), you might find the following function useful; particularly for line-wrapping text over dynamically-generated images.
/**
* Wraps a string to a given number of pixels.
*
* This function operates in a similar fashion as PHP's native wordwrap function; however,
* it calculates wrapping based on font and point-size, rather than character count. This
* can generate more even wrapping for sentences with a consider number of thin characters.
*
* @static $mult;
* @param string $text - Input string.
* @param float $width - Width, in pixels, of the text's wrapping area.
* @param float $size - Size of the font, expressed in pixels.
* @param string $font - Path to the typeface to measure the text with.
* @return string The original string with line-breaks manually inserted at detected wrapping points.
*/
function pixel_word_wrap ( $text , $width , $size , $font )
$words = preg_split ( '/\b(?=\S)|(?=\s)/' , $text );
$word_count = count ( $words );
for( $i = 0 ; $i < $word_count ; ++ $i )
$box = imagettfbbox ( $size * $mult , 0 , $font , $words [ $i ]);
$m = $box [ 2 ] - $box [ 0 ] / $mult ;
else $word_length = strlen ( $words [ $i ]);
for( $s = 0 ; $s < $word_length ; ++ $s )$box = imagettfbbox ( $size * $mult , 0 , $font , substr ( $words [ $i ], 0 , $s + 1 ) . '-' );
if( $width < ( $box [ 2 ] - $box [ 0 ] / $mult ) + $size )$breakpoint = $s ;
break;
>
>
>
if( $breakpoint ) $w_l = substr ( $words [ $i ], 0 , $s + 1 ) . '-' ;
$w_r = substr ( $words [ $i ], $s + 1 );
$words [ $i ] = $w_l ;
array_splice ( $words , $i + 1 , 0 , $w_r );
++ $word_count ;
$box = imagettfbbox ( $size * $mult , 0 , $font , $w_l );
$m = $box [ 2 ] - $box [ 0 ] / $mult ;
>
>
Another solution to utf-8 safe wordwrap, unsing regular expressions.
Pretty good performance and works in linear time.
function utf8_wordwrap ( $string , $width = 75 , $break = "\n" , $cut = false )
if( $cut ) // Match anything 1 to $width chars long followed by whitespace or EOS,
// otherwise match anything $width chars long
$search = '/(.)(?:\s|$)|(.)/uS' ;
$replace = '$1$2' . $break ;
> else // Anchor the beginning of the pattern with a lookahead
// to avoid crazy backtracking when words are longer than $width
$pattern = '/(?=\s)(.)(?:\s|$)/uS' ;
$replace = '$1' . $break ;
>
return preg_replace ( $search , $replace , $string );
>
?>
Of course don't forget to use preg_quote on the $width and $break parameters if they come from untrusted input.
If you'd like to break long strings of text but avoid breaking html you may find this useful. It seems to be working for me, hope it works for you. Enjoy. :)
Using wordwrap is usefull for formatting email-messages, but it has a disadvantage: line-breaks are often treated as whitespaces, resulting in odd behaviour including lines wrapped after just one word.
To work around it I use this:
function linewrap ( $string , $width , $break , $cut ) $array = explode ( "\n" , $string );
$string = "" ;
foreach( $array as $key => $val ) $string .= wordwrap ( $val , $width , $break , $cut );
$string .= "\n" ;
>
return $string ;
>
?>
I then use linewrap() instead of wordwrap()
hope this helps someone
Here I have come out with a possibly very useful wordwrap code snippet.
Apparently what this piece of code does is: it takes the entered text and looks for words longer than the defined ‘$chunk_length’ if it finds any, it splits the long words and then it concatenates the whole string back to a new string with longer words separated by a dash character in this case.
After it has accomplished this task it then inserts an HTML line break after a specified ‘$line_length’ (Depending on your containers width requirements)
//Start function explode_ wrap
function explode_wrap ( $text , $chunk_length , $line_length )
//Explode all the words separated by spaces in a string
$string_chunks = explode ( ' ' , $text );
// Get each split word from the array $sring_chunks_array => key => value
foreach ( $string_chunks as $chunk => $value )
if( strlen ( $value ) >= $chunk_length )
//Split the chunks/words which are longer than $chunk_length
$new_string_chunks [ $chunk ] = chunk_split ( $value , $chunk_length , ' - ' );
//Do not split the normal length words
$new_string_chunks [ $chunk ] = $value ;
> //End foreach loop
//Concatenate back the all the words
$new_text = implode ( ' ' , $new_string_chunks );
return wordwrap ( $new_text , $line_length , '
' );
wordwrap() uses the break string as the line break detected, and the break inserted, so your text must be standardized to the line break you want in the wordwrap() output before using wordwrap, otherwise you will get line breaks inserted regardless of the location of existing line breaks in your text.
$linebreak = '
' . PHP_EOL ;
$width = 5 ;
$standardized = preg_replace ( '/\r?\n/' , $linebreak , "abc abc abc\nabc abc abc\r\nabc abc abc" );
echo 'Standardized EOL:' , PHP_EOL , $standardized , PHP_EOL , PHP_EOL ; // PHP_EOL for the command line, use '
' for HTML.
echo "Wrapped at $width :" , PHP_EOL , wordwrap ( $standardized , 7 , $linebreak ), PHP_EOL ;
?>
$ php -f test.php
Standardized EOL:
abc abc abc
abc abc abc
abc abc abc
The main concern when you have a text in a cell is for long words that drags the cell margins. This function will break words in a text that have more then $nr characters using the "-" char.
function processtext ( $text , $nr = 10 )
<
$mytext = explode ( " " , trim ( $text ));
$newtext =array();
foreach( $mytext as $k => $txt )
<
if ( strlen ( $txt )> $nr )
<
$txt = wordwrap ( $txt , $nr , "-" , 1 );
>
$newtext []= $txt ;
>
return implode ( " " , $newtext );
>
?>
These functions let you wrap strings comparing to their actual displaying width of proportional font. In this case Arial, 11px. Very handy in some cases since CSS3 is not yet completely supported. 100 strings = ~5 ms
My old sheep word wrap function (posted at the bottom of this page, is kinda old dated and this one is faster and more accurate).
//the width of the biggest char @
$fontwidth = 11 ;
//each chargroup has char-ords that have the same proportional displaying width
$chargroup [ 0 ] = array( 64 );
$chargroup [ 1 ] = array( 37 , 87 , 119 );
$chargroup [ 2 ] = array( 65 , 71 , 77 , 79 , 81 , 86 , 89 , 109 );
$chargroup [ 3 ] = array( 38 , 66 , 67 , 68 , 72 , 75 , 78 , 82 , 83 , 85 , 88 , 90 );
$chargroup [ 4 ] = array( 35 , 36 , 43 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 60 , 61 , 62 , 63 , 69 , 70 , 76 , 80 , 84 , 95 , 97 , 98 , 99 , 100 , 101 , 103 , 104 , 110 , 111 , 112 , 113 , 115 , 117 , 118 , 120 , 121 , 122 , 126 );
$chargroup [ 5 ] = array( 74 , 94 , 107 );
$chargroup [ 6 ] = array( 34 , 40 , 41 , 42 , 45 , 96 , 102 , 114 , 123 , 125 );
$chargroup [ 7 ] = array( 44 , 46 , 47 , 58 , 59 , 91 , 92 , 93 , 116 );
$chargroup [ 8 ] = array( 33 , 39 , 73 , 105 , 106 , 108 , 124 );
//how the displaying width are compared to the biggest char width
$chargroup_relwidth [ 0 ] = 1 ; //is char @
$chargroup_relwidth [ 1 ] = 0.909413854 ;
$chargroup_relwidth [ 2 ] = 0.728241563 ;
$chargroup_relwidth [ 3 ] = 0.637655417 ;
$chargroup_relwidth [ 4 ] = 0.547069272 ;
$chargroup_relwidth [ 5 ] = 0.456483126 ;
$chargroup_relwidth [ 6 ] = 0.36589698 ;
$chargroup_relwidth [ 7 ] = 0.275310835 ;
$chargroup_relwidth [ 8 ] = 0.184724689 ;
//build fast array
$char_relwidth = null ;
for ( $i = 0 ; $i < count ( $chargroup ); $i ++)<
for ( $j = 0 ; $j < count ( $chargroup [ $i ]); $j ++)<
$char_relwidth [ $chargroup [ $i ][ $j ]] = $chargroup_relwidth [ $i ];
>
>
//get the display width (in pixels) of a string
function get_str_width ( $str ) <
global $fontwidth , $char_relwidth ;
$result = 0 ;
for ( $i = 0 ; $i < strlen ( $str ); $i ++)<
$result += $char_relwidth [ ord ( $str [ $i ])];
>
$result = $result * $fontwidth ;
return $result ;
>
//truncates a string at a certain displaying pixel width
function truncate_str_at_width ( $str , $width , $trunstr = '. ' ) <
global $fontwidth , $char_relwidth ;
$trunstr_width = get_str_width ( $trunstr );
$width -= $trunstr_width ;
$width = $width / $fontwidth ;
$w = 0 ;
for ( $i = 0 ; $i < strlen ( $str ); $i ++)<
$w += $char_relwidth [ ord ( $str [ $i ])];
if ( $w > $width )
break;
>
$result = substr ( $str , 0 , $i ). $trunstr ;
return $result ;
// texas is the reason rules at 10am :)
>
?>
Количество символов, по которым строка будет перенесена.
Символ переноса строки можно указать с помощью необязательного параметра break .
Если параметр cut_long_words установлен в true , строка всегда будет переноситься на указанной ширине width или раньше. Поэтому, если исходная строка содержит слово длиннее заданной ширины строки, то оно будет разорвано. (Смотрите второй пример). Если установлен в false , функция не разделяет слово, даже если width меньше длины слова.
Возвращаемые значения
Возвращает строку со вставленными символами переноса на указанной длине.
Примеры
$text = "The quick brown fox jumped over the lazy dog." ;
$newtext = wordwrap ( $text , 20 , "
\n" );
Результат выполнения данного примера:
$text = "A very long woooooooooooord." ;
$newtext = wordwrap ( $text , 8 , "\n" , true );
Результат выполнения данного примера:
$text = "A very long woooooooooooooooooord. and something" ;
$newtext = wordwrap ( $text , 8 , "\n" , false );
Результат выполнения данного примера:
Смотрите также
- nl2br() - Вставляет HTML-код разрыва строки перед каждым переводом строки
- chunk_split() - Разбивает строку на фрагменты
User Contributed Notes 22 notes
For those interested in wrapping text to fit a width in *pixels* (instead of characters), you might find the following function useful; particularly for line-wrapping text over dynamically-generated images.
/**
* Wraps a string to a given number of pixels.
*
* This function operates in a similar fashion as PHP's native wordwrap function; however,
* it calculates wrapping based on font and point-size, rather than character count. This
* can generate more even wrapping for sentences with a consider number of thin characters.
*
* @static $mult;
* @param string $text - Input string.
* @param float $width - Width, in pixels, of the text's wrapping area.
* @param float $size - Size of the font, expressed in pixels.
* @param string $font - Path to the typeface to measure the text with.
* @return string The original string with line-breaks manually inserted at detected wrapping points.
*/
function pixel_word_wrap ( $text , $width , $size , $font )
$words = preg_split ( '/\b(?=\S)|(?=\s)/' , $text );
$word_count = count ( $words );
for( $i = 0 ; $i < $word_count ; ++ $i )
$box = imagettfbbox ( $size * $mult , 0 , $font , $words [ $i ]);
$m = $box [ 2 ] - $box [ 0 ] / $mult ;
else $word_length = strlen ( $words [ $i ]);
for( $s = 0 ; $s < $word_length ; ++ $s )$box = imagettfbbox ( $size * $mult , 0 , $font , substr ( $words [ $i ], 0 , $s + 1 ) . '-' );
if( $width < ( $box [ 2 ] - $box [ 0 ] / $mult ) + $size )$breakpoint = $s ;
break;
>
>
>
if( $breakpoint ) $w_l = substr ( $words [ $i ], 0 , $s + 1 ) . '-' ;
$w_r = substr ( $words [ $i ], $s + 1 );
$words [ $i ] = $w_l ;
array_splice ( $words , $i + 1 , 0 , $w_r );
++ $word_count ;
$box = imagettfbbox ( $size * $mult , 0 , $font , $w_l );
$m = $box [ 2 ] - $box [ 0 ] / $mult ;
>
>
Another solution to utf-8 safe wordwrap, unsing regular expressions.
Pretty good performance and works in linear time.
function utf8_wordwrap ( $string , $width = 75 , $break = "\n" , $cut = false )
if( $cut ) // Match anything 1 to $width chars long followed by whitespace or EOS,
// otherwise match anything $width chars long
$search = '/(.)(?:\s|$)|(.)/uS' ;
$replace = '$1$2' . $break ;
> else // Anchor the beginning of the pattern with a lookahead
// to avoid crazy backtracking when words are longer than $width
$pattern = '/(?=\s)(.)(?:\s|$)/uS' ;
$replace = '$1' . $break ;
>
return preg_replace ( $search , $replace , $string );
>
?>
Of course don't forget to use preg_quote on the $width and $break parameters if they come from untrusted input.
If you'd like to break long strings of text but avoid breaking html you may find this useful. It seems to be working for me, hope it works for you. Enjoy. :)
Using wordwrap is usefull for formatting email-messages, but it has a disadvantage: line-breaks are often treated as whitespaces, resulting in odd behaviour including lines wrapped after just one word.
To work around it I use this:
function linewrap ( $string , $width , $break , $cut ) $array = explode ( "\n" , $string );
$string = "" ;
foreach( $array as $key => $val ) $string .= wordwrap ( $val , $width , $break , $cut );
$string .= "\n" ;
>
return $string ;
>
?>
I then use linewrap() instead of wordwrap()
hope this helps someone
Here I have come out with a possibly very useful wordwrap code snippet.
Apparently what this piece of code does is: it takes the entered text and looks for words longer than the defined ‘$chunk_length’ if it finds any, it splits the long words and then it concatenates the whole string back to a new string with longer words separated by a dash character in this case.
After it has accomplished this task it then inserts an HTML line break after a specified ‘$line_length’ (Depending on your containers width requirements)
//Start function explode_ wrap
function explode_wrap ( $text , $chunk_length , $line_length )
//Explode all the words separated by spaces in a string
$string_chunks = explode ( ' ' , $text );
// Get each split word from the array $sring_chunks_array => key => value
foreach ( $string_chunks as $chunk => $value )
if( strlen ( $value ) >= $chunk_length )
//Split the chunks/words which are longer than $chunk_length
$new_string_chunks [ $chunk ] = chunk_split ( $value , $chunk_length , ' - ' );
//Do not split the normal length words
$new_string_chunks [ $chunk ] = $value ;
> //End foreach loop
//Concatenate back the all the words
$new_text = implode ( ' ' , $new_string_chunks );
return wordwrap ( $new_text , $line_length , '
' );
wordwrap() uses the break string as the line break detected, and the break inserted, so your text must be standardized to the line break you want in the wordwrap() output before using wordwrap, otherwise you will get line breaks inserted regardless of the location of existing line breaks in your text.
$linebreak = '
' . PHP_EOL ;
$width = 5 ;
$standardized = preg_replace ( '/\r?\n/' , $linebreak , "abc abc abc\nabc abc abc\r\nabc abc abc" );
echo 'Standardized EOL:' , PHP_EOL , $standardized , PHP_EOL , PHP_EOL ; // PHP_EOL for the command line, use '
' for HTML.
echo "Wrapped at $width :" , PHP_EOL , wordwrap ( $standardized , 7 , $linebreak ), PHP_EOL ;
?>
$ php -f test.php
Standardized EOL:
abc abc abc
abc abc abc
abc abc abc
The main concern when you have a text in a cell is for long words that drags the cell margins. This function will break words in a text that have more then $nr characters using the "-" char.
function processtext ( $text , $nr = 10 )
<
$mytext = explode ( " " , trim ( $text ));
$newtext =array();
foreach( $mytext as $k => $txt )
<
if ( strlen ( $txt )> $nr )
<
$txt = wordwrap ( $txt , $nr , "-" , 1 );
>
$newtext []= $txt ;
>
return implode ( " " , $newtext );
>
?>
These functions let you wrap strings comparing to their actual displaying width of proportional font. In this case Arial, 11px. Very handy in some cases since CSS3 is not yet completely supported. 100 strings = ~5 ms
My old sheep word wrap function (posted at the bottom of this page, is kinda old dated and this one is faster and more accurate).
//the width of the biggest char @
$fontwidth = 11 ;
//each chargroup has char-ords that have the same proportional displaying width
$chargroup [ 0 ] = array( 64 );
$chargroup [ 1 ] = array( 37 , 87 , 119 );
$chargroup [ 2 ] = array( 65 , 71 , 77 , 79 , 81 , 86 , 89 , 109 );
$chargroup [ 3 ] = array( 38 , 66 , 67 , 68 , 72 , 75 , 78 , 82 , 83 , 85 , 88 , 90 );
$chargroup [ 4 ] = array( 35 , 36 , 43 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 60 , 61 , 62 , 63 , 69 , 70 , 76 , 80 , 84 , 95 , 97 , 98 , 99 , 100 , 101 , 103 , 104 , 110 , 111 , 112 , 113 , 115 , 117 , 118 , 120 , 121 , 122 , 126 );
$chargroup [ 5 ] = array( 74 , 94 , 107 );
$chargroup [ 6 ] = array( 34 , 40 , 41 , 42 , 45 , 96 , 102 , 114 , 123 , 125 );
$chargroup [ 7 ] = array( 44 , 46 , 47 , 58 , 59 , 91 , 92 , 93 , 116 );
$chargroup [ 8 ] = array( 33 , 39 , 73 , 105 , 106 , 108 , 124 );
//how the displaying width are compared to the biggest char width
$chargroup_relwidth [ 0 ] = 1 ; //is char @
$chargroup_relwidth [ 1 ] = 0.909413854 ;
$chargroup_relwidth [ 2 ] = 0.728241563 ;
$chargroup_relwidth [ 3 ] = 0.637655417 ;
$chargroup_relwidth [ 4 ] = 0.547069272 ;
$chargroup_relwidth [ 5 ] = 0.456483126 ;
$chargroup_relwidth [ 6 ] = 0.36589698 ;
$chargroup_relwidth [ 7 ] = 0.275310835 ;
$chargroup_relwidth [ 8 ] = 0.184724689 ;
//build fast array
$char_relwidth = null ;
for ( $i = 0 ; $i < count ( $chargroup ); $i ++)<
for ( $j = 0 ; $j < count ( $chargroup [ $i ]); $j ++)<
$char_relwidth [ $chargroup [ $i ][ $j ]] = $chargroup_relwidth [ $i ];
>
>
//get the display width (in pixels) of a string
function get_str_width ( $str ) <
global $fontwidth , $char_relwidth ;
$result = 0 ;
for ( $i = 0 ; $i < strlen ( $str ); $i ++)<
$result += $char_relwidth [ ord ( $str [ $i ])];
>
$result = $result * $fontwidth ;
return $result ;
>
//truncates a string at a certain displaying pixel width
function truncate_str_at_width ( $str , $width , $trunstr = '. ' ) <
global $fontwidth , $char_relwidth ;
$trunstr_width = get_str_width ( $trunstr );
$width -= $trunstr_width ;
$width = $width / $fontwidth ;
$w = 0 ;
for ( $i = 0 ; $i < strlen ( $str ); $i ++)<
$w += $char_relwidth [ ord ( $str [ $i ])];
if ( $w > $width )
break;
>
$result = substr ( $str , 0 , $i ). $trunstr ;
return $result ;
// texas is the reason rules at 10am :)
>
?>
Библиотека PHPWord, находящаяся уже почти год в стадии бета-тестирования 1) , предоставляет возможность создания сложных документов формата OOXML (*.docx). Рассмотрим основные возможности этой библиотеки. Для начала работы достаточно распаковать архив с библиотекой в каталог с создаваемым вами документом PHP и подгрузить основной класс библиотеки, расположенный в файле PHPWord.php:
Свойства документа и шрифт по-умолчанию
Создание документа начинается с объявления экземпляра класса PHPWord. Конструктор не требует передачи аргументов:
Далее следует задать название и размер шрифта по-умолчанию:
В рассматриваемой версии до применения указанных выше функций шрифтом по-умолчанию является Arial размером 20 пунктов. Теперь можно задать время создания документа, имя автора и так далее:
По-умолчанию в качестве даты создания и изменения документа указывается текущее время, а остальные свойства заполняются пустыми значениями. Если требуется указать конкретную дату создания или изменения, используйте функцию mktime или любую другую функцию, возвращающую время в стиле Unix.
Создание разделов
Основным элементом документа Word является Раздел. Раздел представляет собой прямоугольную область, внутри которой помещаются остальные элементы страницы: текст, изображения, таблицы и т.д.
Раздел может иметь книжную или альбомную ориентацию, настраиваемые поля (margins), настраиваемые цвета границ раздела и их толщину (на рисунке показана пунктиром):
Параметр | Описание |
---|---|
orientation | Ориентация страницы: null - книжная ориентация, landscape - альбомная |
marginTop | Размер верхнего поля во внутренних единицах |
marginRight | Размер правого поля во внутренних единицах |
marginBottom | Размер нижнего поля во внутренних единицах |
marginLeft | Размер левого поля во внутренних единицах |
borderTopSize | Толщина верхнего края рамки во внутренних единицах |
borderRightSize | Толщина правого края рамки во внутренних единицах |
borderBottomSize | Толщина нижнего края рамки во внутренних единицах |
borderLeftSize | Толщина левого края рамки во внутренних единицах |
borderTopColor | Цвет верхнего края рамки в шестнадцатеричном формате |
borderRightColor | Цвет правого края рамки в шестнадцатеричном формате |
borderBottomColor | Цвет нижнего края рамки в шестнадцатеричном формате |
borderLeftColor | Цвет левого края рамки в шестнадцатеричном формате |
Для создания раздела существует функция createSection. В качестве внутренних единиц используются типографские твипы. Если вам непривычно указывать размеры в твипах, можно написать простую функцию, преобразующую миллиметры в твипы:
Указанные в таблице параметры могут быть переданы в виде массива при создании раздела.
. или могут быть установлены по-отдельности после создания раздела:
Добавление текста
Добавление блока текста
Под блоком текста понимается отрывок текста, имеющий одинаковое форматирование (цвет, размер шрифта и т.п.). Для создания блока текста в выбранном разделе используйте функцию addText:
Здесь $text - добавляемый текст, необязательный параметр $fontStyle - имя определенного ранее текстового стиля, необязательный параметр $paragraphStyle - имя определенного ранее стиля абзаца.
Изменение форматирования текста
Форматирование текста, как и форматирование раздела, может осуществляться при его создании.
. или устанавливается после создания предназначенными для этого методами:
Ниже приведен полный список доступных параметров форматирования текста:
Параметр | Описание |
---|---|
size | Размер шрифта в типографских пунктах |
name | Название шрифта (кегль) |
bold | Является ли текст полужирным (true\false) |
italic | Выделен ли текст курсивом (true\false) |
superScript | Является ли текст надстрочным (true\false) |
subScript | Является ли текст подстрочным (true\false) |
underline | Вид подчеркивания 2) из набора констант PHPWord_Style_Font: UNDERLINE_NONE - нет подчеркивания, UNDERLINE_DASHHEAVY - жирная штриховая линия, UNDERLINE_DASHLONG - удлиненная штриховая линия, UNDERLINE_DASHLONGHEAVY - удлиненная жирная штриховая линия, UNDERLINE_DOUBLE - двойная линия, UNDERLINE_DOTHASH 3) - штрих-пунктир, UNDERLINE_DOTHASHHEAVY - жирный штрих-пунктир, UNDERLINE_DOTDOTDASH - две точки + тире, UNDERLINE_DOTDOTDASHHEAVY - жирные две точки + тире, UNDERLINE_DOTTED - пунктир, UNDERLINE_DOTTEDHEAVY - жирный пунктир, UNDERLINE_SINGLE - одинарная линия, UNDERLINE_WAVY - волнистая линия, UNDERLINE_WAVYDOUBLE - двойная волнистая линия, UNDERLINE_WAVYHEAVY - тройная волнистая линия, UNDERLINE_WORDS - подчеркивать только слова (не подчеркивать пробелы) |
Color | Цвет шрифта в шестнадцатеричном формате |
fgColor | Цвет выделения маркером из набора констант PHPWord_Style_Font: FGCOLOR_YELLOW - желтый, FGCOLOR_LIGHTGREEN - ярко-зеленый, FGCOLOR_CYAN - бирюзовый, FGCOLOR_MAGENTA - лиловый, FGCOLOR_BLUE - синий, FGCOLOR_RED - красный, FGCOLOR_DARKBLUE - темно-синий, FGCOLOR_DARKCYAN - сине-зеленый, FGCOLOR_DARKGREEN - темно-зеленый, FGCOLOR_DARKMAGENTA - фиолетовый, FGCOLOR_DARKRED - темно-красный, FGCOLOR_DARKYELLOW - коричнево-зеленый, FGCOLOR_DARKGRAY - серый 50%, FGCOLOR_LIGHTGRAY - серый 25%, FGCOLOR_BLACK - черный |
Названия параметров должны употребляться с соблюдением регистра. В случае параметров underline и fgColor применение значений, не указанных в таблице, не допускается.
Cписок доступных параметров форматирования абзаца:
Параметр | Описание |
---|---|
align | Выравнивание текста в абзаце: left - по левому краю, right - по правому краю, center - по центру, both или justify - по ширине |
spaceBefore | Отступ абзаца сверху в твипсах |
spaceAfter | Отступ абзаца снизу в твипсах |
spacing | Интервал между строк в твипсах |
Определение стилей текста и абзаца
Вместо того, чтобы каждый раз передавать в функцию createText массив с параметрами, вы можете создать именованный стиль, а затем указывать только название этого стиля:
Здесь $styleName - заданное вами имя стиля, $fontStyle - массив, содержащий определение стиля. После создания стиля его имя можно использовать при создании блоков текста, например:
Аналогичным образом осуществляется создание стиля абзаца:
Группировка блоков текста в абзац
Блоки текста с различным форматированием могут быть объединены в абзац заданного вида. Для этого применяется команда createTextRun:
Необязательный параметр $paragraphStyle - массив со стилем абзаца или название созданного ранее именованного стиля.
Добавление заголовков
В библиотеке имеются отдельные функции для добавления заголовков (addTitle) и задания их стилей (addTitleStyle). Применение заголовков вместо форматированных блоков текста необходимо в том случае, если вы хотите добавить в документ автоматически создаваемое оглавление, поскольку в оглавление включаются только заголовки, а не обычные блоки текста. При добавлении заголовков создание стилей заголовков обязательно:
Здесь $titleLevel - уровень заголовка, для которого задается стиль (обычно от 1 до 6), $fontStyle - массив со стилем форматирования заголовка, $paragraphStyle - массив со стилем форматирования абзаца. Как видите, форматирование можно не трогать, но сам стиль заголовка требуемого уровня должен быть обязательно создан. Добавление заголовка делается так:
По-умолчанию создается заголовок 1 уровня.
Добавление ссылок
Добавление ссылок мало чем отличается от добавления обычного текста. Для добавления ссылки используется команда:
Разрыв строки и страницы
Для принудительного переноса строки используйте синтаксис:
Необязательный параметр $num, по-умолчанию равный 1, указывает сколько переносов строки необходимо сделать. Для принудительной вставки разрыва страницы выполните:
Добавление оглавления
Для добавления оглавления используется функция addTOC:
Здесь $fontStyle - форматирование текста, определенное одним из ранее указанных способов, $tocStyle - массив со стилем оформления оглавления, возможные параметры которого приведены в таблице: ^ Параметр ^ Описание ^
tabLeader | Заполнитель между заголовком и номером страницы из набора констант PHPWord_Style_TOC : TABLEADER_DOT - точки, TABLEADER_UNDERSCORE - символ подчеркивания, TABLEADER_LINE - линия, TABLEADER_NONE - нет заполнителя |
tabPos | Положение номера страницы в твипсах |
Indent | Отступ заголовков в твипсах |
Добавление списков
Присутствует возможность добавления нумерованных и ненумерованных списков в документ. Для добавления элемента списка используйте код:
Здесь $text - текст добавляемого элемента списка, $depth - глубина вложенности элемента в списке (от 1 до 9, по-умолчанию равна 1), $textStyle - форматирование текста списка одним из предложенных ранее способов, $listStyle - форматирование самого списка при помощи массива параметров, $paragraphStyle - форматирование абзаца. На данный момент не существует функции addListStyle, поскольку у списков пока может изменяться только один параметр:
Параметр | Описание |
---|---|
listType | Вид списка из набора констант PHPWord_Style_ListItem: TYPE_NUMBER - одноуровневый нумерованный список, TYPE_NUMBER_NESTED - многоуровневый нумерованный список, TYPE_BULLET_FILLED - ненумерованный список с маркерами в виде закрашенных кругов, TYPE_BULLET_EMPTY - ненумерованный список с маркерами в виде незакрашенных кругов, TYPE_SQUARE_FILLED - ненумерованный список с маркерами в виде закрашенных квадратов |
Добавление таблиц
Важной частью документа Word являются таблицы. Для создания таблицы в PHPWord выполните:
Необязательный аргумент $tableStyle - массив с описанием стиля таблицы или название такового, определенного методом addTableStyle:
Аргументы: $styleName - название стиля, $tableStyle - массив с определением стиля, $firstRowStyle - массив с определением стиля ячеек 1 строки (шапки) таблицы. Ниже приведена таблица возможных стилевых параметров таблицы в целом: ^ Параметр ^ Описание ^
cellMarginTop | Отступ от ячейки сверху в твипсах |
cellMarginRight | Отступ от ячейки справа в твипсах |
cellMarginBottom | Отступ от ячейки снизу в твипсах |
cellMarginLeft | Отступ от ячейки слева в твипсах |
Теперь в созданную таблицу можно добавить ячейки. Как и в XHTML, вначале нужно создать строку.
. затем добавить ячейки и заполнить их форматированным текстом.
. или сделать то же самое одной командой.
. или вместо простого текста добавить изображения, списки ссылки одной из следующих команд:
Команда | Действие |
---|---|
addText | Добавить форматированный текст |
addTextBreak | Добавить перенос строки |
addLink | Добавить ссылку |
addListItem | Добавить элемент списка |
addImage | Добавить изображение из файла |
addMemoryImage | Добавить динамически сгенерированное изображение |
addObject | Добавить объект OLE |
addPreserveText | Добавить поле (например, нумерацию страниц) |
Как вы уже, наверное, догадались, параметр $rowHeight - позволяет задать высоту в твипсах создаваемой строки, $cellWidth - ширину ячейки (столбца), а $cellStyle - изменить форматирование ячейки. При форматировании ячейки поддерживаются следующие параметры:
Параметр | Описание |
---|---|
valign | Выравнивание в ячейке по-вертикали: both - по-вертикали по ширине, top - по верхнему краю, bottom - по нижнему краю, center - по-центру |
textDirection | Направление текста из набора констант PHPWord_Style_Cell: TEXT_DIR_BTLR - развернут на 90 градусов против часовой стрелки, TEXT_DIR_TBRL - развернут на 90 градусов по часовой стрелке |
bgColor | Цвет фона ячейки в шестнадцатеричном формате |
borderTopSize | Толщина верхней границы ячейки в твипсах |
borderRightSize | Толщина правой границы ячейки в твипсах |
borderBottomSize | Толщина нижней границы ячейки в твипсах |
borderLeftSize | Толщина левой границы ячейки в твипсах |
borderTopColor | Цвет верхней границы ячейки в шестнадцатеричном формате |
borderRightColor | Цвет правой границы ячейки в шестнадцатеричном формате |
borderBottomColor | Цвет нижней границы ячейки в шестнадцатеричном формате |
borderLeftColor | Цвет левой границы ячейки в шестнадцатеричном формате |
Добавление изображений
PHPWord позволяет добавлять в создаваемый документ изображения 2 типов: из файла (метод addImage) и динамически сгенерированное сценарием изображение (метод addMemoryImage). Поддерживаются файлы форматов jpg, png, gif, tiff, bmp. Примеры применения методов:
Здесь $src и $url - соответственно путь к файлу и абсолютный путь к сценарию (с адресом сайта и промежуточных каталогов), $imageStyle - массив с форматированием изображения. Поддерживаемые параметры форматирования:
Параметр | Описание |
---|---|
width | Требуемая ширина изображения в пикселях |
height | Требуемая высота изображения в пикселях |
align | Горизонтальное выравнивание изображения: left - по левому краю, right - по правому краю, center - по центру |
Если требуемые размеры изображения не указаны - библиотека пытается определить фактические размеры изображения при помощи функции [php>getimagesize|getimagesize]].
Добавление объектов OLE
С помощью метода addObject вы можете внедрить в создаваемый документ фрагмент другого документа (*.docx, *.xlsx, *.pptx) при помощи технологии OLE:
Массив $objectStyle может содержать только один параметр:
Параметр | Описание |
---|---|
align | Выравнивание объекта по-горизонтали: left - по левому краю, right - по правому краю, center - по центру |
Колонтитулы
Каждый раздел документа может иметь свой верхний (header) и нижний (footer) колонтитул, отображаемый на всех принадлежащих ему страницах. С точки зрения Word колонтитул является особым видом раздела, поэтому к колонтитулу применимо большинство описанных выше методов: addText, createTextRun, addTextBreak, addImage, addMemoryImage, addListItem, addTable. Кроме этого колонтитул имеет собственный метод addPreserveText, позволяющий создавать нумерацию страниц. Пример создания верхнего (createHeader) и нижнего (createFooter) колонтитула:
Как и всегда форматирование текста колонтитула и абзаца являются необязательными параметрами.
Использование шаблонов
Библиотека PHPWord поддерживает еще один интересный метод создания документов Word - использование шаблонов. Подробный принцип работы при генерировании документов из шаблонов описан в статье docx-templates. В качестве метки в PHPWord используется комбинация $ , где NAME - имя метки. Пример генерирования с использованием меток:
Сохранение файла
Сохранение файла на жесткий диск:
Пример
Подытоживая все вышесказанное хочется привести пример, в котором проиллюстрировано применение большинства возможностей библиотеки PHPWord:
Текст примера появится несколько позже, когда автор сможет сгенерировать документ с кириллицей (на английском работает). Проблема связана с функцией utf8_encode, используемой в PHPWord. Если у вас есть решение этой проблемы, просьба отписаться.
Update! Проблема с функцией utf8_encode и кириллической кодировкой решается если заменить функцию на iconv и указать входящую кодировку CP1251 и выходе UTF8. Сделать это надо во всех местах библиотеки где используется функция utf8_encode.
Данный пример в работе можно посмотреть по этой ссылке. В заключение хотелось бы отметить, что для сайтов, где структура docx-файла слабо 4) зависит от входных данных, рекомендуемым способом стоит считать docx-templates, поскольку:
Механизм шаблонов должен работать быстрее, так как основная структура документа уже создана до выполнения сценария 5)
Шаблон может быть создан в самой свежей версии Microsoft Word и будет учитывать все возможные изменения внесенные создателями программы
В случае, если в зависимости от исходных данных документ может иметь несколько разных представлений, можно создать ровно такое же число разных шаблонов
То есть в худшем случае существует конечное число возможных видов генерируемого документа, а в лучшем случае все документы выглядят одинаково, меняются только пользовательские данные.
После этого я открываю созданный файл в Блокноте, и он буквально записывает новую строку:
1 Джон Доу \ r \ n 1 Джон Доу \ r \ n 1 Джон Доу \ r \ n
Я пробовал много вариантов \r\n , но ни один не работал. Почему новая строка не превращается в новую строку?
Только строки в двойных кавычках интерпретируют escape-последовательности \r и \n как '0x0D' и '0x0A' соответственно, поэтому вы хотите:
Строки в одинарных кавычках, на с другой стороны, знать только escape-последовательности \\ и \' .
Не забудьте проверить настройки разрыва строки в своем редакторе, если вам нужна определенная последовательность символов (например, \r\n ).
Используйте предопределенную константу PHP_EOL :
Постоянное значение будет установлено в соответствии с окончанием строки операционной системы, в которой выполняется PHP. В Linux это будет "\n" ; в Windows это будет "\r\n" .
Команда «echo» в PHP отправляет результат в браузер как необработанный HTML-код, поэтому даже если он заключен в двойные кавычки, браузер не разберет его на две строки, потому что символ новой строки в HTML ничего не означает. Вот почему вам нужно использовать:
При использовании "echo" или вместо этого используйте fwrite .
Это выведет новую строку HTML вместо "\ n".
Используйте константу PHP_EOL, чтобы получить правильный символ независимо от платформы.
Простой пример использования:
Строки между двойными кавычками "" интерполируются, что означает, что они преобразуют экранированные символы в печатаемые символы.
Строки, заключенные в одинарные кавычки '' , являются буквальными, что означает, что они обрабатываются точно так же, как вводятся символы.
У вас могут быть оба в одной строке:
Вы должны использовать это:
Вы также можете взглянуть на PHP EOL .
Фактически \r\n предназначен для HTML-части вывода. С этими символами вы можете просто создать новую строку в html-коде, чтобы сделать его более читаемым:
Что просмотр страницы будет:
В противном случае, если вы хотите разделить текст, в нашем примере «Первая строка» и «Вторая строка» вы должны использовать html-код:
:
Это будет выводить:
Также было бы более читабельно, если бы вы заменили весь скрипт на:
W3school предложила такой способ:
С помощью этой функции вы можете это сделать .. Я пробовал другие способы, которые были упомянуты выше, но они мне не помогут ..
По какой-то причине в каждом посте с вопросом о переходе на новую строку в PHP не упоминается случай, когда простая вставка новой строки в строки, заключенные в одинарные кавычки, будет делать именно то, что вы думаете:
В примере 1 явно не печатается желаемый результат, однако, хотя это правда, вы не можете экранировать новую строку в одинарных кавычках, вы можете ее иметь:
Пример 2 имеет точно желаемое поведение. К сожалению, вставляемая новая строка зависит от операционной системы. Обычно это не проблема, поскольку веб-браузеры / серверы будут правильно интерпретировать новую строку, будь то \ r, \ r \ n или \ n.
Примечание: используя многофункциональный текстовый редактор, вы должны иметь возможность вставлять новую строку как двоичный символ (символы), который представляет новую строку в операционной системе, отличной от той, которая редактирует файл. Если ничего не помогает, можно просто использовать шестнадцатеричный редактор для вставки двоичного символа ascii.
Используйте PHP nl2br, чтобы получить символы новой строки в текстовой строке ..
У меня ничего не получалось.
У меня работает:
Я также пробовал эту комбинацию как в одинарных, так и в двойных кавычках. Но ничего не помогло. Вместо использования \n лучше использовать
в двойных кавычках. Нравится..
Читайте также: