ฝังฟอนต์ในงานนำเสนอโดยใช้ PHP
บทนำ
การฝังฟอนต์จะเก็บข้อมูลฟอนต์ไว้ภายในไฟล์การนำเสนอ PowerPoint เมื่อโปรแกรมดูสนับสนุนฟอนต์ที่ฝังไว้ มันจะสามารถแสดงข้อความโดยใช้ฟอนต์เหล่านั้นแม้ว่าไม่ได้ติดตั้งบนระบบเป้าหมาย การทำเช่นนี้ช่วยรักษาการตัดบรรทัด การจัดช่องว่างของข้อความ และการจัดรูปแบบสไลด์
Aspose.Slides for PHP via Java ช่วยให้คุณเรียกคืน เพิ่ม และลบฟอนต์ที่ฝังไว้ผ่านคลาส FontsManager ที่ได้รับจาก Presentation::getFontsManager คุณยังสามารถลดขนาดข้อมูลฟอนต์ที่ฝังไว้โดยการลบอักขระที่การนำเสนอไม่ได้ใช้
ตัวอย่างต่อไปนี้ทำงานกับไฟล์ PPTX ก่อนที่จะฝังฟอนต์ อย่าลืมตรวจสอบว่าข้อมูลฟอนต์พร้อมใช้งานสำหรับ Aspose.Slides และใบอนุญาตของฟอนต์อนุญาตให้ฝังได้
รับและลบฟอนต์ที่ฝังไว้
ใช้ FontsManager::getEmbeddedFonts เพื่อแสดงรายการฟอนต์ที่จัดเก็บไว้ในงานนำเสนอ เพื่อจะลบฟอนต์หนึ่ง ให้ส่งฟอนต์จากรายการนั้นไปยัง FontsManager::removeEmbeddedFont แล้วบันทึกงานนำเสนอ
ตัวอย่างต่อไปนี้แสดงรายการฟอนต์ที่ฝังไว้ใน EmbeddedFonts.pptx และลบ Calibri หากพบอยู่:
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("EmbeddedFonts.pptx");
try {
$fontsManager = $presentation->getFontsManager();
$embeddedFonts = $fontsManager->getEmbeddedFonts();
foreach ($embeddedFonts as $font) {
echo java_values($font->getFontName()) . PHP_EOL;
}
$fontToRemove = null;
foreach ($embeddedFonts as $font) {
$fontName = java_values($font->getFontName());
if (strcasecmp($fontName, "Calibri") === 0) {
$fontToRemove = $font;
break;
}
}
if ($fontToRemove !== null) {
$fontsManager->removeEmbeddedFont($fontToRemove);
$presentation->save("WithoutEmbeddedCalibri.pptx", SaveFormat::Pptx);
} else {
echo "Calibri is not embedded. No output file was created." . PHP_EOL;
}
} finally {
$presentation->dispose();
}
การลบฟอนต์ที่ฝังไว้จะทำการลบข้อมูลฟอนต์ที่จัดเก็บไว้; ไม่ได้เปลี่ยนฟอนต์ที่กำหนดให้กับข้อความ หากฟอนต์ติดตั้งบนระบบเป้าหมาย ข้อความยังสามารถใช้ฟอนต์นั้นได้ มิฉะนั้น การเรนเดอร์อาจต้องใช้ font substitution ซึ่งอาจส่งผลต่อการจัดวาง
ตรวจสอบข้อมูลฟอนต์และสิทธิ์การฝัง
ใช้คลาส FontsManager เพื่อตรวจสอบฟอนต์ก่อนทำการฝัง เรียกใช้ FontsManager::getFonts เพื่อดึงฟอนต์ที่ใช้ในงานนำเสนอ สำหรับแต่ละฟอนต์ ให้ส่งอ็อบเจ็กต์ FontData และค่าที่ต้องการของ FontStyleType ไปยัง FontsManager::getFontBytes เมธอดนี้จะคืนค่าข้อมูลไบนารีของสไตล์ฟอนต์นั้น หรือ null เมื่อฟอนต์หรือสไตล์ที่ขอไม่มีอยู่ อย่าส่งผลลัพธ์ null ไปยัง FontsManager::getFontEmbeddingLevel เนื่องจากเมธอดนั้นต้องการอาร์เรย์ไบต์
EmbeddingLevel เป็นการกำหนดค่าแบบแฟล็กที่รายงานข้อจำกัดการฝังที่เก็บไว้ในฟอนต์:
Installableอนุญาตให้ฝังและติดตั้งถาวรบนระบบอื่นตามเงื่อนไขของใบอนุญาตฟอนต์Restrictedห้ามฝังเว้นแต่จะได้รับอนุญาตจากเจ้าของลิขสิทธิ์ฟอนต์เมื่อเป็นแฟล็กสิทธิ์การใช้งานเดียวPreviewPrintอนุญาตให้ใช้ชั่วคราวเพื่อดูและพิมพ์; เอกสารที่มีฟอนต์ต้องเป็นแบบอ่านอย่างเดียวEditableอนุญาตให้ใช้ชั่วคราวและให้เอกสารสามารถแก้ไขและบันทึกได้NoSubsettingเป็นข้อจำกัดเพิ่มเติมที่ห้ามฝังเฉพาะส่วนย่อยของ glyphs. ต้องฝังทุกอักขระเมื่อมีแฟล็กนี้BitmapOnlyเป็นข้อจำกัดเพิ่มเติมที่อนุญาตให้ฝังเฉพาะ bitmap strikes เท่านั้น ไม่ใช่ข้อมูล outlines. หากฟอนต์ไม่มี bitmap strikes จะไม่สามารถฝังได้
สี่ค่าตัวแรกอธิบายสิทธิ์การใช้งาน ส่วน NoSubsetting และ BitmapOnly สามารถรวมกับค่าต่าง ๆ ได้ ตรวจสอบตัวแก้ไขด้วยการดำเนินการบิตวายส์ เนื่องจาก Installable มีค่าเป็นศูนย์ ให้ทำการมาสก์บิตสิทธิ์การใช้งานและเปรียบเทียบผลลัพธ์กับ Installable แทนการตรวจสอบเป็นแฟล็ก ฟอนต์ปัจจุบันควรกำหนดบิตสิทธิ์การใช้งานไม่เกินหนึ่งบิต เพื่อความเข้ากันได้กับฟอนต์รุ่นเก่าที่กำหนดมากกว่าหนึ่งบิต ตัวช่วยด้านล่างจะเลือกสิทธิ์ที่ผ่อนปรนที่สุด: Editable แล้วตามด้วย PreviewPrint แล้วตามด้วย Restricted
ตัวอย่างต่อไปนี้ตรวจสอบข้อมูลปกติ, ตัวหนา, ตัวเอียง, และตัวหนาเอียงของฟอนต์ทุกตัวที่ FontsManager::getFonts คืนค่า มันจะข้ามสไตล์ที่ไม่พร้อมใช้งาน, ฟอนต์ที่จำกัด, ฟอนต์ bitmap‑only, ฟอนต์ที่จำกัดให้ดูและพิมพ์เท่านั้นเนื่องจากผลลัพธ์ยังคงแก้ไขได้, และฟอนต์ที่ฝังไว้แล้ว หากสไตล์ใดสไตล์หนึ่งมี NoSubsetting จะฝังทุกอักขระสำหรับตระกูลฟอนต์นั้น
use aspose\slides\EmbedFontCharacters;
use aspose\slides\EmbeddingLevel;
use aspose\slides\FontStyleType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
function getUsagePermission($level) {
$permissionMask = EmbeddingLevel::Restricted | EmbeddingLevel::PreviewPrint | EmbeddingLevel::Editable;
$permissions = $level & $permissionMask;
if (($permissions & EmbeddingLevel::Editable) !== 0) {
return EmbeddingLevel::Editable;
}
if (($permissions & EmbeddingLevel::PreviewPrint) !== 0) {
return EmbeddingLevel::PreviewPrint;
}
if (($permissions & EmbeddingLevel::Restricted) !== 0) {
return EmbeddingLevel::Restricted;
}
return EmbeddingLevel::Installable;
}
$presentation = new Presentation("Fonts.pptx");
try {
$fontsManager = $presentation->getFontsManager();
$fontStyles = [
FontStyleType::Regular,
FontStyleType::Bold,
FontStyleType::Italic,
FontStyleType::Bold | FontStyleType::Italic
];
$embeddedFontNames = [];
foreach ($fontsManager->getEmbeddedFonts() as $embeddedFont) {
$fontName = java_values($embeddedFont->getFontName());
$embeddedFontNames[strtolower($fontName)] = true;
}
$fontsToEmbed = [];
$embeddingRules = [];
foreach ($fontsManager->getFonts() as $font) {
$fontName = java_values($font->getFontName());
if (isset($embeddedFontNames[strtolower($fontName)])) {
echo $fontName . ": already embedded." . PHP_EOL;
continue;
}
$hasAvailableData = false;
$allAvailableStylesCanBeEmbedded = true;
$previewPrintOnly = false;
$requiresFullFont = false;
foreach ($fontStyles as $fontStyle) {
$fontBytes = $fontsManager->getFontBytes($font, $fontStyle);
if (java_is_null($fontBytes)) {
echo $fontName . " (" . $fontStyle . "): font data is unavailable." . PHP_EOL;
continue;
}
$hasAvailableData = true;
$embeddingLevel = java_values($fontsManager->getFontEmbeddingLevel($fontBytes, $fontName));
$usagePermission = getUsagePermission($embeddingLevel);
$noSubsetting = ($embeddingLevel & EmbeddingLevel::NoSubsetting) !== 0;
$bitmapOnly = ($embeddingLevel & EmbeddingLevel::BitmapOnly) !== 0;
$requiresFullFont = $requiresFullFont || $noSubsetting;
$previewPrintOnly = $previewPrintOnly || $usagePermission === EmbeddingLevel::PreviewPrint;
$allAvailableStylesCanBeEmbedded = $allAvailableStylesCanBeEmbedded && $usagePermission !== EmbeddingLevel::Restricted && !$bitmapOnly;
echo $fontName . " (" . $fontStyle . "): " . $embeddingLevel . "." . PHP_EOL;
}
if (!$hasAvailableData) {
echo $fontName . ": skipped because no requested style is available." . PHP_EOL;
} elseif (!$allAvailableStylesCanBeEmbedded) {
echo $fontName . ": skipped because at least one available style does not permit outline embedding." . PHP_EOL;
} elseif ($previewPrintOnly) {
echo $fontName . ": skipped because this example produces an editable presentation." . PHP_EOL;
} else {
$rule = $requiresFullFont ? EmbedFontCharacters::All : EmbedFontCharacters::OnlyUsed;
$fontsToEmbed[] = $font;
$embeddingRules[] = $rule;
}
}
for ($i = 0; $i < count($fontsToEmbed); $i++) {
$fontsManager->addEmbeddedFont($fontsToEmbed[$i], $embeddingRules[$i]);
}
$presentation->save("WithAuditedFonts.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
การตรวจสอบนี้รายงานข้อจำกัดที่เข้ารหัสในแต่ละไฟล์ฟอนต์ มันไม่ได้ให้สิทธิ์ใบอนุญาต, พิสูจน์ว่าคุณได้ฟอนต์อย่างถูกกฎหมาย, หรือแทนที่การตรวจสอบสัญญาใบอนุญาตของฟอนต์ก่อนแจกจ่ายสำเนาที่ฝังไว้
เพิ่มฟอนต์ที่ฝังไว้
ใช้ FontsManager::addEmbeddedFont เพื่อฝังฟอนต์ การโอเวอร์โหลดรับอ็อบเจ็กต์ FontData หรืออาร์เรย์ไบต์ที่มีข้อมูลฟอนต์ EmbedFontCharacters เป็นการกำหนดค่าว่าอักขระใดจะรวมอยู่:
- All ฝังทุกอักขระในฟอนต์ ใช้ตัวเลือกนี้เมื่อผู้รับต้องการแก้ไขงานนำเสนอและพิมพ์ข้อความใหม่
- OnlyUsed ฝังเฉพาะอักขระที่ใช้ในงานนำเสนอเพื่อลดขนาดไฟล์ เลือกตัวเลือกนี้สำหรับงานนำเสนอที่เสร็จสมบูรณ์และมุ่งเน้นการดูเป็นหลัก
ตัวอย่างต่อไปนี้ใช้ FontsManager::getFonts เพื่อดึงฟอนต์ที่ใช้ใน Fonts.pptx และฝังฟอนต์ที่ยังไม่ได้ฝัง ฟอนต์ที่จะเพิ่มต้องพร้อมใช้งานบนเครื่องที่รันโค้ด ฟอนต์ที่ฝังอยู่แล้วจะคงชุดอักขระปัจจุบันไว้
use aspose\slides\EmbedFontCharacters;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("Fonts.pptx");
try {
$fontsManager = $presentation->getFontsManager();
$allFonts = $fontsManager->getFonts();
$embeddedFonts = $fontsManager->getEmbeddedFonts();
$embeddedFontNames = [];
foreach ($embeddedFonts as $embeddedFont) {
$fontName = java_values($embeddedFont->getFontName());
$embeddedFontNames[strtolower($fontName)] = true;
}
foreach ($allFonts as $font) {
$fontName = java_values($font->getFontName());
$normalizedFontName = strtolower($fontName);
if (!isset($embeddedFontNames[$normalizedFontName])) {
$fontsManager->addEmbeddedFont($font, EmbedFontCharacters::All);
$embeddedFontNames[$normalizedFontName] = true;
}
}
$presentation->save("WithEmbeddedFonts.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
บีบอัดฟอนต์ที่ฝังไว้
Compress::compressEmbeddedFonts ลดข้อมูลฟอนต์ที่ฝังไว้โดยลบอักขระที่ไม่ได้ใช้ มันทำงานกับฟอนต์ที่ฝังไว้แล้ว ดังนั้นการลดขนาดขึ้นอยู่กับจำนวนข้อมูลฟอนต์ที่ไม่ได้ใช้ในงานนำเสนอ
ตัวอย่างต่อไปนี้จะบีบอัดฟอนต์ใน EmbeddedFonts.pptx และบันทึกผลลัพธ์เป็นไฟล์แยก:
use aspose\slides\Compress;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("EmbeddedFonts.pptx");
try {
Compress::compressEmbeddedFonts($presentation);
$presentation->save("CompressedEmbeddedFonts.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
เก็บไฟล์ต้นฉบับไว้หากผู้รับอาจต้องเพิ่มข้อความในภายหลัง อักขระที่ลบระหว่างการบีบอัดจะไม่มีอยู่ในฟอนต์ที่ฝังแล้ว แม้ว่าคุณจะฝังทุกอักขระตั้งแต่แรก
คำถามที่พบบ่อย
ฉันจะตรวจสอบได้อย่างไรว่าฟอนต์ที่ฝังไว้จะยังถูกแทนที่ระหว่างการเรนเดอร์หรือไม่?
เรียกใช้ FontsManager::getSubstitutions ในสภาพแวดล้อมที่คุณเรนเดอร์งานนำเสนอเพื่อดูฟอนต์ที่ Aspose.Slides จะเปลี่ยน นอกจากนี้ตรวจสอบการตั้งค่า font substitution และกฎ font fallback การ fallback จะจัดการอักขระที่หายไป ดังนั้นการฝังฟอนต์จะไม่แก้ไขอักขระที่ฟอนต์เองไม่มี
ฉันควรฝังฟอนต์ทั่วไปเช่น Arial และ Calibri หรือไม่?
ให้ตัดสินใจตามสภาพแวดล้อมเป้าหมาย หากฟอนต์ที่ต้องการมีอยู่บนทุกเครื่องที่เปิดหรือเรนเดอร์งานนำเสนอ การฝังอาจทำให้ไฟล์ใหญ่เกินความจำเป็น หากผู้รับหรือเซิร์ฟเวอร์อาจไม่มีฟอนต์เหล่านั้น การฝังฟอนต์ช่วยรักษารูปแบบที่ต้องการได้ ตราบใดที่ใบอนุญาตของฟอนต์อนุญาต