phppresentation 踩坑指南

Michael762發表於2020-05-29

這個包是 github.com/PHPOffice 家族用於匯出ppt用的.

composer require phpoffice/phppresentation

預設安裝的是master分支的,建議安裝develop分支.master分支3年前已經停止合併了,develop分支仍在維護,有相當一部分bug是最近幾年修改的.如我遇到的匯出的ppt在office顯示正常,但是在wps上的文字框中的內容位置錯亂.

composer require phpoffice/phppresentation dev-develop

建立ppt

$presentation = new PhpPresentation();

// 移除0索引
$presentation->removeSlideByIndex(0);

// 設定長寬比
$layout = new DocumentLayout();
// 長寬比,在PowerPoint2007下實際長寬是25cm和15cm左右,但是2016之後的office版本是32cm和24cm,產品給模板的時候得按照這個長寬比給,不然會有偏差
$layout->setDocumentLayout('screen16x9');
$presentation->setLayout($layout);

// 寫一些頁面
$this->generateSheet($presentation);

$oWriterPPTX = IOFactory::createWriter($presentation, 'PowerPoint2007');
$path = storage_path('ppts/匯出ppt' . now()->format('YmdHis') . '.pptx');
if (!file_exists(storage_path('ppts'))) {
 mkdir(storage_path('ppts'));
}

// 生成ppt
$oWriterPPTX->save($path);
return $path;

生成sheet

private function sheet(PhpPresentation $presentation)
{
    $currentSlide = $presentation->createSlide();
    // 建立畫布
    $shape = $currentSlide->createDrawingShape();

    // 背景圖,07版ppt下長寬為960畫素和540畫素
    $this->createBackImage($shape, 'xxx.png', 960, 540);

    // 生成文字框
    $this->createText(...$params);

    // 新增畫布圖片
    $this->addImage(...$params);
}

背景圖

private function createBackImage(AbstractShape $shape, $url, $width, $height, $offsetX = 0, $offsetY = 0)
{
      $url = public_path("imgs/{$url}");

    // 設定圖片屬性
      $shape->setPath($url) // 本地圖片路徑
     ->setWidth($width) // 設定寬
     ->setHeight($height) // 設定高
     ->setOffsetX($offsetX) // 設定x軸偏移量
     ->setOffsetY($offsetY); // 設定y軸偏移量
}

文字內容

public function createText(
        Slide $slide,
        $width,
        $height,
        $content,
        $size,
        $color,
        $horizontalAlign = 'ctr',
        $verticalAlign = 'ctr',
        $offsetX = 0,
        $offsetY = 0,
        $fillColor = Color::COLOR_WHITE,
        $font = '微軟雅黑',
        $bold = false
    ) {
    // 填充屬性
    $fill = new Fill();
    $fill->setFillType(Fill::FILL_SOLID)
         ->setStartColor(new Color($fillColor))
         ->setEndColor(new Color($fillColor));
    // 文字框屬性
    $shape = $slide->createRichTextShape() // 建立文字框
        ->setFill($fill) // 設定背景填充
        ->setWidth($width)
        ->setHeight($height)
        ->setOffsetX($offsetX)
        ->setOffsetY($offsetY);
    // 段落屬性
    $shape->getActiveParagraph()
        ->getAlignment()
        ->setHorizontal($horizontalAlign)
        ->setVertical($verticalAlign);
    // 生成
    $textRun = $shape->createTextRun($content);
    // 字型屬性
    $textRun->getFont()
        ->setName($font)
        ->setBold($bold)
        ->setSize($size)
        ->setColor(new Color($color));
}

放置圖片

public function addImage(Slide $slide, $url, $width, $height, $offsetX = 0, $offsetY = 0)
{
    $shape = new Base64();
    $shape->setResizeProportional(false);
    // 這裡與上面不同的是使用了獲取資料流轉base64使用網路圖片填充圖片的方式
    $shape->setData("data:image/jpeg;base64," . base64_encode(file_get_contents($url)))
        ->setWidth($width)   //設定圖片寬高
        ->setHeight($height)
        ->setOffsetX($offsetX)   //設定圖片在頁面中的偏移量
        ->setOffsetY($offsetY);

        $slide->addShape($shape);
}

以上就是我在這段時間使用該外掛所用到的一些方法了,能解決絕大部分問題了.如果還有其他更多的需求如設定過場動畫,都可以閱讀官方文件 phppresentation.readthedocs.io/en/... 找到.

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章