在 JavaScript 中格式化簡報文字

概觀

本文說明如何使用 Aspose.Slides for Node.js via Java 來格式化 PowerPoint 與 OpenDocument 簡報的文字。內容涵蓋背景顏色、透明度、字元間距、字型屬性、旋轉、段落間距、自動調整行為、文字錨點、定位點以及語言設定。

除非另有說明,範例均使用 sample.pptx。其第一張投影片的第一個圖形為文字方塊,且其第一段落包含下列文字。投影片與圖形索引皆從零開始。選取粗體部分的範例使用有效格式,包括繼承的粗體格式:

範例文字

若要尋找並標示文字字面值或正規表達式匹配,請參閱 搜尋與取代文字。

設定文字背景顏色

使用 ParagraphFormat.getDefaultPortionFormat 來設定段落的預設突顯顏色,或使用 BasePortionFormat.getHighlightColor 設定個別文字部分的突顯顏色。

以下範例將淡灰色突顯設定為第一段落的預設。個別文字部分的明確突顯顏色會優先於此預設:

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    const paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);

    // 設定整個段落的突顯顏色。
    paragraph.getParagraphFormat().getDefaultPortionFormat().getHighlightColor().setColor(java.getStaticFieldValue("java.awt.Color", "LIGHT_GRAY"));

    presentation.save("gray_paragraph.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

灰色段落

以下程式碼範例示範如何為 粗體字體的文字部分 設定背景顏色:

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    const paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);
    const portions = paragraph.getPortions();
    const portionCount = portions.getCount();

    for (let portionIndex = 0; portionIndex < portionCount; portionIndex++) {
        const portion = portions.get_Item(portionIndex);
        if (portion.getPortionFormat().getEffective().getFontBold()) {
            // 設定文字部分的突顯顏色。
            portion.getPortionFormat().getHighlightColor().setColor(java.getStaticFieldValue("java.awt.Color", "LIGHT_GRAY"));
        }
    }

    presentation.save("gray_text_portions.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

灰色文字部分

對齊文字段落

使用 ParagraphFormat.setAlignment 來設定文字框內段落的對齊方式。其值可以是置中、左對齊、右對齊、兩端對齊等。

以下程式碼範例示範如何將段落對齊至 置中:

const aspose = { slides: require("aspose.slides.via.java") };

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    const paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);

    // 將段落的對齊方式設定為置中。
    paragraph.getParagraphFormat().setAlignment(aspose.slides.TextAlignment.Center);

    presentation.save("aligned_paragraph.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

已對齊的段落

在行內對齊字型

使用 ParagraphFormat.setFontAlignment 可以在同一行內垂直對齊不同字型大小的文字部分。此設定套用於整個段落,並控制其各行內的對齊方式。

以下獨立範例在同一投影片上建立四個帶標籤的文字方塊。每個段落以 18、36、54 點大小呈現相同文字,並使用不同的字型對齊方式。範例採用 Arial,停用自動調整與換行,且讓文字框足夠容納單行文字。

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const alignments = [aspose.slides.FontAlignment.Baseline, aspose.slides.FontAlignment.Top, aspose.slides.FontAlignment.Center, aspose.slides.FontAlignment.Bottom];
    const alignmentNames = ["Baseline", "Top", "Center", "Bottom"];
    const fontSizes = [18, 36, 54];

    for (let i = 0; i < alignments.length; i++) {
        const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 30, 20 + i * 130, 660, 120);
        shape.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.NoFill));
        shape.getLineFormat().getFillFormat().setFillType(java.newByte(aspose.slides.FillType.NoFill));

        const textFrame = shape.getTextFrame();
        textFrame.getTextFrameFormat().setAnchoringType(java.newByte(aspose.slides.TextAnchorType.Top));
        textFrame.getTextFrameFormat().setAutofitType(java.newByte(aspose.slides.TextAutofitType.None));
        textFrame.getTextFrameFormat().setWrapText(java.newByte(aspose.slides.NullableBool.False));

        const label = textFrame.getParagraphs().get_Item(0);
        label.setText(alignmentNames[i]);
        label.getParagraphFormat().setAlignment(aspose.slides.TextAlignment.Left);
        label.getParagraphFormat().getDefaultPortionFormat().setFontHeight(14);
        label.getParagraphFormat().getDefaultPortionFormat().setLatinFont(new aspose.slides.FontData("Arial"));
        label.getParagraphFormat().getDefaultPortionFormat().getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
        label.getParagraphFormat().getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(java.getStaticFieldValue("java.awt.Color", "GRAY"));

        const paragraph = new aspose.slides.Paragraph();
        paragraph.getParagraphFormat().setFontAlignment(alignments[i]);
        paragraph.getParagraphFormat().setAlignment(aspose.slides.TextAlignment.Left);
        paragraph.getParagraphFormat().getDefaultPortionFormat().setLatinFont(new aspose.slides.FontData("Arial"));
        paragraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
        paragraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(java.getStaticFieldValue("java.awt.Color", "BLACK"));

        for (const fontSize of fontSizes) {
            const portion = new aspose.slides.Portion("Ag ");
            portion.getPortionFormat().setFontHeight(fontSize);
            paragraph.getPortions().add(portion);
        }

        textFrame.getParagraphs().add(paragraph);
    }

    presentation.save("font_alignment.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

基線、上端、置中、下端字型對齊比較

字型對齊依據字型度量,因此個別字母的可見邊緣未必能完全對齊。範例同時包含大寫字母與下垂部份,以說明基線與底部對齊的差異。字型的可用性與替換、使用的字元以及字型大小差異皆會影響結果。框架尺寸、邊距、行距、換行與自動調整亦會影響版面;在比較模式時請使用相同的字型與版面設定。

此設定不同於 ParagraphFormat.setAlignment,後者控制段落的水平對齊;也不同於 TextFrameFormat.setAnchoringType,後者將文字區塊在形狀內垂直定位。透過 BasePortionFormat.setEscapement 設定的上標與下標格式會將個別文字部分相對於基線移動,而非為段落行設定字型對齊。

設定文字透明度

文字的透明度透過指派給 BasePortionFormat.getFillFormat 的顏色之 alpha 成分來控制。在下列範例中,alpha = 50 為 0–255 量表上的 ARGB alpha 通道值,而非透明度百分比。

以下程式碼範例示範如何將透明度套用於 整段落:

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const alpha = 50;
const transparentBlack = java.newInstanceSync("java.awt.Color", 0, 0, 0, alpha);
const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    const paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);
    const fillFormat = paragraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat();

    // 將文字的填充顏色設為透明顏色。
    fillFormat.setFillType(java.newByte(aspose.slides.FillType.Solid));
    fillFormat.getSolidFillColor().setColor(transparentBlack);

    presentation.save("transparent_paragraph.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

透明段落

以下程式碼範例示範如何將透明度套用於 粗體字體的文字部分:

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const alpha = 50;
const transparentBlack = java.newInstanceSync("java.awt.Color", 0, 0, 0, alpha);
const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    const paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);
    const portions = paragraph.getPortions();
    const portionCount = portions.getCount();

    for (let portionIndex = 0; portionIndex < portionCount; portionIndex++) {
        const portion = portions.get_Item(portionIndex);
        if (portion.getPortionFormat().getEffective().getFontBold()) {
            const fillFormat = portion.getPortionFormat().getFillFormat();

            // 設定文字部分的透明度。
            fillFormat.setFillType(java.newByte(aspose.slides.FillType.Solid));
            fillFormat.getSolidFillColor().setColor(transparentBlack);
        }
    }

    presentation.save("transparent_text_portions.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

透明文字部分

設定文字字元間距

使用 BasePortionFormat.setSpacing 可在文字方塊中擴大或壓縮字元之間的間距。範例中添加 3 點間距;負值則會壓縮文字。

以下 JavaScript 程式碼示範如何在 整段落 中擴大字元間距:

const aspose = { slides: require("aspose.slides.via.java") };

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    const paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);

    // 注意:使用負值可壓縮字元間距。
    paragraph.getParagraphFormat().getDefaultPortionFormat().setSpacing(3); // 展開字元間距。

    presentation.save("character_spacing_in_paragraph.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

段落字元間距

以下程式碼範例示範如何在 粗體字體的文字部分 中擴大字元間距:

const aspose = { slides: require("aspose.slides.via.java") };

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    const paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);
    const portions = paragraph.getPortions();
    const portionCount = portions.getCount();

    for (let portionIndex = 0; portionIndex < portionCount; portionIndex++) {
        const portion = portions.get_Item(portionIndex);
        if (portion.getPortionFormat().getEffective().getFontBold()) {
            // 注意:使用負值可壓縮字元間距。
            portion.getPortionFormat().setSpacing(3); // 展開字元間距。
        }
    }

    presentation.save("character_spacing_in_text_portions.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

文字部分字元間距

停用特定字型的字距調整

在某些情況下,Aspose.Slides 所渲染的文字可能比 PowerPoint 中顯示的同一文字稍微緊密。這可能是因為 PowerPoint 會忽略某些字型的字距調整資料,即使該字型具備有效的字距資訊且在 PowerPoint 設定中已啟用字距調整。

為了使渲染結果更接近 PowerPoint,可對使用受影響字型的文字部分停用字距調整。將 BasePortionFormat.setKerningMinimalSize 設為大於實際字型大小的數值。本範例需要一個名為 “presentation.pptx”、其第一張投影片的第一個圖形為文字方塊的檔案。程式會檢查有效的字型名稱(包括繼承字型),並對使用 Roboto 的文字部分設定 100 點的門檻。這會停用字型大小低於 100 點的相符文字部分的字距調整:

const aspose = { slides: require("aspose.slides.via.java") };

const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    const paragraphs = autoShape.getTextFrame().getParagraphs();
    const paragraphCount = paragraphs.getCount();
    const targetFont = "Roboto";

    for (let paragraphIndex = 0; paragraphIndex < paragraphCount; paragraphIndex++) {
        const portions = paragraphs.get_Item(paragraphIndex).getPortions();
        const portionCount = portions.getCount();

        for (let portionIndex = 0; portionIndex < portionCount; portionIndex++) {
            const portion = portions.get_Item(portionIndex);
            const portionFormat = portion.getPortionFormat().getEffective();
            const latinFont = portionFormat.getLatinFont();
            const eastAsianFont = portionFormat.getEastAsianFont();
            const complexScriptFont = portionFormat.getComplexScriptFont();

            if ((latinFont !== null && latinFont.getFontName() === targetFont) ||
                (eastAsianFont !== null && eastAsianFont.getFontName() === targetFont) ||
                (complexScriptFont !== null && complexScriptFont.getFontName() === targetFont)) {
                portion.getPortionFormat().setKerningMinimalSize(100);
            }
        }
    }

    presentation.save("output.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

對於低於門檻的相符文字,此設定會阻止字距調整,並有助於使 Aspose.Slides 的渲染與 PowerPoint 在受此 PowerPoint 特定行為影響的字型的視覺輸出保持一致。

管理文字字型屬性

字型屬性可以透過 ParagraphFormat.getDefaultPortionFormat 在段落層級設定,或透過 PortionFormat 在個別文字部分設定。

以下範例將第一段落的預設字型設定為 12 點 Times New Roman,並加入粗體、斜體與點狀底線格式。個別文字部分的明確格式會優先於這些預設值。

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    const paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);
    const defaultPortionFormat = paragraph.getParagraphFormat().getDefaultPortionFormat();

    // 設定段落的字型屬性。
    defaultPortionFormat.setFontHeight(12);
    defaultPortionFormat.setFontBold(java.newByte(aspose.slides.NullableBool.True));
    defaultPortionFormat.setFontItalic(java.newByte(aspose.slides.NullableBool.True));
    defaultPortionFormat.setFontUnderline(java.newByte(aspose.slides.TextUnderlineType.Dotted));
    defaultPortionFormat.setLatinFont(new aspose.slides.FontData("Times New Roman"));

    presentation.save("font_properties_for_paragraph.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

段落字型屬性

以下範例將 13 點 Times New Roman、斜體格式與點狀底線套用到有效格式為粗體的文字部分:

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    const paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);
    const portions = paragraph.getPortions();
    const portionCount = portions.getCount();

    for (let portionIndex = 0; portionIndex < portionCount; portionIndex++) {
        const portion = portions.get_Item(portionIndex);
        if (portion.getPortionFormat().getEffective().getFontBold()) {
            const portionFormat = portion.getPortionFormat();

            // 為文字部分設定字型屬性。
            portionFormat.setFontHeight(13);
            portionFormat.setFontItalic(java.newByte(aspose.slides.NullableBool.True));
            portionFormat.setFontUnderline(java.newByte(aspose.slides.TextUnderlineType.Dotted));
            portionFormat.setLatinFont(new aspose.slides.FontData("Times New Roman"));
        }
    }

    presentation.save("font_properties_for_text_portions.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

文字部分字型屬性

設定文字旋轉

使用 TextFrameFormat.setTextVerticalType 來設定形狀內的預定文字方向。

以下程式碼範例將形狀內的文字方向設定為 TextVerticalType.Vertical270,即將文字 逆時針旋轉 90 度:

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    autoShape.getTextFrame().getTextFrameFormat().setTextVerticalType(java.newByte(aspose.slides.TextVerticalType.Vertical270));

    presentation.save("text_rotation.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

文字旋轉

設定文字框的自訂旋轉

使用 TextFrameFormat.setRotationAngle 為 TextFrame 設定自訂旋轉角度。

以下程式碼範例在形狀內將文字框順時針旋轉 3 度:

const aspose = { slides: require("aspose.slides.via.java") };

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    autoShape.getTextFrame().getTextFrameFormat().setRotationAngle(3);

    presentation.save("custom_text_rotation.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

自訂文字旋轉

設定段落行距

Aspose.Slides 提供 ParagraphFormat.setSpaceAfter、ParagraphFormat.setSpaceBefore 與 ParagraphFormat.setSpaceWithin 以控制段落間距。這些屬性的使用方式如下:

  • 使用正值以將行距指定為行高的百分比。
  • 使用負值以將行距指定為點數。

以下範例將第一段落的內部間距設定為行高的 200%(雙倍行距):

const aspose = { slides: require("aspose.slides.via.java") };

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);

    const paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);
    paragraph.getParagraphFormat().setSpaceWithin(200);

    presentation.save("line_spacing.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

段落內部行距

控制換行規則

段落換行規則在狹窄的文字區塊以及混合拉丁文與東亞文字的簡報中相當有用。以下方法屬於 ParagraphFormat,因此會套用於整段落:

  • setLatinLineBreak 控制拉丁文字的換行規則。在混合文字中,變更它也會影響相鄰東亞文字與標點的換行位置。
  • setEastAsianLineBreak 控制東亞文字的換行規則,包含對行首與行尾字元的限制。

這些規則不會取代 TextFrameFormat.setWrapText,後者會在文字框內啟用自動換行。它們會在換行發生時影響版面配置,但不會插入換行字元。明確的換行會在段落內強制產生新行,且不受可用寬度限制。

以下獨立範例建立一個包含中文與拉丁文字的狹窄文字區塊。它明確設定兩個換行選項並儲存為 “line_breaking.pptx”。若要測試任一規則,請變更相應的值,同時保持其他設定不變。範例使用 24 點 Arial 與 SimSun,框寬 160 點且水平文字框邊距為零。使用 TextFrameFormat.setAutofitType 並傳入 TextAutofitType.None,以確保文字大小與框尺寸固定。

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 50, 50, 160, 300);
    shape.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.NoFill));

    const textFrame = shape.getTextFrame();
    textFrame.getTextFrameFormat().setWrapText(java.newByte(aspose.slides.NullableBool.True));
    textFrame.getTextFrameFormat().setAutofitType(java.newByte(aspose.slides.TextAutofitType.None));
    textFrame.getTextFrameFormat().setMarginLeft(0);
    textFrame.getTextFrameFormat().setMarginRight(0);

    const paragraph = textFrame.getParagraphs().get_Item(0);
    paragraph.setText("中文排版测试,PowerPoint 中文演示。");

    const format = paragraph.getParagraphFormat();
    format.setAlignment(aspose.slides.TextAlignment.Left);
    format.getDefaultPortionFormat().setFontHeight(24);
    const latinFont = new aspose.slides.FontData("Arial");
    format.getDefaultPortionFormat().setLatinFont(latinFont);
    const eastAsianFont = new aspose.slides.FontData("SimSun");
    format.getDefaultPortionFormat().setEastAsianFont(eastAsianFont);
    format.getDefaultPortionFormat().getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
    const textColor = java.getStaticFieldValue("java.awt.Color", "BLACK");
    format.getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(textColor);
    format.setLatinLineBreak(java.newByte(aspose.slides.NullableBool.False));
    format.setEastAsianLineBreak(java.newByte(aspose.slides.NullableBool.True));

    presentation.save("line_breaking.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

控制懸掛標點

ParagraphFormat.setHangingPunctuation 允許符合條件的標點延伸至文字行的右側邊緣,而不是佔據下一行。它套用於整段落,且不同於懸掛縮排。

以下獨立範例在寬 100 點的文字框中啟用懸掛標點,並儲存為 “hanging_punctuation.pptx”。使用 24 點 Arial 且水平文字框邊距為零,最後的句點會保留在 “sentence” 之後,並延伸至文字右側邊緣。將屬性設為 NullableBool.False 可作比較:在此設定下,句點會佔據單獨一行。已啟用自動換行且停用自動調整,以保持可用寬度固定。

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 50, 50, 100, 200);
    shape.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.NoFill));

    const textFrame = shape.getTextFrame();
    textFrame.getTextFrameFormat().setWrapText(java.newByte(aspose.slides.NullableBool.True));
    textFrame.getTextFrameFormat().setAutofitType(java.newByte(aspose.slides.TextAutofitType.None));
    textFrame.getTextFrameFormat().setMarginLeft(0);
    textFrame.getTextFrameFormat().setMarginRight(0);

    const paragraph = textFrame.getParagraphs().get_Item(0);
    paragraph.setText("Simple text, next sentence.");

    const format = paragraph.getParagraphFormat();
    format.setAlignment(aspose.slides.TextAlignment.Left);
    format.getDefaultPortionFormat().setFontHeight(24);
    const latinFont = new aspose.slides.FontData("Arial");
    format.getDefaultPortionFormat().setLatinFont(latinFont);
    format.getDefaultPortionFormat().getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
    const textColor = java.getStaticFieldValue("java.awt.Color", "BLACK");
    format.getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(textColor);
    format.setHangingPunctuation(java.newByte(aspose.slides.NullableBool.True));

    presentation.save("hanging_punctuation.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

並非所有標點皆可懸掛。上述提及的 字型與版面條件 亦適用於此比較:變更字型、可用寬度、邊距或自動調整設定都可能消除可見差異。

設定文字框的自動調整類型

TextFrameFormat.setAutofitType 決定文字超出容器邊界時的行為。可用來控制文字是縮小、溢出,或自動調整形狀大小。以下範例將形狀設定為自動調整尺寸以適應文字,並將結果儲存為 “autofit_type.pptx”。

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    autoShape.getTextFrame().getTextFrameFormat().setAutofitType(java.newByte(aspose.slides.TextAutofitType.Shape));

    presentation.save("autofit_type.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

若要在自動換行後統計行數並了解文字或形狀寬度如何影響結果,請參閱 計算已渲染行數。僅有行數並不足以判斷文字是否溢出容器。

設定文字框的錨點

TextFrameFormat.setAnchoringType 定義文字在形狀內的垂直定位方式,例如置於頂部、中央或底部。以下範例將文字錨定於第一個圖形的底部,並將結果儲存為 “text_anchor.pptx”。

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);
    autoShape.getTextFrame().getTextFrameFormat().setAnchoringType(java.newByte(aspose.slides.TextAnchorType.Bottom));

    presentation.save("text_anchor.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

設定文字定位點

使用 ParagraphFormat.setDefaultTabSize 與 ParagraphFormat.getTabs 來設定段落的定位點。以下範例將預設定位間距設定為 100 點,並在 30 點處新增一個左對齊的定位點。這些設定會影響包含定位字元的文字。

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);

    const paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);
    paragraph.getParagraphFormat().setDefaultTabSize(100);
    paragraph.getParagraphFormat().getTabs().add(30, java.newByte(aspose.slides.TabAlignment.Left));

    presentation.save("paragraph_tabs.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

結果:

段落定位點

設定校對語言

Aspose.Slides 提供 BasePortionFormat.setLanguageId,可為文字部分設定校對語言。校對語言決定 PowerPoint 用於拼寫與文法檢查的語言。

以下範例需要一個名為 “presentation.pptx”、其第一張投影片的第一個圖形為文字方塊且至少有一個段落的檔案。它會將第一段落的內容取代為 “1。",將字型設定為 SimSun,並指派簡體中文校對語言 (zh-CN)。最後將結果儲存為 “proofing_language.pptx”:

const aspose = { slides: require("aspose.slides.via.java") };

const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);

    const autoShape = slide.getShapes().get_Item(0);

    const paragraph = autoShape.getTextFrame().getParagraphs().get_Item(0);
    paragraph.getPortions().clear();

    const font = new aspose.slides.FontData("SimSun");
    const textPortion = new aspose.slides.Portion();
    textPortion.getPortionFormat().setComplexScriptFont(font);
    textPortion.getPortionFormat().setEastAsianFont(font);
    textPortion.getPortionFormat().setLatinFont(font);

    // 設定校對語言的 Id。
    textPortion.getPortionFormat().setLanguageId("zh-CN");

    textPortion.setText("1。");
    paragraph.getPortions().add(textPortion);

    presentation.save("proofing_language.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

設定預設語言

使用 LoadOptions.setDefaultTextLanguage 可定義在載入或建立簡報時建立文字的預設語言。以下範例建立一個預設文字語言為美式英語的簡報,新增文字方塊,並輸出其第一個文字部分的 en-US。

const aspose = { slides: require("aspose.slides.via.java") };

const loadOptions = new aspose.slides.LoadOptions();
loadOptions.setDefaultTextLanguage("en-US");

const presentation = new aspose.slides.Presentation(loadOptions);
try {
    const slide = presentation.getSlides().get_Item(0);

    // 新增一個帶文字的矩形圖形。
    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 20, 20, 150, 50);
    shape.getTextFrame().setText("Sample text");

    // 檢查第一個文字部分的語言。
    const portion = shape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0);
    console.log(portion.getPortionFormat().getLanguageId());
} finally {
    presentation.dispose();
}

設定預設文字樣式

若要在簡報層級套用預設文字格式,請使用 Presentation.getDefaultTextStyle。

以下範例將 14 點粗體字型設定為新簡報中頂層段落的預設,並將檔案儲存為 “default_text_style.pptx”。文字會繼承這些預設值,除非有更具體的格式覆寫。

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    // 取得最高層段落格式。
    const paragraphFormat = presentation.getDefaultTextStyle().getLevel(0);

    if (paragraphFormat !== null) {
        paragraphFormat.getDefaultPortionFormat().setFontHeight(14);
        paragraphFormat.getDefaultPortionFormat().setFontBold(java.newByte(aspose.slides.NullableBool.True));
    }

    presentation.save("default_text_style.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

提取全大寫效果的文字

在 PowerPoint 中,套用 All Caps 字體效果會使文字在投影片上以大寫顯示,即使原始輸入為小寫。使用 Aspose.Slides 讀取此類文字部分時,函式庫會返回原始輸入的文字。若要與顯示的文字相符,請檢查 TextCapType 並在值為 All 時將返回的字串轉換為大寫。

此範例需要一個名為 “sample2.pptx”、其第一張投影片的第一個圖形為文字方塊的檔案。其第一段落的第一部分包含應用 All Caps 效果的 “Hello, Aspose!",如下圖所示。

全大寫效果

以下程式碼範例示範如何提取套用 All Caps 效果的文字:

const aspose = { slides: require("aspose.slides.via.java") };

const presentation = new aspose.slides.Presentation("sample2.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);
    
    const autoShape = slide.getShapes().get_Item(0);
    const textPortion = autoShape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0);

    console.log("Original text: " + textPortion.getText());

    const textFormat = textPortion.getPortionFormat().getEffective();
    if (textFormat.getTextCapType() === aspose.slides.TextCapType.All) {
        const text = textPortion.getText().toUpperCase();
        console.log("All-Caps effect: " + text);
    }
} finally {
    presentation.dispose();
}

輸出:

Original text: Hello, Aspose!
All-Caps effect: HELLO, ASPOSE!

常見問題

如何在投影片的表格中修改文字?

要在投影片的表格中修改文字,請使用 Table。遍歷儲存格,並透過 Cell.getTextFrame 更新每個儲存格,並使用 Paragraph.getParagraphFormat 來設定段落格式。

如何在 PowerPoint 投影片的文字上套用漸層顏色?

若要為文字套用漸層顏色,請使用 BasePortionFormat.getFillFormat。將 FillFormat.setFillType 設為 FillType.Gradient,並配置漸層停止點、方向與透明度。