PowerPoint Sunumlarında Python ile Metin Alanlarını Yönetme

Genel Bakış

Bir metin paragrafı bölümlerden oluşur. Normal bir Portion doğrudan metin içerir; bir alan bölümü ise otomatik olarak güncellenen bir değeri tanımlayan bir Field içerir; örneğin slayt numarası veya tarih. İki bölüm aynı karakterleri gösterebilir ancak sadece biri alan içerir.

Onları ayırt etmek için Portion.field kullanın: normal metin için None döner. Portion.add_field mevcut bir bölümü alana dönüştürür. Etiketi ve dinamik değerini ayrı bölümlerde tutun, böylece değeri dönüştürmek etiketin de değiştirilmesine yol açmaz.

Bu kılavuz, metin içindeki alanları, bunların biçimlendirilmesini ve PPTX ile PPT olarak kaydedilmesini kapsar. Metin çerçeveleri ve paragraflar için Manage Text bölümüne bakın.

Slayt Numarası Alanı Oluşturma

Sonraki tam örnek, Slide etiketi içeren ve ardından otomatik olarak güncellenen bir numara ekleyen bir metin kutusu oluşturur. Sayının boyutunu, kalınlığını ve rengini alan eklemeden önce ayarlar, ardından kaydedilen sunumu yeniden açar ve alan tipini, metni ve biçimlendirmeyi kontrol eder. Girdi dosyasına ihtiyaç yoktur.

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}")

Yeni sunum slayt numarası 1 ile başlar, bu yüzden metin Slide 1 olur ve her iki kontrol de True yazdırır. Yeniden açıldıktan sonra sayı bir alan olarak kalır; doğrudan 1 değildir. Doğrulamadaki indeksler bu örnek tarafından oluşturulan şekil ve bölümleri referans alır.

Bir Alan Türü Seçme

FieldType aşağıdaki önceden tanımlı değerleri sağlar. Uygun değeri add_field metoduna aktarın.

Değer Amaç
slide_number Mevcut slayt numarası.
date_time Sunum uygulamasının varsayılan biçiminde tarih/saat.
date_time1date_time9 Önceden tanımlı tarih veya birleştirilmiş tarih/saat biçimleri.
date_time10date_time13 Önceden tanımlı zaman biçimleri, saniyeler ve 12 saatlik saat seçenekleriyle.
header Üstbilgi alanı; aşağıdaki yer tutucu ve biçim sınırlamalarına bakın.
footer Altbilgi alanı.

Örneğin, date_time3 gün, tam ay adı ve yılı İngilizce olarak temsil eder. Bunlar önceden tanımlı alan biçimleridir, rastgele Python tarih biçim dizesi değildir. Bölümün language_id ve sunumu işleyen uygulama gösterilen sonucu etkileyebilir.

İç Dizeden Alan Oluşturma

add_field metodunun dize aşırı yüklemesi, iç alan tanımlayıcısını kabul eder. Önceden tanımlı bir değeri olmayan başka bir uygulama tarafından sağlanan tanımlayıcıyı korurken bunu kullanın. Tanımlayıcıdan bir FieldType da oluşturabilirsiniz. FieldType.internal_string bu tanımlayıcıyı inceleme amacıyla ortaya çıkarır.

Bu örnek, custom-report-id adlı uygulamaya özgü bir alanı Report-042 yedek metniyle saklar. Tanımlayıcı bir hesaplama kaydetmez: Aspose.Slides bilinmeyen bir tür için rapor kimlikleri üretmez. Bu tanımlayıcıyı anlayan uygulama, anlamını sağlamalı ve değerini güncellemelidir.

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}")

Bu PPTX dönüşümünden sonra tür custom-report-id ve metin Report-042 olur. %Y-%m-%d gibi bir dize geçirmek bir alan tipi adlandırır; özel bir tarih biçimi yapılandırmaz. Rasgele bir biçimde sabit bir tarih için normal metin kullanın.

Tarih/Saat Alanlarını İnceleme, Değiştirme ve Kaldırma

Mevcut bir alanı Field.type üzerinden okuyup değiştirebilirsiniz. Tipine erişmeden önce alanın var olduğunu kontrol edin. Otomatik güncellemeleri durdurmak için Portion.remove_field metodunu çağırın. Bu, alan ilişkilendirmesini kaldırırken bölümü ve mevcut metnini korur. Belirli bir sabit değere ihtiyacınız varsa, alanı kaldırdıktan sonra o metni atayın.

API ayarı için Presentation.current_date_time bölümüne bakın. Aşağıdaki örnek, bir alanı normal metne dönüştürürken açık bir onay tarihini kullanır. İngilizce ay adı ikilisi, sabit tarihi sistem yerel ayarından bağımsız tutar.

sample.pptx dosyasını indirin ve çalışma dizinine koyun. Dosya, UpdatedAt ve ApprovedDate adlı iki metin şekli içerir; her biri bir tarih/saat alanına ve normal metin etiketlerine sahiptir. Aşağıdaki örnek, normal slaytlardaki üst düzey metin şekillerini dolaşır. Tarih/saat alanlarını uzun tarih biçimine dönüştürür ve diğer biçimlendirmeyi korurken italik yapar. Yalnızca ApprovedDate içindeki alanlar sabit metin haline gelir.

Örnek, yerleşik iç tanımlayıcılar datetime ve datetime1 ile datetime13 arasında tanır. Gruplar, tablolar, notlar, düzenler ve ana slaytlar kendi metin kapsayıcılarının dolaşılmasını gerektirir ve bu örnek kapsamının dışındadır.

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}")

Yeniden açıldıktan sonra UpdatedAt türü datetime3 olur ve dinamik kalır. ApprovedDate alan içermez ve 05 April 2030 metnini taşır. Her iki tarih bölümü de italik olup, orijinal yazı tipi boyutu, kalın ayarı ve rengi korunur. Normal metin etiketleri değişmez. Doğrulama, sağlanan örnek içindeki iki bilinen şeklin ilk bölümünü okur.

Metin Biçimlendirmesini Korumak

Bir alan eklerken, tipini değiştirirken veya kaldırırken mevcut bölümle çalışın. Bu işlemler bölümün biçimlendirmesini korur. Gereken yalnızca özellikleri değiştirmek için Portion.portion_format kullanın; örneklerde renk veya italik için olduğu gibi.

Bir alanı güncellemek için tüm bir metin çerçevesini yeniden oluşturmaktan kaçının: bu, orijinal bölüm sınırlarını ve bireysel biçimlendirmelerini kaybetmeye yol açabilir. Ayrıca, açıkça ayarlanmış biçimlendirmeyi paragraftan, düzenden veya temadan devralınan biçimlendirmeden ayırın. Daha geniş biçimlendirme seçenekleri için Text Formatting bölümüne bakın.

Alanlar ve Üstbilgi/Altbilgi Yer Tutucuları

Bir alan, bir metin bölümünün parçasıdır. Yer tutucu ise altbilgi veya slayt numarası gibi bir sunum rolüne sahip bir şekildir. Normal bir metin kutusuna alan eklemek o şekli yer tutucuya dönüştürmez.

Üstbilgi/altbilgi yöneticileri, slaytlar, düzenler ve ana slaytlarda yer tutucu metin ve görünürlüğü kontrol eder, bağlı slaytlara yayılımı da içerir. Özel bir metin kutusundaki sayı alanı, slayt numarası yer tutucusunu kullanmasanız bile faydalı olabilir. Aksine, yer tutucu görünürlüğünü değiştirmek, alakasız bir metin kutusundaki alanı kaldırmaz.

Önceden tanımlı üstbilgi ve altbilgi tipleri, ilgili yer tutucuları oluşturmaz veya içeriklerini sağlamaz. Özellikle, normal bir PowerPoint slaytının üstbilgi yer tutucusu yoktur; üstbilgiler not sayfalarına ve el ilanlarına aittir. Rastgele bir şekildeki üstbilgi veya altbilgi alanının, yer tutucu yöneticisi tarafından yapılandırılan metni otomatik olarak alacağını varsaymayın. Bu iş akışı için Presentation Headers and Footers bölümüne bakın.

PPTX ve PPT Kısıtlamaları

Kaydedip yeniden açtıktan sonra hem alan tipini hem de ortaya çıkan metni kontrol edin. Bir tanımlayıcının korunması, bir uygulamanın değerini hesaplayabileceği veya gösterebileceği anlamına gelmez.

Biçim Alan davranışı ve kısıtlamalar
PPTX İç alan tanımlayıcılarını alan metniyle birlikte depolar. Dönüşümlü kontrollerde, önceden tanımlı tipler ve yukarıda kullanılan özel tanımlayıcı kaydedilip yeniden açıldığında korunur. Bilinmeyen özel tip yedek metnini korur; otomatik hesaplama mantığı kazanmaz. Başka bir uygulama desteklenmeyen tanımlayıcıları farklı şekilde ele alabilir.
PPT Eski alan temsillerini kullanır ve daha sınırlı uyumluluğa sahiptir. Dönüşümlü kontrollerde, slayt numarası ve önceden tanımlı tarih/saat alanları kaydedilip yeniden açıldığında korunur. Normal bir slayt metin kutusundaki özel bir alan, tanımlayıcısıyla birlikte * metniyle yeniden açılır; aynı bağlamda bir üstbilgi alanı da * üretir. Özel alanların veya desteklenmeyen alan bağlamlarının görünür metinlerini koruyacağına güvenmeyin.

Taşınabilir, sabit çıktı için, desteklenmeyen alanları normal metne dönüştürün ve kaydetmeden önce istediğiniz değeri açıkça atayın. Bu, seçilen metni korur ancak otomatik güncellemeleri kasıtlı olarak durdurur. Kendi alan yeniden hesaplaması iş akışınızın bir parçasıysa hedef uygulamayı da test edin.

SSS

Gösterilen bir sayı veya tarihin alan olup olmadığını nasıl anlayabilirim?

Portion.field özelliğine bakın. None dışındaki bir değer bir alanı tanımlar; yalnızca gösterilen metin bunu belirtemez.

Bir alanı kaldırmak metnini veya biçimlendirmesini de kaldırır mı?

Hayır. remove_field mevcut bölümü normal metne dönüştürür. Belirli bir sabit tarih veya yedek değer gerekiyorsa, alanı kaldırdıktan sonra açık bir değer atayın.

Bir iç dize yeni bir tarih biçimi veya formül tanımlayabilir mi?

Hayır. Bir alan tipini tanımlar. Bilinmeyen bir tanımlayıcı bir değerlendirici veya Python tarih biçim dizesi sağlamaz. Desteklenen önceden tanımlı bir tip kullanın veya değeri kendiniz normal metin olarak biçimlendirin.

Bir sunumu kaydettikten sonra neden tekrar kontrol etmeliyim?

Alan tanımlayıcıları, hesaplanan metin ve biçimlendirme doğrulanması gereken ayrı öğelerdir. Biçim dönüştürmesi, alan tanımlayıcısı hâlâ mevcut olsa bile görünür sonucu değiştirebilir.