Bugfix #150: Page break adds new line in the beginning of the new page

This commit is contained in:
Ivan Lanin 2014-05-18 22:23:28 +07:00
parent 7d9bcd46d4
commit 39d4e8ee54
6 changed files with 67 additions and 10 deletions

View File

@ -28,6 +28,7 @@ This release marked the change of PHPWord license from LGPL 2.1 to LGPL 3; new r
- Header: All images added to the second header were assigned to the first header - @basjan GH-222 - Header: All images added to the second header were assigned to the first header - @basjan GH-222
- Conversion: Fix conversion from cm to pixel, pixel to cm, and pixel to point - @basjan GH-233 GH-234 - Conversion: Fix conversion from cm to pixel, pixel to cm, and pixel to point - @basjan GH-233 GH-234
- PageBreak: Page break adds new line in the beginning of the new page - @ivanlanin GH-150
### Deprecated ### Deprecated

View File

@ -49,6 +49,13 @@ abstract class AbstractElement
*/ */
protected $withoutP = false; protected $withoutP = false;
/**
* Has page break before
*
* @var bool
*/
private $pageBreakBefore = false;
/** /**
* Write element * Write element
*/ */
@ -88,6 +95,26 @@ abstract class AbstractElement
return $this->element; return $this->element;
} }
/**
* Has page break before
*
* @return bool
*/
public function hasPageBreakBefore()
{
return $this->pageBreakBefore;
}
/**
* Set page break before
*
* @param bool $value
*/
public function setPageBreakBefore($value = true)
{
$this->pageBreakBefore = (bool)$value;
}
/** /**
* Convert text to valid format * Convert text to valid format
* *

View File

@ -51,18 +51,33 @@ class Container extends AbstractElement
$elements = $container->getElements(); $elements = $container->getElements();
$elementClass = ''; $elementClass = '';
foreach ($elements as $element) { foreach ($elements as $element) {
$elementClass = get_class($element); $elementClass = substr(get_class($element), strrpos(get_class($element), '\\') + 1);
$writerClass = str_replace('PhpOffice\\PhpWord\\Element', $this->namespace, $elementClass); $writerClass = $this->namespace . '\\' . $elementClass;
// Check it's a page break. No need to write it, instead, flag containers' pageBreakBefore
// to be assigned to the next element
if ($elementClass == 'PageBreak') {
$this->setPageBreakBefore(true);
continue;
}
if (class_exists($writerClass)) { if (class_exists($writerClass)) {
// Get container's page break before and reset it
$pageBreakBefore = $this->hasPageBreakBefore();
$this->setPageBreakBefore(false);
/** @var \PhpOffice\PhpWord\Writer\Word2007\Element\AbstractElement $writer Type hint */
$writer = new $writerClass($xmlWriter, $element, $withoutP); $writer = new $writerClass($xmlWriter, $element, $withoutP);
$writer->setPageBreakBefore($pageBreakBefore);
$writer->write(); $writer->write();
} }
} }
// Special case for Cell: They have to contain a w:p element at the end // Special case for Cell: They have to contain a w:p element at the end. The $elementClass contains
// the last element name. If it's empty string or Table, the last element is not w:p
if ($containerClass == 'Cell') { if ($containerClass == 'Cell') {
if ($elementClass == '' || $elementClass == 'PhpOffice\\PhpWord\\Element\\Table') { if ($elementClass == '' || $elementClass == 'Table') {
$writerClass = "{$this->namespace}\\TextBreak"; $writerClass = $this->namespace . '\\TextBreak';
/** @var \PhpOffice\PhpWord\Writer\Word2007\Element\AbstractElement $writer Type hint */
$writer = new $writerClass($xmlWriter, new TextBreakElement(), $withoutP); $writer = new $writerClass($xmlWriter, new TextBreakElement(), $withoutP);
$writer->write(); $writer->write();
} }

View File

@ -20,23 +20,27 @@ namespace PhpOffice\PhpWord\Writer\Word2007\Element;
/** /**
* PageBreak element writer * PageBreak element writer
* *
* Originally, page break is rendered as a `w:p`, but this turns out to produce bug #150.
* As of 0.11.0, page break is rendered as a `w:r` with `w:br` type "page" and `w:lastRenderedPageBreak`
*
* @since 0.10.0 * @since 0.10.0
*/ */
class PageBreak extends AbstractElement class PageBreak extends AbstractElement
{ {
/** /**
* Write element * Write element
*
* @usedby \PhpOffice\PhpWord\Writer\Word2007\Element\Text::writeOpeningWP()
*/ */
public function write() public function write()
{ {
$xmlWriter = $this->getXmlWriter(); $xmlWriter = $this->getXmlWriter();
$xmlWriter->startElement('w:p');
$xmlWriter->startElement('w:r'); $xmlWriter->startElement('w:r');
$xmlWriter->startElement('w:br'); $xmlWriter->startElement('w:br');
$xmlWriter->writeAttribute('w:type', 'page'); $xmlWriter->writeAttribute('w:type', 'page');
$xmlWriter->endElement(); $xmlWriter->endElement(); // w:br
$xmlWriter->endElement(); $xmlWriter->writeElement('w:lastRenderedPageBreak');
$xmlWriter->endElement(); $xmlWriter->endElement(); // w:r
} }
} }

View File

@ -17,6 +17,7 @@
namespace PhpOffice\PhpWord\Writer\Word2007\Element; namespace PhpOffice\PhpWord\Writer\Word2007\Element;
use PhpOffice\PhpWord\Element\PageBreak as PageBreakElement;
use PhpOffice\PhpWord\Writer\Word2007\Style\Font as FontStyleWriter; use PhpOffice\PhpWord\Writer\Word2007\Style\Font as FontStyleWriter;
use PhpOffice\PhpWord\Writer\Word2007\Style\Paragraph as ParagraphStyleWriter; use PhpOffice\PhpWord\Writer\Word2007\Style\Paragraph as ParagraphStyleWriter;
@ -55,6 +56,8 @@ class Text extends AbstractElement
/** /**
* Write opening * Write opening
*
* @uses \PhpOffice\PhpWord\Writer\Word2007\Element\PageBreak::write()
*/ */
protected function writeOpeningWP() protected function writeOpeningWP()
{ {
@ -63,10 +66,15 @@ class Text extends AbstractElement
if (!$this->withoutP) { if (!$this->withoutP) {
$xmlWriter->startElement('w:p'); $xmlWriter->startElement('w:p');
// Paragraph style
if (method_exists($element, 'getParagraphStyle')) { if (method_exists($element, 'getParagraphStyle')) {
$this->writeParagraphStyle(); $this->writeParagraphStyle();
} }
// PageBreak
if ($this->hasPageBreakBefore()) {
$elementWriter = new PageBreak($xmlWriter, new PageBreakElement());
$elementWriter->write();
}
} }
} }

View File

@ -19,6 +19,8 @@ namespace PhpOffice\PhpWord\Writer\Word2007\Part;
/** /**
* Word2007 settings part writer: word/settings.xml * Word2007 settings part writer: word/settings.xml
*
* @link http://www.schemacentral.com/sc/ooxml/t-w_CT_Settings.html
*/ */
class Settings extends AbstractPart class Settings extends AbstractPart
{ {