风火家人开发记要

技术总结精华贴

Tag: PHPOffice

PHP, 原创,

PHPOffice\PHPPresentation添加背景格式(图案填充)功能

使用PHPPresentation时我们发现,该开源软件竟然不支持图案填充功能,于是就自己补充了下,(本想将自己代码贡献给PHPOffice官方,因下载下来的开发版本无法通过单元测试,只能暂时写到此处供参考) 以下方式可以使PHPPresentation支持背景图案填充。 1.首先创建背景填充类文件 PHPOffice/PHPPresentation/src/PhpPresentation/Slide/Background/FillType.php 代码如下 <?php/** * Created by chenxue4076@163.com. * User: chenxue4076@163.com * Date: 2019/02/27 * Time: 14:46 * File name: FillType.php */namespace PhpOffice\PhpPresentation\Slide\Background;use PhpOffice\PhpPresentation\Slide\AbstractBackground;use PhpOffice\PhpPresentation\Style\Fill as StyleFill;class FillType extends AbstractBackground{ const FILL_PATTERN_BACKGROUND = array( “cross”, “dashDnDiag”, //dashed downward diagonal 下对角虚线 “dashHorz”, //dashed horizontal 横虚线 “dashUpDiag”, //dashed upward diagonal 上对角虚线 “dashVert”, //dashed vertical 竖虚线 “diagBrick”, //diagonal brick 对角砖型 “diagCross”, “divot”, //divot 草皮 “dkDnDiag”, //dark downward diagonal 深色下对角线 “dkHorz”, //dark horizontal 深色横线 “dkUpDiag”, //dark upward diagonal 深色上对角线 “dkVert”, //dark vertical 深色竖线 “dnDiag”, “dotDmnd”, //dotted diamond 点式菱形 “dotGrid”, //dotted grid 虚线网格 “horz”, “horzBrick”, //horizontal brick 横向砖型 “lgCheck”, //large checker board 大棋盘 “lgConfetti”, //large confetti 大纸屑 “lgGrid”, //large grid 大网格 “ltDnDiag”, //light downward diagonal 浅色下对角线 “ltHorz”, //light horizontal 浅色横线 “ltUpDiag”, //light upward diagonal 浅色上对角线 “ltVert”, //light vertical 浅色竖线 “narHorz”, //narrow horizontal 窄横线 “narVert”, //narrow vertical 窄竖线 “openDmnd”, //open diamond 轮廓式菱形? “pct5”, //5% “pct10”, //10% “pct20”, //20% “pct25”, //25% “pct30”, //30% “pct40”, //40% “pct50”, //50% “pct60”, //60% “pct70”, //70% “pct75”, //75% “pct80”, //80% “pct90”, //90% “plaid”, //plaid 苏格兰方格 “shingle”, //shingle卵石 瓦形 “smCheck”, //small checker board 小棋盘 “smConfetti”, //small confetti 小纸屑 “smGrid”, //small grid 小网格 “solidDmnd”, //solid diamond 实心菱形 “sphere”, //ball 球体 “trellis”, //trellises 棚架 “upDiag”, “vert”, “wave”, //wave 波浪 “wdDnDiag”, //wide downward diagonal

查看全文
PHP, 原创,

PHPOffice\PHPPresentation 使用Placeholder添加sldNum页码设置字体和页码位置BUG修复以及无法显示页码问题

被PHPPresentation的页码设置折腾了好几天,一直以为是自己的代码写的有问题,先说说目前我遇到的BUG 1.在Master或Slide中设置的Placeholder页码位置和大小无效,生成的PPT Placeholder始终在左上角0,0的位置。 2.为Placeholder设置的字体属性不生效,比如大小,居中等。 3.设置垂直居中需要不可以使用fontAlgn,不生效。 以下是解决方法: 修改文件 PHPOffice/PHPPresentation/src/PhpPresentation/Writer/PowerPoint2007/AbstractSlide.php 找到方法名 protected function writeShapeText(XMLWriter $objWriter, RichText $shape, $shapeId) 1.注释代码 1)找到代码 if (!$shape->isPlaceholder()) { // p:sp\p:spPr\a:xfrm 将if一行注释 这里是设置RichText的相关位置的,注释掉就可以将位置信息应用给Placeholder,否则位置在0,0 //if (!$shape->isPlaceholder()) { // p:sp\p:spPr\a:xfrm … //} 2)找到代码 if (!$shape->isPlaceholder()) { $verticalAlign = $shape->getActiveParagraph()->getAlignment()->getVertical(); 将if一行注释 这里设置的垂直居中,如果不注释掉垂直方向无法设置位置,文字只在顶部 //if (!$shape->isPlaceholder()) { $verticalAlign = $shape->getActiveParagraph()->getAlignment()->getVertical(); … //} 2.添加代码 1)找到代码 if ($shape->isPlaceholder() && ($shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM || $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_DATETIME) ) { $objWriter->startElement(‘a:p’); 在其后添加下面代码,主要是水平居中,margin值得设置等等 //TODO 此处为chenxue4076@163.com手动添加,为了是页码也能够使用到样式 //TODO 1添加排版信息 $paragraph =$shape->getActiveParagraph()->getAlignment(); //a:pPr $objWriter->startElement(‘a:pPr’); $objWriter->writeAttribute(‘algn’, $paragraph->getHorizontal()); $objWriter->writeAttribute(‘fontAlgn’, $paragraph->getVertical()); $objWriter->writeAttribute(‘marL’, CommonDrawing::pixelsToEmu($paragraph->getMarginLeft())); $objWriter->writeAttribute(‘marR’, CommonDrawing::pixelsToEmu($paragraph->getMarginRight())); $objWriter->writeAttribute(‘indent’, CommonDrawing::pixelsToEmu($paragraph->getIndent())); $objWriter->writeAttribute(‘lvl’, $paragraph->getLevel()); $objWriter->startElement(‘a:lnSpc’); $objWriter->startElement(‘a:spcPct’); $objWriter->writeAttribute(‘val’, $shape->getActiveParagraph()->getLineSpacing() . “%”); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); //TODO 1 END 添加排版信息 //TODO END 此处为chenxue4076@163.com手动添加,为了是页码也能够使用到样式 2)继续往下查找到代码 $objWriter->startElement(‘a:fld’); $objWriter->writeAttribute(‘id’, $this->getGUID()); $objWriter->writeAttribute(‘type’, ( $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ? ‘slidenum’ : ‘datetime’)); 在其后添加下面代码,主要是字体信息,比如加粗,字体类型,大小等信息 //TODO 此处为chenxue4076@163.com手动添加,为了是页码也能够使用到样式 //TODO 2 添加字体信息 $font = $shape->getActiveParagraph()->getFont(); // a:rPr $objWriter->startElement(‘a:rPr’); $objWriter->writeAttributeIf($font->isBold(), ‘b’, ‘1’); $objWriter->writeAttributeIf($font->isItalic(), ‘i’, ‘1’); $objWriter->writeAttributeIf($font->isStrikethrough(), ‘strike’, ‘sngStrike’); // Size $objWriter->writeAttribute(‘sz’, ($font->getSize() * 100)); // Character spacing $objWriter->writeAttribute(‘spc’, $font->getCharacterSpacing()); // Underline $objWriter->writeAttribute(‘u’, $font->getUnderline()); // Color – a:solidFill $objWriter->startElement(‘a:solidFill’); $this->writeColor($objWriter, $font->getColor()); $objWriter->endElement(); // Font – a:latin $objWriter->startElement(‘a:latin’); $objWriter->writeAttribute(‘typeface’, $font->getName()); $objWriter->endElement(); // a:rPr $objWriter->endElement(); //TODO 2 添加字体信息 //TODO END 此处为chenxue4076@163.com手动添加,为了是页码也能够使用到样式 经过以上几步设置,现在使用Placehoder 的 sldNum 已经能正常设置文字属性和位置了 下面是生成页码的函数方法,仅供参考 /** * @param PhpOffice\PhpPresentation\Slide $oSlide * @param string|array $text * @param float $width * @param float $height * @param float

查看全文