PHPPresentation中直线箭头Style的实现
问题:原版PHPPresentation无法编辑直线箭头
最近用PHPpresentation输出pptx文档,发现phppresentation没有提供编辑直线箭头类型的功能。与同事一起分析了pptx文档的结构和目录下的php代码。可以确认,直线的两端Style被写死了none,将这里改为’arrow’,可以看到所有的直线都带上了箭头,确认了我们的结论。
代码文档:PhpPresentation / Writer / PowerPoint2007 / AbstractDecoratorWriter.php
分析和方案
参考color的实现,phppresentation一般调用get函数来取得对象的值,而不是像headEnd那样写入固定值。在对应的类中有3项定义,分别为:数值项(及缺省值),get函数,set函数。
color相关代码:
我们拟定的方案是改写writer和Border类的定义,加上headEndType和tailEndType两个值,再定义相应的get和set函数分别用于取值和设值。
实现和代码
- 改写输出代码文档的111行和118行,这样写入的就不是none了。
代码文档:PhpPresentation / Writer / PowerPoint2007 / AbstractDecoratorWriter.php
// a:headEnd
$objWriter->startElement('a:headEnd');
$objWriter->writeAttribute('type', $pBorder->getHeadEndType());
$objWriter->writeAttribute('w', 'med');
$objWriter->writeAttribute('len', 'med');
$objWriter->endElement();
// a:tailEnd
$objWriter->startElement('a:tailEnd');
$objWriter->writeAttribute('type', $pBorder->getTailEndType());
$objWriter->writeAttribute('w', 'med');
$objWriter->writeAttribute('len', 'med');
$objWriter->endElement();
- 改写Border类
代码文档:PhpPresentation / Style / Border.php
我在82行加入了两行代码定义数据项和缺省值:
private $headEndType='none';
private $tailEndType='none';
在后面的113行加入两个值的get和set函数:
/*headEnd type and tailEnd Type. Revised by Hing Gu*/
public function setHeadEndType(string $pValue = "none"): self
{
$this->headEndType = $pValue;
return $this;
}
public function setTailEndType(string $pValue = "none"): self
{
$this->tailEndType = $pValue;
return $this;
}
public function getHeadEndType(): string
{
return $this->headEndType;
}
public function getTailEndType(): string
{
return $this->tailEndType;
}
- 最后在正常的PPT编辑代码中就可以跟其他值一样写入箭头的类型了:
$objPHPPowerPoint = new PhpPresentation();
$objPHPPowerPoint->getDocumentProperties();
$currentSlide = $objPHPPowerPoint -> getActiveSlide();
$currentSlide->createLineShape(10,10,100,100)
->getBorder()
->setLineStyle(Border::LINE_DOUBLE)// 设置线条样式(单条线,双条线,...)
->setHeadEndType('arrow')
->setTailEndType('arrow')
->setColor(new Color('FFAAAAAA'))
->setLineWidth(1);