Mengambil dan Memperbarui Informasi Presentasi dalam C++
Ikhtisar
Aspose.Slides dapat mengidentifikasi format presentasi dan membaca metadata dokumennya tanpa membuat model objek presentasi yang lengkap. Hal ini berguna ketika Anda perlu mengklasifikasikan file, membuat inventaris, atau memeriksa properti sebelum memutuskan apakah akan memuat dan memproses konten presentasi.
Artikel ini mendemonstrasikan inspeksi ringan melalui PresentationFactory dan IPresentationInfo, serta pembaruan terarah melalui IDocumentProperties.
Memeriksa Format Presentasi
Jika Anda sudah memiliki presentasi yang dimuat, lihat Determine the Original Presentation Format untuk deteksi setelah pemuatan dan keterbatasan aliran legacy PPT, PPS, dan POT.
Gunakan IPresentationFactory::GetPresentationInfo untuk memeriksa file tanpa membuat instance Presentation. Metode IPresentationInfo::get_LoadFormat melaporkan format yang terdeteksi, seperti PPTX, PPT, atau ODP.
#include <DOM/IPresentationInfo.h>
#include <DOM/PresentationFactory.h>
#include <LoadFormat.h>
#include <system/array.h>
#include <system/console.h>
#include <system/object_ext.h>
#include <system/string.h>
using namespace Aspose::Slides;
using namespace System;
auto fileNames = MakeArray<String>({u"pres.pptx", u"pres.ppt", u"pres.odp"});
for (const auto& fileName : fileNames)
{
auto presentationInfo = PresentationFactory::get_Instance()->GetPresentationInfo(fileName);
Console::WriteLine(String::Format(u"{0}: {1}", fileName, ObjectExt::ToString(presentationInfo->get_LoadFormat())));
}
Membangun Inventaris Presentasi Ringan
Saat Anda memproses banyak file presentasi, Anda mungkin memerlukan inventaris yang kompak untuk validasi, pengindeksan, atau sistem manajemen dokumen. Dalam skenario ini, gunakan IPresentationFactory::GetPresentationInfo untuk memperoleh objek IPresentationInfo, lalu panggil IPresentationInfo::ReadDocumentProperties untuk membaca metadata dokumen. Pendekatan ini tidak membuat instance Presentation atau mengharuskan Anda menelusuri model objek presentasi secara lengkap.
Properti tambahan yang diekspose oleh IDocumentProperties memberikan nilai inventaris berikut:
| Metode | Nilai inventaris |
|---|---|
| get_Slides | Jumlah total slide. |
| get_HiddenSlides | Jumlah slide tersembunyi. |
| get_Notes | Jumlah slide yang berisi catatan. |
| get_Paragraphs | Jumlah total paragraf, bila tersedia. |
| get_Words | Jumlah total kata. |
| get_MultimediaClips | Jumlah total klip audio dan video. |
Contoh berikut membaca nilai-nilai ini tanpa membuat objek Presentation dan mencetak inventaris yang kompak. Contoh ini juga menggabungkan IDocumentProperties::get_HeadingPairs dengan IDocumentProperties::get_TitlesOfParts untuk menampilkan grup konten seperti font, tema, dan judul slide.
#include <DOM/IDocumentProperties.h>
#include <DOM/IHeadingPair.h>
#include <DOM/IPresentationInfo.h>
#include <DOM/PresentationFactory.h>
#include <LoadFormat.h>
#include <system/console.h>
#include <system/io/path.h>
#include <system/object_ext.h>
#include <system/string.h>
using namespace Aspose::Slides;
using namespace System;
using namespace System::IO;
auto filePath = String(u"sample.pptx");
auto presentationInfo = PresentationFactory::get_Instance()->GetPresentationInfo(filePath);
auto documentProperties = presentationInfo->ReadDocumentProperties();
Console::WriteLine(String::Format(u"File: {0}", Path::GetFileName(filePath)));
Console::WriteLine(String::Format(u"Format: {0}", ObjectExt::ToString(presentationInfo->get_LoadFormat())));
Console::WriteLine(String::Format(u"Title: {0}", documentProperties->get_Title()));
Console::WriteLine(String::Format(u"Author: {0}", documentProperties->get_Author()));
Console::WriteLine(u"Statistics:");
Console::WriteLine(String::Format(u" Slides: {0}", documentProperties->get_Slides()));
Console::WriteLine(String::Format(u" Hidden slides: {0}", documentProperties->get_HiddenSlides()));
Console::WriteLine(String::Format(u" Slides with notes: {0}", documentProperties->get_Notes()));
Console::WriteLine(String::Format(u" Paragraphs: {0}", documentProperties->get_Paragraphs()));
Console::WriteLine(String::Format(u" Words: {0}", documentProperties->get_Words()));
Console::WriteLine(String::Format(u" Multimedia clips: {0}", documentProperties->get_MultimediaClips()));
auto headingPairs = documentProperties->get_HeadingPairs();
auto titlesOfParts = documentProperties->get_TitlesOfParts();
auto partIndex = 0;
if (headingPairs == nullptr || titlesOfParts == nullptr || headingPairs->get_Length() == 0 || titlesOfParts->get_Length() == 0)
{
Console::WriteLine(u"Content groups: not available");
}
else
{
Console::WriteLine(u"Content groups:");
for (const auto& headingPair : headingPairs)
{
auto partCount = headingPair->get_Count();
Console::WriteLine(String::Format(u" {0} ({1})", headingPair->get_Name(), partCount));
for (auto partOffset = 0; partOffset < partCount && partIndex < titlesOfParts->get_Length(); partOffset++)
{
Console::WriteLine(String::Format(u" - {0}", titlesOfParts[partIndex]));
partIndex++;
}
}
if (partIndex < titlesOfParts->get_Length())
{
Console::WriteLine(u" Other parts:");
while (partIndex < titlesOfParts->get_Length())
{
Console::WriteLine(String::Format(u" - {0}", titlesOfParts[partIndex]));
partIndex++;
}
}
}
Setiap IHeadingPair menyediakan nama grup melalui IHeadingPair::get_Name dan jumlah item dalam grup tersebut melalui IHeadingPair::get_Count. IDocumentProperties::get_TitlesOfParts mengembalikan array datar yang terurut, jadi konsumsi jumlah judul berurutan yang ditentukan oleh setiap pasangan heading.
Metadata yang Disimpan dan Batasan Format
Properti inventaris yang dikembalikan oleh IPresentationInfo::ReadDocumentProperties mencerminkan metadata yang tersedia dalam dokumen sumber. Aspose.Slides tidak memuat dan menelusuri model objek presentasi untuk menghitung kembali nilai-nilai ini pada pemanggilan ini. Properti yang tidak ada direpresentasikan dengan nilai default, dan nilai yang disimpan dapat menjadi usang jika aplikasi yang terakhir menyimpan file tidak memperbarui properti dokumennya.
- PPTX: Format ini menyediakan properti dokumen tambahan untuk jumlah slide, catatan, slide tersembunyi, paragraf, kata, dan multimedia, serta heading pairs dan judul bagian. Ketersediaannya tergantung pada properti mana yang ditulis oleh pembuat dokumen.
- PPT: Format biner dapat menyimpan properti ringkasan dokumen yang bersesuaian. Jika suatu properti tidak ada atau tidak disegarkan oleh pembuat dokumen, Aspose.Slides mengembalikan nilai yang disimpan atau nilai default alih-alih menghitungnya dari slide.
- ODP: Metadata OpenDocument menyediakan statistik dokumen umum, seperti jumlah halaman, paragraf, dan kata, tetapi nilai-nilai ini tidak selalu berkorespondensi dengan properti tambahan khusus PowerPoint. Metadata slide tersembunyi, catatan, multimedia, heading‑pair, dan judul bagian mungkin tidak tersedia, sehingga properti inventaris dapat mengembalikan nilai default. Jangan menganggap nilai nol atau array kosong sebagai bukti otoritatif bahwa konten yang bersangkutan tidak ada.
Gunakan pendekatan metadata ringan untuk inventaris dan pemeriksaan awal. Muat presentasi dan inspeksi model objeknya yang hidup ketika hasil harus mencerminkan perubahan dalam memori atau ketika Anda perlu memverifikasi konten presentasi yang sebenarnya.
Memperbarui Properti Presentasi
Properti yang dikembalikan oleh IPresentationInfo::ReadDocumentProperties juga dapat diubah tanpa membuat instance Presentation. Terapkan perubahan dengan IPresentationInfo::UpdateDocumentProperties, lalu tulis presentasi yang terikat dengan IPresentationInfo::WriteBindedPresentation.
Gambar berikut menunjukkan properti dokumen asli.

Contoh berikut mengubah judul dan waktu penyimpanan terakhir serta menulis hasilnya ke file baru:
#include <DOM/IDocumentProperties.h>
#include <DOM/IPresentationInfo.h>
#include <DOM/PresentationFactory.h>
#include <system/date_time.h>
#include <system/string.h>
using namespace Aspose::Slides;
using namespace System;
auto sourceFile = String(u"sample.pptx");
auto outputFile = String(u"sample_with_updated_properties.pptx");
auto presentationInfo = PresentationFactory::get_Instance()->GetPresentationInfo(sourceFile);
auto documentProperties = presentationInfo->ReadDocumentProperties();
documentProperties->set_Title(u"Quarterly sales report");
documentProperties->set_LastSavedTime(DateTime::get_UtcNow());
presentationInfo->UpdateDocumentProperties(documentProperties);
presentationInfo->WriteBindedPresentation(outputFile);
Gambar berikut menunjukkan properti dokumen yang telah diperbarui.

Tautan Berguna
Untuk pemeriksaan keamanan terkait dan pengaturan perlindungan, lihat artikel berikut:
FAQ
Bagaimana saya dapat memeriksa apakah font disematkan dan font apa saja yang disematkan?
Muat presentasi dan gunakan Presentation::get_FontsManager. Panggil FontsManager::GetEmbeddedFonts untuk memperoleh font yang disematkan dan FontsManager::GetFonts untuk memperoleh font yang digunakan oleh presentasi. Bandingkan kedua hasil untuk menemukan font yang diperlukan untuk rendering tetapi tidak disematkan.
Bagaimana saya dapat dengan cepat mengetahui apakah file memiliki slide tersembunyi dan berapa banyak?
Ketika metadata dokumen yang disimpan cukup, baca IDocumentProperties::get_HiddenSlides melalui IPresentationFactory::GetPresentationInfo dan IPresentationInfo::ReadDocumentProperties. Ini cocok untuk inventaris ringan. Jika presentasi telah dimodifikasi dalam memori, metadata yang disimpan mungkin hilang atau usang, atau Anda perlu memverifikasi nilai langsung; iterasikan melalui Presentation::get_Slides dan inspeksi metode Slide::get_Hidden pada setiap slide.
Apakah saya dapat mendeteksi apakah ukuran dan orientasi slide kustom digunakan, dan apakah berbeda dari nilai default?
Ya. Muat presentasi dan baca Presentation::get_SlideSize. Periksa ISlideSize::get_Type, ISlideSize::get_Size, dan ISlideSize::get_Orientation untuk membandingkan pengaturan saat ini dengan preset dan dimensi yang diharapkan.
Apakah ada cara cepat untuk melihat apakah chart merujuk ke sumber data eksternal?
Ya. Temukan tiap Chart dan inspeksi ChartData::get_DataSourceType. Untuk workbook eksternal, baca ChartData::get_ExternalWorkbookPath. Tipe sumber data dan jalur mengidentifikasi referensi eksternal, tetapi memverifikasi ketersediaan target memerlukan pemeriksaan sumber daya terpisah.
Bagaimana saya dapat menilai slide “berat” yang mungkin memperlambat rendering atau ekspor PDF?
Tidak ada properti kompleksitas tunggal. Telusuri Presentation::get_Slides dan koleksi IBaseSlide::get_Shapes pada tiap slide. Gunakan jumlah shape serta keberadaan gambar besar, efek, animasi, atau multimedia sebagai sinyal penyaringan, dan ukur rendering atau ekspor representatif sebelum menganggap suatu slide sebagai hambatan kinerja yang terkonfirmasi.