ดึงและอัปเดตข้อมูลพรีเซนเทชั่นใน C++
ภาพรวม
Aspose.Slides สามารถระบุรูปแบบของพรีเซนเทชั่นและอ่านเมตาดาต้าเอกสารโดยไม่ต้องสร้างโมเดลวัตถุพรีเซนเทชั่นอย่างสมบูรณ์ ซึ่งเป็นประโยชน์เมื่อคุณต้องการจัดประเภทไฟล์ สร้างรายการตรวจสอบ หรือตรวจสอบคุณสมบัติก่อนตัดสินใจว่าจะโหลดและประมวลผลเนื้อหาพรีเซนเทชั่นหรือไม่
บทความนี้แสดงการตรวจสอบแบบเบาโดยใช้ PresentationFactory และ IPresentationInfo, รวมถึงการอัปเดตแบบเจาะจงโดยใช้ IDocumentProperties
ตรวจสอบรูปแบบพรีเซนเทชัน
ใช้ IPresentationFactory::GetPresentationInfo เพื่อตรวจสอบไฟล์โดยไม่ต้องสร้างอินสแตนซ์ของ Presentation วิธี IPresentationInfo::get_LoadFormat จะรายงานรูปแบบที่ตรวจพบ เช่น PPTX, PPT หรือ 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())));
}
สร้างรายการพรีเซนเทชันขนาดเบา
เมื่อคุณต้องประมวลผลไฟล์พรีเซนเทชันจำนวนมาก คุณอาจต้องการรายการสั้น ๆ เพื่อการตรวจสอบ การทำดัชนี หรือระบบจัดการเอกสาร ในกรณีนี้ ให้ใช้ IPresentationFactory::GetPresentationInfo เพื่อรับอ็อบเจ็กต์ IPresentationInfo จากนั้นเรียก IPresentationInfo::ReadDocumentProperties เพื่ออ่านเมตาดาต้าเอกสาร วิธีการนี้จะไม่สร้างอินสแตนซ์ของ Presentation หรือทำให้ต้องเดินทางผ่านโมเดลวัตถุพรีเซนเทชั่นเต็มรูปแบบ
คุณสมบัติเพิ่มเติมที่เปิดโดย IDocumentProperties ให้ค่าต่อไปนี้ในรายการ:
| วิธีการ | ค่าในรายการ |
|---|---|
| get_Slides | จำนวนสไลด์ทั้งหมด |
| get_HiddenSlides | จำนวนสไลด์ที่ซ่อนอยู่ |
| get_Notes | จำนวนสไลด์ที่มีบันทึกย่อ |
| get_Paragraphs | จำนวนย่อหน้าทั้งหมด (หากมี) |
| get_Words | จำนวนคำทั้งหมด |
| get_MultimediaClips | จำนวนคลิปเสียงและวิดีโอทั้งหมด |
ตัวอย่างต่อไปนี้อ่านค่าต่าง ๆ เหล่านี้โดยไม่สร้างอ็อบเจ็กต์ Presentation และพิมพ์รายการสั้น ๆ นอกจากนี้ยังผสานการใช้งาน IDocumentProperties::get_HeadingPairs กับ IDocumentProperties::get_TitlesOfParts เพื่อแสดงกลุ่มเนื้อหา เช่น ฟอนต์ ธีม และชื่อสไลด์
#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++;
}
}
}
แต่ละอ็อบเจ็กต์ IHeadingPair จะให้ชื่อกลุ่มผ่าน IHeadingPair::get_Name และจำนวนรายการในกลุ่มผ่าน IHeadingPair::get_Count เมธอด IDocumentProperties::get_TitlesOfParts จะคืนค่าอาร์เรย์แบนที่เรียงลำดับ จึงต้องใช้จำนวนชื่อที่ต่อเนื่องตามที่แต่ละ HeadingPair ระบุ
ข้อมูลเมตาที่เก็บไว้และข้อจำกัดของรูปแบบ
คุณสมบัติลิสต์ที่ส่งกลับโดย IPresentationInfo::ReadDocumentProperties สะท้อนเมตาดาต้าที่มีอยู่ในเอกสารต้นทาง Aspose.Slides ไม่ได้โหลดและเดินทางผ่านโมเดลวัตถุพรีเซนเทชั่นเพื่อคำนวณค่าเหล่านี้ใหม่สำหรับการเรียกนี้ คุณสมบัติที่หายไปจะแสดงเป็นค่าเริ่มต้น และค่าที่เก็บไว้อาจล้าสมัยหากแอปพลิเคชันที่บันทึกไฟล์ครั้งสุดท้ายไม่ได้อัปเดตคุณสมบัติเข้าเอกสาร
- PPTX: รูปแบบนี้ให้คุณสมบัติเพิ่มเติมสำหรับจำนวนสไลด์ บันทึกย่อ สไลด์ที่ซ่อนอยู่ ย่อหน้า คำ และสื่อมัลติมีเดีย รวมถึง HeadingPairs และ PartTitles การใช้งานขึ้นกับว่าผู้ผลิตเอกสารได้เขียนคุณสมบัติเหล่านั้นหรือไม่
- PPT: รูปแบบไบนารีสามารถเก็บคุณสมบัติสรุปเอกสารที่สอดคล้องกันได้ หากคุณสมบัติเกิดขาดหรือไม่ได้รับการรีเฟรชโดยผู้ผลิตเอกสาร Aspose.Slides จะคืนค่าที่เก็บไว้หรือค่าเริ่มต้นแทนการคำนวณจากสไลด์
- ODP: เมตาดาต้า OpenDocument ให้สถิติทั่วไปของเอกสาร เช่น จำนวนหน้า ย่อหน้า และคำ แต่ค่าดังกล่าวไม่แมปกับคุณสมบัติเพิ่มเติมเฉพาะ PowerPoint เช่น สไลด์ที่ซ่อน บันทึกย่อ สื่อมัลติมีเดีย HeadingPairs และ PartTitles อาจไม่มีให้บริการและคุณสมบัติในรายการอาจคืนค่าเริ่มต้น อย่าถือค่าศูนย์หรืออาร์เรย์ว่างว่าเป็นการพิสูจน์ที่แน่นอนว่าข้อมูลดังกล่าวไม่มีอยู่
ใช้วิธีเมตาดาต้าแบบเบาสำหรับการทำรายการและการตรวจสอบเบื้องต้น โหลดพรีเซนเทชั่นและตรวจสอบโมเดลวัตถุสดเมื่อผลลัพธ์ต้องสะท้อนการเปลี่ยนแปลงในหน่วยความจำหรือเมื่อคุณต้องการยืนยันเนื้อหาพรีเซนเทชั่นจริง
อัปเดตคุณสมบัติพรีเซนเทชั่น
คุณสมบัติที่ส่งกลับโดย IPresentationInfo::ReadDocumentProperties สามารถเปลี่ยนแปลงได้โดยไม่ต้องสร้างอินสแตนซ์ของ Presentation ใช้ IPresentationInfo::UpdateDocumentProperties เพื่อทำการเปลี่ยนแปลง แล้วเขียนพรีเซนเทชั่นที่ผูกไว้ด้วย IPresentationInfo::WriteBindedPresentation
ภาพต่อไปนี้แสดงคุณสมบัติเบื้องต้นของเอกสาร

ตัวอย่างต่อไปนี้เปลี่ยนชื่อเรื่องและเวลาที่บันทึกล่าสุด แล้วเขียนผลลัพธ์ไปยังไฟล์ใหม่:
#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);
ภาพต่อไปนี้แสดงคุณสมบัติเอกสารที่ถูกอัปเดต

ลิงก์ที่เป็นประโยชน์
สำหรับการตรวจสอบความปลอดภัยและการตั้งค่าการป้องกันที่เกี่ยวข้อง ดูบทความต่อไปนี้:
FAQ
ฉันจะตรวจสอบได้อย่างไรว่าแบบอักษรถูกฝังไว้และมีแบบอักษรอะไรบ้าง?
โหลดพรีเซนเทชั่นและใช้ Presentation::get_FontsManager เรียก FontsManager::GetEmbeddedFonts เพื่อรับแบบอักษรที่ฝังไว้และ FontsManager::GetFonts เพื่อรับแบบอักษรที่พรีเซนเทชั่นใช้เปรียบเทียบผลลัพธ์สองชุดเพื่อหาตัวอักษรที่จำเป็นสำหรับการเรนเดอร์แต่ไม่ได้ฝังไว้
ฉันจะบอกได้เร็ว ๆ ว่าไฟล์มีสไลด์ที่ซ่อนอยู่หรือไม่และมีจำนวนเท่าไหร่?
เมื่อเมตาดาต้าเอกสารที่เก็บไว้เพียงพอ ให้อ่าน IDocumentProperties::get_HiddenSlides ผ่าน IPresentationFactory::GetPresentationInfo และ IPresentationInfo::ReadDocumentProperties วิธีนี้เหมาะกับการทำรายการเบา หากพรีเซนเทชั่นถูกแก้ไขในหน่วยความจำ เมตาดาต้าที่เก็บไว้อาจหายหรือล้าสมัย หรือคุณต้องการตรวจสอบค่าจริง ให้วนลูปผ่าน Presentation::get_Slides และตรวจสอบเมธอด Slide::get_Hidden ของแต่ละสไลด์แทน
ฉันสามารถตรวจจับได้หรือไม่ว่ามีการกำหนดขนาดสไลด์และการวางแนวแบบกำหนดเองและว่ามันแตกต่างจากค่าเริ่มต้นหรือไม่?
ได้ โหลดพรีเซนเทชั่นและอ่าน Presentation::get_SlideSize ตรวจสอบ ISlideSize::get_Type, ISlideSize::get_Size และ ISlideSize::get_Orientation เพื่อเปรียบเทียบการตั้งค่าปัจจุบันกับพรีเซ็ตและขนาดที่คาดหวัง
มีวิธีรวดเร็วในการดูว่ากราฟอ้างอิงแหล่งข้อมูลภายนอกหรือไม่?
มี ค้นหาแต่ละ Chart และตรวจสอบ ChartData::get_DataSourceType หากเป็น workbook ภายนอก ให้อ่าน ChartData::get_ExternalWorkbookPath ประเภทและพาธของแหล่งข้อมูลจะแสดงว่าเป็นการอ้างอิงภายนอก แต่การตรวจสอบว่าแหล่งที่มามีอยู่หรือไม่ต้องทำการตรวจสอบแยกต่างหาก
ฉันจะประเมินสไลด์ “หนัก” ที่อาจทำให้การเรนเดอร์หรือส่งออก PDF ช้าลงได้อย่างไร?
ไม่มีคุณสมบัติความซับซ้อนเพียงหนึ่งค่า ให้วนลูปผ่าน Presentation::get_Slides และคอลเลกชัน IBaseSlide::get_Shapes ของแต่ละสไลด์ ใช้การนับจำนวนรูปทรงและการมีอยู่ของภาพขนาดใหญ่ เอฟเฟกต์ แอนิเมชัน หรือมัลติมีเดียเป็นสัญญาณคัดกรอง และวัดการเรนเดอร์หรือส่งออกตัวอย่างก่อนตัดสินว่าสไลด์เป็นคอขวดประสิทธิภาพอย่างแน่ชัด