Skip to content

Commit 39d4e8e

Browse files
committed
Bugfix #150: Page break adds new line in the beginning of the new page
1 parent 7d9bcd4 commit 39d4e8e

File tree

6 files changed

+67
-10
lines changed

6 files changed

+67
-10
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ This release marked the change of PHPWord license from LGPL 2.1 to LGPL 3; new r
2828

2929
- Header: All images added to the second header were assigned to the first header - @basjan GH-222
3030
- Conversion: Fix conversion from cm to pixel, pixel to cm, and pixel to point - @basjan GH-233 GH-234
31+
- PageBreak: Page break adds new line in the beginning of the new page - @ivanlanin GH-150
3132

3233
### Deprecated
3334

src/PhpWord/Writer/Word2007/Element/AbstractElement.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ abstract class AbstractElement
4949
*/
5050
protected $withoutP = false;
5151

52+
/**
53+
* Has page break before
54+
*
55+
* @var bool
56+
*/
57+
private $pageBreakBefore = false;
58+
5259
/**
5360
* Write element
5461
*/
@@ -88,6 +95,26 @@ protected function getElement()
8895
return $this->element;
8996
}
9097

98+
/**
99+
* Has page break before
100+
*
101+
* @return bool
102+
*/
103+
public function hasPageBreakBefore()
104+
{
105+
return $this->pageBreakBefore;
106+
}
107+
108+
/**
109+
* Set page break before
110+
*
111+
* @param bool $value
112+
*/
113+
public function setPageBreakBefore($value = true)
114+
{
115+
$this->pageBreakBefore = (bool)$value;
116+
}
117+
91118
/**
92119
* Convert text to valid format
93120
*

src/PhpWord/Writer/Word2007/Element/Container.php

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,33 @@ public function write()
5151
$elements = $container->getElements();
5252
$elementClass = '';
5353
foreach ($elements as $element) {
54-
$elementClass = get_class($element);
55-
$writerClass = str_replace('PhpOffice\\PhpWord\\Element', $this->namespace, $elementClass);
54+
$elementClass = substr(get_class($element), strrpos(get_class($element), '\\') + 1);
55+
$writerClass = $this->namespace . '\\' . $elementClass;
56+
57+
// Check it's a page break. No need to write it, instead, flag containers' pageBreakBefore
58+
// to be assigned to the next element
59+
if ($elementClass == 'PageBreak') {
60+
$this->setPageBreakBefore(true);
61+
continue;
62+
}
5663
if (class_exists($writerClass)) {
64+
// Get container's page break before and reset it
65+
$pageBreakBefore = $this->hasPageBreakBefore();
66+
$this->setPageBreakBefore(false);
67+
68+
/** @var \PhpOffice\PhpWord\Writer\Word2007\Element\AbstractElement $writer Type hint */
5769
$writer = new $writerClass($xmlWriter, $element, $withoutP);
70+
$writer->setPageBreakBefore($pageBreakBefore);
5871
$writer->write();
5972
}
6073
}
6174

62-
// Special case for Cell: They have to contain a w:p element at the end
75+
// Special case for Cell: They have to contain a w:p element at the end. The $elementClass contains
76+
// the last element name. If it's empty string or Table, the last element is not w:p
6377
if ($containerClass == 'Cell') {
64-
if ($elementClass == '' || $elementClass == 'PhpOffice\\PhpWord\\Element\\Table') {
65-
$writerClass = "{$this->namespace}\\TextBreak";
78+
if ($elementClass == '' || $elementClass == 'Table') {
79+
$writerClass = $this->namespace . '\\TextBreak';
80+
/** @var \PhpOffice\PhpWord\Writer\Word2007\Element\AbstractElement $writer Type hint */
6681
$writer = new $writerClass($xmlWriter, new TextBreakElement(), $withoutP);
6782
$writer->write();
6883
}

src/PhpWord/Writer/Word2007/Element/PageBreak.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,27 @@
2020
/**
2121
* PageBreak element writer
2222
*
23+
* Originally, page break is rendered as a `w:p`, but this turns out to produce bug #150.
24+
* As of 0.11.0, page break is rendered as a `w:r` with `w:br` type "page" and `w:lastRenderedPageBreak`
25+
*
2326
* @since 0.10.0
2427
*/
2528
class PageBreak extends AbstractElement
2629
{
2730
/**
2831
* Write element
32+
*
33+
* @usedby \PhpOffice\PhpWord\Writer\Word2007\Element\Text::writeOpeningWP()
2934
*/
3035
public function write()
3136
{
3237
$xmlWriter = $this->getXmlWriter();
3338

34-
$xmlWriter->startElement('w:p');
3539
$xmlWriter->startElement('w:r');
3640
$xmlWriter->startElement('w:br');
3741
$xmlWriter->writeAttribute('w:type', 'page');
38-
$xmlWriter->endElement();
39-
$xmlWriter->endElement();
40-
$xmlWriter->endElement();
42+
$xmlWriter->endElement(); // w:br
43+
$xmlWriter->writeElement('w:lastRenderedPageBreak');
44+
$xmlWriter->endElement(); // w:r
4145
}
4246
}

src/PhpWord/Writer/Word2007/Element/Text.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
namespace PhpOffice\PhpWord\Writer\Word2007\Element;
1919

20+
use PhpOffice\PhpWord\Element\PageBreak as PageBreakElement;
2021
use PhpOffice\PhpWord\Writer\Word2007\Style\Font as FontStyleWriter;
2122
use PhpOffice\PhpWord\Writer\Word2007\Style\Paragraph as ParagraphStyleWriter;
2223

@@ -55,6 +56,8 @@ public function write()
5556

5657
/**
5758
* Write opening
59+
*
60+
* @uses \PhpOffice\PhpWord\Writer\Word2007\Element\PageBreak::write()
5861
*/
5962
protected function writeOpeningWP()
6063
{
@@ -63,10 +66,15 @@ protected function writeOpeningWP()
6366

6467
if (!$this->withoutP) {
6568
$xmlWriter->startElement('w:p');
66-
69+
// Paragraph style
6770
if (method_exists($element, 'getParagraphStyle')) {
6871
$this->writeParagraphStyle();
6972
}
73+
// PageBreak
74+
if ($this->hasPageBreakBefore()) {
75+
$elementWriter = new PageBreak($xmlWriter, new PageBreakElement());
76+
$elementWriter->write();
77+
}
7078
}
7179
}
7280

src/PhpWord/Writer/Word2007/Part/Settings.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
/**
2121
* Word2007 settings part writer: word/settings.xml
22+
*
23+
* @link http://www.schemacentral.com/sc/ooxml/t-w_CT_Settings.html
2224
*/
2325
class Settings extends AbstractPart
2426
{

0 commit comments

Comments
 (0)