Quản lý các trường văn bản trong bài thuyết trình PowerPoint bằng Python

Tổng quan

Một đoạn văn bản bao gồm các phần. Một Portion thông thường chứa văn bản nguyên mẫu; một phần Field cũng có một Field mà kiểu xác định một giá trị tự động cập nhật, chẳng hạn như số slide hoặc ngày. Hai phần có thể hiển thị cùng các ký tự trong khi chỉ một phần chứa trường.

Sử dụng Portion.field để phân biệt chúng: giá trị sẽ là None đối với văn bản thông thường. Portion.add_field chuyển một phần hiện có thành một trường. Giữ nhãn và giá trị động của nó trong các phần riêng biệt để việc chuyển đổi giá trị không đồng thời thay thế nhãn.

Hướng dẫn này bao gồm các trường trong văn bản, cách định dạng chúng và lưu chúng dưới dạng PPTX và PPT. Đối với khung văn bản và đoạn, xem Manage Text.

Tạo Trường Số Slide

Ví dụ hoàn chỉnh sau đây tạo một hộp văn bản chứa nhãn nguyên mẫu Slide tiếp theo là một số tự động cập nhật. Nó thiết lập kích thước, độ đậm và màu sắc của số trước khi thêm trường, sau đó mở lại bản trình bày đã lưu và kiểm tra kiểu trường, văn bản và định dạng. Không cần tệp đầu vào.

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 40, 40, 240, 50)
    shape.add_text_frame("Slide ")
    paragraph = shape.text_frame.paragraphs[0]

    number_portion = slides.Portion()
    number_portion.portion_format.font_height = 24
    number_portion.portion_format.font_bold = slides.NullableBool.TRUE
    number_portion.portion_format.fill_format.fill_type = slides.FillType.SOLID
    number_portion.portion_format.fill_format.solid_fill_color.color = draw.Color.dark_blue
    paragraph.portions.add(number_portion)
    number_portion.add_field(slides.FieldType.slide_number)

    presentation.save("slide_number.pptx", slides.export.SaveFormat.PPTX)

with slides.Presentation("slide_number.pptx") as reopened:
    saved_shape = reopened.slides[0].shapes[0]
    saved_number = saved_shape.text_frame.paragraphs[0].portions[1]
    has_number_field = saved_number.field is not None and saved_number.field.type.internal_string == slides.FieldType.slide_number.internal_string
    portion_format = saved_number.portion_format
    formatting_preserved = portion_format.font_height == 24 and portion_format.font_bold == slides.NullableBool.TRUE
    formatting_preserved &= portion_format.fill_format.solid_fill_color.color.to_argb() == draw.Color.dark_blue.to_argb()

    print(f"Text: {saved_shape.text_frame.text}")
    print(f"Slide number field: {has_number_field}")
    print(f"Formatting preserved: {formatting_preserved}")

Bản trình chiếu mới bắt đầu với số slide 1, vì vậy văn bản là Slide 1, và cả hai kiểm tra đều in ra True. Số vẫn là một trường sau khi mở lại; nó không phải là nguyên mẫu 1. Các chỉ mục trong quá trình xác minh đề cập đến hình dạng và các phần được tạo bởi ví dụ này.

Chọn Kiểu Trường

FieldType cung cấp các giá trị được định nghĩa trước sau đây. Gửi giá trị phù hợp tới add_field.

Giá trị Mục đích
slide_number Số slide hiện tại.
date_time Ngày/giờ ở định dạng mặc định của ứng dụng render.
date_time1date_time9 Các định dạng ngày đã định nghĩa trước hoặc kết hợp ngày/giờ.
date_time10date_time13 Các định dạng thời gian đã định nghĩa trước, với tùy chọn giây và đồng hồ 12 giờ.
header Trường tiêu đề; xem các hạn chế về placeholder và định dạng bên dưới.
footer Trường chân trang.

Ví dụ, date_time3 đại diện cho ngày, tên tháng đầy đủ và năm bằng tiếng Anh. Đây là các định dạng trường được định nghĩa trước, không phải chuỗi định dạng ngày Python tùy ý. language_id của phần và ứng dụng xử lý bản trình bày có thể ảnh hưởng tới kết quả hiển thị.

Tạo Trường từ Chuỗi Nội Bộ

Bản overload dạng chuỗi của add_field chấp nhận một định danh trường nội bộ. Sử dụng nó khi muốn giữ lại một định danh do ứng dụng khác cung cấp mà không có giá trị được định nghĩa trước. Bạn cũng có thể tạo một FieldType từ định danh đó. FieldType.internal_string cung cấp định danh đó để kiểm tra.

Ví dụ này lưu một trường custom-report-id riêng của ứng dụng với văn bản dự phòng Report-042. Định danh không đăng ký tính toán: Aspose.Slides không tạo ID báo cáo cho kiểu không biết. Ứng dụng hiểu định danh này phải cung cấp ý nghĩa và cập nhật giá trị của nó.

import aspose.slides as slides

with slides.Presentation() as presentation:
    shape = presentation.slides[0].shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 40, 40, 300, 50)
    shape.add_text_frame("Report-042")
    portion = shape.text_frame.paragraphs[0].portions[0]
    portion.add_field("custom-report-id")

    presentation.save("custom_field.pptx", slides.export.SaveFormat.PPTX)

with slides.Presentation("custom_field.pptx") as reopened:
    saved_shape = reopened.slides[0].shapes[0]
    saved_portion = saved_shape.text_frame.paragraphs[0].portions[0]
    type_name = saved_portion.field.type.internal_string if saved_portion.field is not None else "ordinary text"
    print(f"Type: {type_name}")
    print(f"Text: {saved_portion.text}")

Sau lần duyệt vòng PPTX này, kiểu là custom-report-id và văn bản là Report-042. Truyền một chuỗi như %Y-%m-%d sẽ đặt tên cho một kiểu trường; nó sẽ không cấu hình định dạng ngày tùy chỉnh. Đối với một ngày cố định ở định dạng tùy ý, hãy sử dụng văn bản thông thường.

Kiểm Tra, Sửa Đổi và Xóa Trường Ngày/Giờ

Đọc và thay đổi một trường hiện có qua Field.type. Kiểm tra trường tồn tại trước khi truy cập kiểu của nó. Để dừng cập nhật tự động, gọi Portion.remove_field. Thao tác này giữ phần và văn bản hiện tại trong khi loại bỏ liên kết với trường. Nếu bạn cần một giá trị cố định cụ thể, gán văn bản đó sau khi đã xóa trường.

Đối với cài đặt API liên quan đến xử lý trường ngày/giờ, xem Presentation.current_date_time. Ví dụ dưới đây sử dụng ngày phê duyệt rõ ràng khi chuyển một trường thành văn bản thông thường. Một bộ tên tháng bằng tiếng Anh giữ ngày cố định độc lập với locale của hệ thống.

Tải về sample.pptx và đặt nó trong thư mục làm việc. Tệp chứa hai hình dạng văn bản có tên, UpdatedAtApprovedDate, mỗi cái có một trường ngày/giờ, cộng với các nhãn văn bản thông thường. Ví dụ sau duyệt các hình dạng văn bản cấp cao trên các slide thường. Nó chuyển các trường ngày/giờ sang định dạng ngày dài và làm chúng in nghiêng, trong khi vẫn giữ các định dạng khác. Chỉ các trường trong ApprovedDate sẽ trở thành văn bản cố định.

Bản mẫu nhận ra các định danh nội bộ được tích hợp datetimedatetime1 tới datetime13. Nhóm, bảng, ghi chú, bố cục và mẫu cần duyệt các container văn bản riêng của chúng và nằm ngoài phạm vi của ví dụ này.

from datetime import date

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    approval_date = date(2030, 4, 5)
    english_months = ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
    approval_text = f"{approval_date.day:02d} {english_months[approval_date.month - 1]} {approval_date.year}"
    date_time_types = {"datetime"} | {f"datetime{index}" for index in range(1, 14)}

    for slide in presentation.slides:
        for shape in slide.shapes:
            if not isinstance(shape, slides.AutoShape) or shape.text_frame is None:
                continue

            for paragraph in shape.text_frame.paragraphs:
                for portion in paragraph.portions:
                    field = portion.field
                    if field is None:
                        continue

                    if field.type.internal_string not in date_time_types:
                        continue

                    field.type = slides.FieldType.date_time3
                    portion.portion_format.language_id = "en-US"
                    portion.portion_format.font_italic = slides.NullableBool.TRUE

                    if shape.name == "ApprovedDate":
                        portion.remove_field()
                        portion.text = approval_text

    presentation.save("updated_dates.pptx", slides.export.SaveFormat.PPTX)

with slides.Presentation("updated_dates.pptx") as reopened:
    for shape in reopened.slides[0].shapes:
        if not isinstance(shape, slides.AutoShape) or shape.text_frame is None:
            continue
        if shape.name not in {"UpdatedAt", "ApprovedDate"}:
            continue

        portion = shape.text_frame.paragraphs[0].portions[0]
        type_name = portion.field.type.internal_string if portion.field is not None else "ordinary text"
        print(f"{shape.name}: {type_name}; {portion.text}")
        print(f"Italic: {portion.portion_format.font_italic == slides.NullableBool.TRUE}")

Sau khi mở lại, UpdatedAt có kiểu datetime3 và vẫn động. ApprovedDate không có trường và chứa 05 April 2030. Cả hai phần ngày đều in nghiêng, và kích thước phông chữ, thiết lập in đậm và màu sắc gốc vẫn giữ nguyên. Các nhãn văn bản thông thường không thay đổi. Quá trình xác minh đọc phần đầu tiên của hai hình dạng đã biết trong mẫu được cung cấp.

Bảo Vệ Định Dạng Văn Bản

Làm việc với phần hiện có khi thêm trường, thay đổi kiểu của nó, hoặc xóa nó. Các thao tác này giữ nguyên định dạng của phần đó. Sử dụng Portion.portion_format để chỉ thay đổi các thuộc tính cần thiết, như các ví dụ làm cho màu sắc hoặc in nghiêng.

Tránh xây dựng lại toàn bộ khung văn bản chỉ để cập nhật một trường: việc này có thể làm mất ranh giới phần gốc và định dạng riêng của chúng. Ngoài ra, hãy phân biệt định dạng được đặt rõ ràng với định dạng kế thừa từ đoạn, bố cục hoặc chủ đề. Xem Text Formatting để biết các tùy chọn định dạng rộng hơn.

Trường và Placeholder Tiêu Đề/Chân Trang

Một trường là một phần của phần văn bản. Placeholder là một hình dạng có vai trò trong bài thuyết trình, như chân trang hoặc số slide. Thêm một trường vào hộp văn bản thông thường không biến hình dạng đó thành placeholder.

Trình quản lý tiêu đề/chân trang kiểm soát văn bản placeholder và khả năng hiển thị trên các slide, bố cục và mẫu, bao gồm việc lan truyền tới các slide phụ thuộc. Vì vậy, một trường số trong hộp văn bản tùy chỉnh vẫn hữu ích ngay cả khi bạn không sử dụng placeholder số slide. Ngược lại, thay đổi khả năng hiển thị của placeholder không xóa trường khỏi một hộp văn bản không liên quan.

Các kiểu tiêu đề và chân trang được định nghĩa trước không tạo ra placeholder tương ứng hoặc cung cấp nội dung của chúng. Đặc biệt, một slide PowerPoint thông thường không có placeholder tiêu đề; tiêu đề thuộc về trang ghi chú và tài liệu phát tay. Đừng giả định rằng một trường tiêu đề hoặc chân trang trong một hình dạng tùy ý sẽ tự động nhận được văn bản được cấu hình qua trình quản lý placeholder. Đối với quy trình đó, xem Presentation Headers and Footers.

Giới Hạn của PPTX và PPT

Kiểm tra cả kiểu trường và văn bản kết quả của nó sau khi lưu và mở lại. Giữ lại một định danh không chứng minh rằng một ứng dụng có thể tính toán hoặc hiển thị giá trị của nó.

Định dạng Hành vi và giới hạn của trường
PPTX Lưu trữ các định danh trường nội bộ cùng với văn bản trường. Trong các kiểm tra vòng quay, các kiểu định nghĩa trước và định danh tùy chỉnh được sử dụng ở trên vẫn tồn tại sau khi lưu và mở lại. Kiểu tùy chỉnh không biết giữ lại văn bản dự phòng; nó không có logic tính toán tự động. Ứng dụng khác có thể xử lý các định danh không hỗ trợ khác nhau.
PPT Sử dụng các biểu diễn trường legacy và có tính tương thích hạn chế hơn. Trong các kiểm tra vòng quay, trường số slide và trường ngày/giờ định nghĩa trước vẫn tồn tại sau khi lưu và mở lại. Một trường tùy chỉnh trong hộp văn bản slide thông thường mở lại với định danh của nó nhưng văn bản là *; một trường tiêu đề trong cùng ngữ cảnh cũng cho ra *. Đừng dựa vào các trường tùy chỉnh hoặc ngữ cảnh trường không hỗ trợ để giữ lại văn bản hiển thị.

Để có đầu ra cố định, di động, chuyển các trường không hỗ trợ thành văn bản thông thường và gán rõ ràng giá trị mong muốn trước khi lưu. Điều này giữ lại văn bản đã chọn nhưng cố ý ngừng cập nhật tự động. Hãy kiểm tra ứng dụng đích khi việc tính lại trường của nó là một phần trong quy trình của bạn.

FAQ

Làm sao để biết một số hoặc ngày hiển thị là trường hay không?

Kiểm tra Portion.field. Giá trị khác None xác định một trường; chỉ dựa vào văn bản hiển thị không thể cho bạn biết.

Việc xóa một trường có xóa văn bản hoặc định dạng của nó không?

Không. remove_field chuyển phần hiện có thành văn bản thông thường. Gán một giá trị cụ thể sau đó nếu bạn cần một ngày cố định hoặc giá trị dự phòng nhất định.

Chuỗi nội bộ có thể định nghĩa định dạng ngày mới hoặc công thức không?

Không. Nó chỉ xác định một kiểu trường. Định danh không biết không cung cấp bộ đánh giá hay mẫu định dạng ngày Python. Hãy sử dụng một kiểu được hỗ trợ đã định nghĩa trước hoặc tự định dạng giá trị thành văn bản thông thường.

Tại sao phải kiểm tra lại bản trình bày sau khi lưu?

Các định danh trường, văn bản đã tính toán và định dạng là các yếu tố riêng biệt cần xác minh. Việc chuyển đổi định dạng có thể thay đổi kết quả hiển thị ngay cả khi định danh trường vẫn còn tồn tại.