Načtení a aktualizace informací o prezentaci v C++

Přehled

Aspose.Slides dokáže identifikovat formát prezentace a přečíst metadata dokumentu, aniž by vytvářela kompletní objektový model prezentace. To je užitečné, když potřebujete soubory klasifikovat, vytvořit inventář nebo prověřit vlastnosti před rozhodnutím, zda prezentaci načíst a zpracovat.

Tento článek ukazuje lehkou kontrolu pomocí PresentationFactory a IPresentationInfo, a také cílené aktualizace pomocí IDocumentProperties.

Kontrola formátu prezentace

Pokud již máte načtenou prezentaci, podívejte se na Determine the Original Presentation Format pro detekci po načtení a omezení starých toků PPT, PPS a POT.

Použijte IPresentationFactory::GetPresentationInfo k prozkoumání souboru bez vytváření instance Presentation. Metoda IPresentationInfo::get_LoadFormat vrací detekovaný formát, např. PPTX, PPT nebo 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())));
}

Vytvoření lehkého inventáře prezentací

Když zpracováváte mnoho souborů prezentací, můžete potřebovat kompaktní inventář pro validaci, indexaci nebo systém správy dokumentů. V takovém scénáři použijte IPresentationFactory::GetPresentationInfo k získání objektu IPresentationInfo a poté zavolejte IPresentationInfo::ReadDocumentProperties k přečtení metadat dokumentu. Tento přístup nevytváří instanci Presentation ani nevyžaduje procházení kompletním objektovým modelem prezentace.

Rozšířené vlastnosti poskytované IDocumentProperties nabízejí následující hodnoty inventáře:

Metoda Hodnota inventáře
get_Slides Celkový počet snímků.
get_HiddenSlides Počet skrytých snímků.
get_Notes Počet snímků obsahujících poznámky.
get_Paragraphs Celkový počet odstavců, pokud jsou k dispozici.
get_Words Celkový počet slov.
get_MultimediaClips Celkový počet audio a video klipů.

Následující příklad čte tyto hodnoty bez vytváření objektu Presentation a vypisuje kompaktní inventář. Také kombinuje IDocumentProperties::get_HeadingPairs s IDocumentProperties::get_TitlesOfParts pro zobrazení skupin obsahu, jako jsou fonty, motivy a názvy snímků.

#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++;
        }
    }
}

Každý IHeadingPair poskytuje název skupiny prostřednictvím IHeadingPair::get_Name a počet položek ve skupině prostřednictvím IHeadingPair::get_Count. IDocumentProperties::get_TitlesOfParts vrací ploché, uspořádané pole, takže je třeba spotřebovat počet po sobě jdoucích názvů určených každým párem nadpisů.

Uložená metadata a omezení formátu

Vlastnosti inventáře vrácené metodou IPresentationInfo::ReadDocumentProperties odrážejí metadata dostupná ve zdrojovém dokumentu. Aspose.Slides nenačítá ani neprochází objektový model prezentace, aby pro tento volání přepočítala tyto hodnoty. Chybějící vlastnosti jsou reprezentovány výchozími hodnotami a uložené hodnoty mohou být zastaralé, pokud aplikace, která soubor naposledy uložila, neaktualizovala jeho vlastnosti dokumentu.

  • PPTX: Formát poskytuje rozšířené vlastnosti dokumentu pro počty snímků, poznámek, skrytých snímků, odstavců, slov a multimédií, stejně jako páry nadpisů a názvy částí. Dostupnost závisí na tom, které vlastnosti byly zapsány tvůrcem dokumentu.
  • PPT: Binární formát může uložit odpovídající souhrnné vlastnosti dokumentu. Pokud je vlastnost chybí nebo nebyla aktualizována tvůrcem dokumentu, Aspose.Slides vrací její uloženou nebo výchozí hodnotu místo výpočtu ze snímků.
  • ODP: Metadata OpenDocument poskytují obecné statistiky dokumentu, jako jsou počty stránek, odstavců a slov, ale tyto hodnoty neodpovídají všem rozšířeným vlastnostem specifickým pro PowerPoint. Metadata pro skryté snímky, poznámky, multimédia, páry nadpisů a názvy částí mohou být nedostupná a vlastnosti inventáře mohou vracet výchozí hodnoty. Nezobrazujte nulovou hodnotu ani prázdné pole jako definitivní důkaz, že odpovídající obsah chybí.

Použijte lehký přístup k metadatům pro inventáře a předběžné kontroly. Načtěte prezentaci a prozkoumejte její živý objektový model, pokud výsledek musí odrážet změny v paměti nebo pokud potřebujete ověřit skutečný obsah prezentace.

Aktualizace vlastností prezentace

Vlastnosti vrácené metodou IPresentationInfo::ReadDocumentProperties lze také změnit bez vytváření instance Presentation. Změny aplikujte pomocí IPresentationInfo::UpdateDocumentProperties a poté zapište svázanou prezentaci pomocí IPresentationInfo::WriteBindedPresentation.

Následující obrázek zobrazuje původní vlastnosti dokumentu PowerPoint prezentace.

Původní vlastnosti dokumentu PowerPoint prezentace

#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);

Následující obrázek zobrazuje změněné vlastnosti dokumentu PowerPoint prezentace.

Změněné vlastnosti dokumentu PowerPoint prezentace

Užitečné odkazy

Pro související kontroly zabezpečení a nastavení ochrany viz následující články:

FAQ

Jak mohu zjistit, zda jsou fonty vloženy a které to jsou?

Načtěte prezentaci a použijte Presentation::get_FontsManager. Zavolejte FontsManager::GetEmbeddedFonts k získání vložených fontů a FontsManager::GetFonts k získání fontů používaných v prezentaci. Porovnejte oba výsledky a najděte fonty, které jsou nezbytné pro vykreslení, ale nejsou vloženy.

Jak rychle zjistit, zda soubor obsahuje skryté snímky a kolik jich je?

Když stačí uložená metadata dokumentu, přečtěte IDocumentProperties::get_HiddenSlides přes IPresentationFactory::GetPresentationInfo a IPresentationInfo::ReadDocumentProperties. To je vhodné pro lehký inventář. Pokud byla prezentace v paměti upravena, uložená metadata mohou chybět nebo být zastaralá; v takovém případě projděte Presentation::get_Slides a zkontrolujte každého snímku metodou Slide::get_Hidden.

Mohu zjistit, zda je použita vlastní velikost a orientace snímku a zda se liší od výchozích?

Ano. Načtěte prezentaci a přečtěte Presentation::get_SlideSize. Prohlédněte si ISlideSize::get_Type, ISlideSize::get_Size a ISlideSize::get_Orientation a porovnejte aktuální nastavení s očekávaným přednastavením a rozměry.

Existuje rychlý způsob, jak zjistit, zda grafy odkazují na externí zdroje dat?

Ano. Najděte každý Chart a prozkoumejte ChartData::get_DataSourceType. Pro externí sešit přečtěte ChartData::get_ExternalWorkbookPath. Typ zdroje a cesta identifikují externí odkaz, ale ověření, zda je cíl dostupný, vyžaduje samostatnou kontrolu zdrojů.

Jak mohu posoudit ‘těžké’ snímky, které mohou zpomalit vykreslování nebo export do PDF?

Neexistuje jediná vlastnost složitosti. Projděte Presentation::get_Slides a každou kolekci IBaseSlide::get_Shapes. Použijte počet tvarů a přítomnost velkých obrázků, efektů, animací nebo multimédií jako indikátory a změřte reprezentativní render nebo export, než označíte snímek za potvrzený výkonový úzký profil.