使用 PHP 在簡報中嵌入字型

簡介

PowerPoint 中的嵌入字型 在您希望簡報於任何系統或裝置上開啟時都能正確顯示時非常有用。若因為在作品中發揮創意而使用了第三方或非標準字型,則更應該將字型嵌入。否則(未嵌入字型),投影片上的文字或數字、版面配置、樣式等可能會變更,甚至變成難以辨識的方塊。

[FontsManager] 類別、[FontData] 類別與 [Compress] 類別包含了處理 PowerPoint 簡報中嵌入字型所需的大部分方法。

取得與移除嵌入字型

Aspose.Slides 提供了由 [FontsManager] 類別所公開的 [getEmbeddedFonts] 方法,讓您取得(或查詢)簡報中嵌入的字型。若要移除字型,則使用同一類別的 [removeEmbeddedFont] 方法。

以下 PHP 程式碼示範如何從簡報中取得與移除嵌入字型:

  # 實例化一個代表簡報檔案的 Presentation 物件
  $pres = new Presentation("EmbeddedFonts.pptx");
  try {
    # 轉換包含使用嵌入 \"FunSized\" 字型的文字框的投影片
    $slideImage = $pres->getSlides()->get_Item(0)->getImage(new Java("java.awt.Dimension", 960, 720));
    # 將影像以 JPEG 格式儲存到磁碟
    try {
      $slideImage->save("picture1_out.jpg", ImageFormat::Jpeg);
    } finally {
      if (!java_is_null($slideImage)) {
        $slideImage->dispose();
      }
    }
    $fontsManager = $pres->getFontsManager();
    # 取得所有嵌入的字型
    $embeddedFonts = $fontsManager->getEmbeddedFonts();
    # 找尋 \"Calibri\" 字型
    $calibriEmbeddedFont = null;
    $Array = new java_class("java.lang.reflect.Array");
    for($i = 0; $i < java_values($Array->getLength($embeddedFonts)) ; $i++) {
      echo("" . $embeddedFonts[$i]->getFontName());
      if ("Calibri"->equals($embeddedFonts[$i]->getFontName())) {
        $calibriEmbeddedFont = $embeddedFonts[$i];
        break;
      }
    }
    # 移除 \"Calibri\" 字型
    $fontsManager->removeEmbeddedFont($calibriEmbeddedFont);
    # 轉換簡報; \"Calibri\" 字型將被現有字型取代
    $slideImage = $pres->getSlides()->get_Item(0)->getImage(new Java("java.awt.Dimension", 960, 720));
    # 將影像以 JPEG 格式儲存到磁碟
    try {
      $slideImage->save("picture2_out.jpg", ImageFormat::Jpeg);
    } finally {
      if (!java_is_null($slideImage)) {
        $slideImage->dispose();
      }
    }
    # 將未嵌入 \"Calibri\" 字型的簡報儲存到磁碟
    $pres->save("WithoutManageEmbeddedFonts_out.ppt", SaveFormat::Ppt);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

加入嵌入字型

使用 [EmbedFontCharacters] 類別以及 [addEmbeddedFont] 方法的兩個重載,您可以選擇偏好的(嵌入)規則,將字型嵌入簡報中。以下 PHP 程式碼示範如何在簡報中嵌入與加入字型:

  # 載入簡報
  $pres = new Presentation("Fonts.pptx");
  try {
    $allFonts = $pres->getFontsManager()->getFonts();
    $embeddedFonts = $pres->getFontsManager()->getEmbeddedFonts();
    $Array = new java_class("java.lang.reflect.Array");
    foreach($allFonts as $font) {
      $embeddedFontsContainsFont = false;
      for($i = 0; $i < java_values($Array->getLength($embeddedFonts)) ; $i++) {
        if ($embeddedFonts[$i]->equals($font)) {
          $embeddedFontsContainsFont = true;
          break;
        }
      }
      if (!$embeddedFontsContainsFont) {
        $pres->getFontsManager()->addEmbeddedFont($font, EmbedFontCharacters->All);
        $embeddedFonts = $pres->getFontsManager()->getEmbeddedFonts();
      }
    }
    # 將簡報儲存至磁碟
    $pres->save("AddEmbeddedFont_out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

壓縮嵌入字型

為了讓您壓縮簡報中嵌入的字型以減少檔案大小,Aspose.Slides 提供了由 [Compress] 類別所公開的 [compressEmbeddedFonts] 方法。

以下 PHP 程式碼示範如何壓縮嵌入的 PowerPoint 字型:

  $pres = new Presentation("pres.pptx");
  try {
    Compress->compressEmbeddedFonts($pres);
    $pres->save("pres-out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

FAQ

如何判斷簡報中即使已嵌入仍會在呈現時被替代的特定字型?

請檢查字型管理員中的 替代資訊 以及 備援/替代規則:若字型不可用或受限,系統會使用備援字型。

將「系統」字型(如 Arial / Calibri)嵌入是否有價值?

通常不需要——這類字型幾乎隨處可得。但在「精簡」環境(Docker、未預先安裝字型的 Linux 伺服器)中,若要確保完整可移植性,嵌入系統字型可避免意外的替代風險。