diff --git a/src/PhpWord/Style/Image.php b/src/PhpWord/Style/Image.php index f21e6674..7aabdeb2 100644 --- a/src/PhpWord/Style/Image.php +++ b/src/PhpWord/Style/Image.php @@ -19,7 +19,32 @@ class Image extends AbstractStyle const WRAPPING_STYLE_TIGHT = 'tight'; const WRAPPING_STYLE_BEHIND = 'behind'; const WRAPPING_STYLE_INFRONT = 'infront'; - + const POSITION_HORIZONTAL_LEFT = 'left'; + const POSITION_HORIZONTAL_CENTER = 'centered'; + const POSITION_HORIZONTAL_RIGHT = 'right'; + const POSITION_VERTICAL_TOP = 'top'; + const POSITION_VERTICAL_CENTER = 'center'; + const POSITION_VERTICAL_BOTTOM = 'bottom'; + const POSITION_VERTICAL_INSIDE = 'inside'; + const POSITION_VERTICAL_OUTSIDE = 'outside'; + const POSITION_HORIZONTAL_RELATIVE_MARGIN = 'margin'; + const POSITION_HORIZONTAL_RELATIVE_PAGE = 'page'; + const POSITION_HORIZONTAL_RELATIVE_COLUMN = 'column'; + const POSITION_HORIZONTAL_RELATIVE_CHAR = 'char'; + const POSITION_HORIZONTAL_RELATIVE_LMARGIN = 'left-margin-area'; + const POSITION_HORIZONTAL_RELATIVE_RMARGIN = 'right-margin-area'; + const POSITION_HORIZONTAL_RELATIVE_IMARGIN = 'inner-margin-area'; + const POSITION_HORIZONTAL_RELATIVE_OMARGIN = 'outer-margin-area'; + const POSITION_VERTICAL_RELATIVE_MARGIN = 'margin'; + const POSITION_VERTICAL_RELATIVE_PAGE = 'page'; + const POSITION_VERTICAL_RELATIVE_LINE = 'line'; + const POSITION_VERTICAL_RELATIVE_TMARGIN = 'top-margin-area'; + const POSITION_VERTICAL_RELATIVE_BMARGIN = 'bottom-margin-area'; + const POSITION_VERTICAL_RELATIVE_IMARGIN = 'inner-margin-area'; + const POSITION_VERTICAL_RELATIVE_OMARGIN = 'outer-margin-area'; + const POSITION_RELATIVE = 'relative'; + const POSITION_ABSOLUTE = 'absolute'; + /** * Image width * @@ -62,6 +87,42 @@ class Image extends AbstractStyle */ private $wrappingStyle; + /** + * Horizontal alignment + * + * @var string + */ + private $posHorizontal; + + /** + * Horizontal Relation + * + * @var string + */ + private $posHorizontalRel; + + /** + * Vertical alignment + * + * @var string + */ + private $posVertical; + + /** + * Vertical Relation + * + * @var string + */ + private $posVerticalRel; + + /** + * Positioning type (Relative or Absolute) + * + * @var string + */ + private $positioning; + + /** * Create new image style */ @@ -73,6 +134,11 @@ class Image extends AbstractStyle $this->marginTop = null; $this->marginLeft = null; $this->setWrappingStyle(self::WRAPPING_STYLE_INLINE); + $this->setPositioning(self::POSITION_RELATIVE); + $this->setPosHorizontal(self::POSITION_HORIZONTAL_LEFT); + $this->setPosHorizontalRel(self::POSITION_HORIZONTAL_RELATIVE_CHAR); + $this->setPosVertical(self::POSITION_VERTICAL_TOP); + $this->setPosVerticalRel(self::POSITION_VERTICAL_RELATIVE_LINE); } /** @@ -205,4 +271,176 @@ class Image extends AbstractStyle { return $this->wrappingStyle; } + + /** + * Set positioning type + * + * @param string $positioning + * @throws \InvalidArgumentException + * @return $this + */ + + public function setPositioning($positioning) + { + switch ($positioning) { + case self::POSITION_RELATIVE: + case self::POSITION_ABSOLUTE: + $this->positioning = $positioning; + break; + default: + throw new InvalidArgumentException('Positioning does not exists'); + break; + } + return $this; + } + + /** + * Get positioning type + * + * @return string + */ + public function getPositioning() + { + return $this->positioning; + } + + /** + * Set horizontal alignment + * + * @param string $alignment + * @throws \InvalidArgumentException + * @return $this + */ + public function setPosHorizontal($alignment) + { + switch ($alignment) { + case self::POSITION_HORIZONTAL_LEFT: + case self::POSITION_HORIZONTAL_CENTER: + case self::POSITION_HORIZONTAL_RIGHT: + $this->posHorizontal = $alignment; + break; + default: + throw new InvalidArgumentException('Horizontal alignment does not exists'); + break; + } + return $this; + } + + /** + * Get horizontal alignment + * + * @return string + */ + public function getPosHorizontal() + { + return $this->posHorizontal; + } + + /** + * Set vertical alignment + * + * @param string $alignment + * @throws \InvalidArgumentException + * @return $this + */ + + public function setPosVertical($alignment) + { + switch ($alignment) { + case self::POSITION_VERTICAL_TOP: + case self::POSITION_VERTICAL_CENTER: + case self::POSITION_VERTICAL_BOTTOM: + case self::POSITION_VERTICAL_INSIDE: + case self::POSITION_VERTICAL_OUTSIDE: + $this->posVertical = $alignment; + break; + default: + throw new InvalidArgumentException('Vertical alignment does not exists'); + break; + } + return $this; + } + + /** + * Get vertical alignment + * + * @return string + */ + public function getPosVertical() + { + return $this->posVertical; + } + + /** + * Set horizontal relation + * + * @param string $relto + * @throws \InvalidArgumentException + * @return $this + */ + public function setPosHorizontalRel($relto) + { + switch ($relto) { + case self::POSITION_HORIZONTAL_RELATIVE_MARGIN: + case self::POSITION_HORIZONTAL_RELATIVE_PAGE: + case self::POSITION_HORIZONTAL_RELATIVE_COLUMN: + case self::POSITION_HORIZONTAL_RELATIVE_CHAR: + case self::POSITION_HORIZONTAL_RELATIVE_LMARGIN: + case self::POSITION_HORIZONTAL_RELATIVE_RMARGIN: + case self::POSITION_HORIZONTAL_RELATIVE_IMARGIN: + case self::POSITION_HORIZONTAL_RELATIVE_OMARGIN: + $this->posHorizontalRel = $relto; + break; + default: + throw new InvalidArgumentException('Horizontal relation does not exists'); + break; + } + return $this; + } + + /** + * Get horizontal relation + * + * @return string + */ + public function getPosHorizontalRel() + { + return $this->posHorizontalRel; + } + + /** + * Set vertical relation + * + * @param string $relto + * @throws \InvalidArgumentException + * @return $this + */ + public function setPosVerticalRel($relto) + { + switch ($relto) { + case self::POSITION_VERTICAL_RELATIVE_MARGIN: + case self::POSITION_VERTICAL_RELATIVE_PAGE: + case self::POSITION_VERTICAL_RELATIVE_LINE: + case self::POSITION_VERTICAL_RELATIVE_TMARGIN: + case self::POSITION_VERTICAL_RELATIVE_BMARGIN: + case self::POSITION_VERTICAL_RELATIVE_IMARGIN: + case self::POSITION_VERTICAL_RELATIVE_OMARGIN: + $this->posVerticalRel = $relto; + break; + default: + throw new InvalidArgumentException('Vertical relation does not exists'); + break; + } + return $this; + } + + /** + * Get vertical relation + * + * @return string + */ + public function getPosVerticalRel() + { + return $this->posVerticalRel; + } } diff --git a/src/PhpWord/Writer/Word2007/Element/Image.php b/src/PhpWord/Writer/Word2007/Element/Image.php index e944b7af..80b71121 100644 --- a/src/PhpWord/Writer/Word2007/Element/Image.php +++ b/src/PhpWord/Writer/Word2007/Element/Image.php @@ -44,6 +44,7 @@ class Image extends Element $marginTop = $style->getMarginTop(); $marginLeft = $style->getMarginLeft(); $wrappingStyle = $style->getWrappingStyle(); + $positioning = $style->getPositioning(); $w10wrapType = null; $imgStyle = ''; if (null !== $width) { @@ -53,28 +54,44 @@ class Image extends Element $imgStyle .= 'height:' . $height . 'px;'; } if (null !== $marginTop) { - $imgStyle .= 'margin-top:' . $marginTop . 'in;'; + $imgStyle .= 'margin-top:' . $marginTop . 'px;'; } if (null !== $marginLeft) { - $imgStyle .= 'margin-left:' . $marginLeft . 'in;'; + $imgStyle .= 'margin-left:' . $marginLeft . 'px;'; } + $imgStyle.='position:absolute;mso-width-percent:0;mso-height-percent:0;mso-width-relative:margin;mso-height-relative:margin;'; + switch ($positioning) { + case ImageStyle::POSITION_RELATIVE: + $imgStyle.='mso-position-horizontal:'.$style->getPosHorizontal().';'; + $imgStyle.='mso-position-horizontal-relative:'.$style->getPosHorizontalRel().';'; + $imgStyle.='mso-position-vertical:'.$style->getPosVertical().';'; + $imgStyle.='mso-position-vertical-relative:'.$style->getPosVerticalRel().';'; + $imgStyle.='margin-left:0;margin-top:0;'; + break; + + case ImageStyle::POSITION_ABSOLUTE: + $imgStyle.='mso-position-horizontal-relative:page;'; + $imgStyle.='mso-position-vertical-relative:page;'; + break; + } + switch ($wrappingStyle) { case ImageStyle::WRAPPING_STYLE_BEHIND: - $imgStyle .= 'position:absolute;z-index:-251658752;'; + $imgStyle .= 'z-index:-251658752;'; break; case ImageStyle::WRAPPING_STYLE_INFRONT: - $imgStyle .= 'position:absolute;z-index:251659264;mso-position-horizontal:absolute;mso-position-vertical:absolute;'; + $imgStyle .= 'z-index:251659264;mso-position-horizontal:absolute;mso-position-vertical:absolute;'; break; case ImageStyle::WRAPPING_STYLE_SQUARE: - $imgStyle .= 'position:absolute;z-index:251659264;mso-position-horizontal:absolute;mso-position-vertical:absolute;'; + $imgStyle .= 'z-index:251659264;mso-position-horizontal:absolute;mso-position-vertical:absolute;'; $w10wrapType = 'square'; break; case ImageStyle::WRAPPING_STYLE_TIGHT: - $imgStyle .= 'position:absolute;z-index:251659264;mso-position-horizontal:absolute;mso-position-vertical:absolute;'; + $imgStyle .= 'z-index:251659264;mso-position-horizontal:absolute;mso-position-vertical:absolute;'; $w10wrapType = 'tight'; break; } - + if (!$this->withoutP) { $this->xmlWriter->startElement('w:p'); if (!is_null($align)) {