Zpracování výstrah prezentace v Pythonu pomocí Java
Přehled
Aspose.Slides může hlásit obnovitelné problémy během načítání, vykreslování, převodu nebo ukládání prezentace. Příklady zahrnují poškozené zdrojové záznamy, obsah, který nelze zachovat, náhradu písma a omezení cílového formátu. Výstražná zpětná volání umožňuje aplikaci zaznamenat tyto podmínky a rozhodnout, zda může současná operace pokračovat.
Implementujte rozhraní IWarningCallback prostřednictvím jpype.JProxy a prozkoumejte hodnoty getWarningType a getDescription dodávané přes IWarningInfo. Vraťte ReturnAction.Continue pro přijetí výstrahy nebo ReturnAction.Abort pro zastavení operace.
Použijte LoadOptions.setWarningCallback pro výstrahy vyvolané při otevírání prezentace. Třídy pro vykreslování a exportní možnosti dědí SaveOptions.setWarningCallback, která přijímá výstrahy z vykreslování snímků, převodu a ukládání. Protože samotná výstraha neidentifikuje operaci aplikace, při vytváření kombinované zprávy spojte každou instanci zpětné volání s fází operace.
Výstrahy a výjimky
Výstraha popisuje podmínku, ze které se Aspose.Slides může zotavit, pokud zpětná volání vrátí ReturnAction.Continue. Výjimka znamená, že požadovaná operace nemůže být dokončena normálně; výjimky nejsou převáděny na výstrahy a nemohou být zpracovány výstražnou politikou.
Vrácení ReturnAction.Abort požaduje od výstražného dispečera ukončení aktuální operace vyvoláním výjimky. Veřejná výjimka závisí na operaci a formátu prezentace. Například načítání může vyvolat PptxReadException nebo PptReadException, zatímco ukládání nebo export může vyvolat PptxException. Ošetřete výjimku na hranici operace a použijte výstražnou zprávu k určení, zda politika aplikace způsobila ukončení místo spolehnutí se na jeden podtyp výjimky nebo zprávu. Zpětná volání zaznamená výstrahu před vrácením ReturnAction.Abort, čímž zajistí, že důvod zůstane dostupný aplikaci.
Kategorie výstrah
Třída WarningType poskytuje celočíselné konstanty pro následující kategorie:
| Typ výstrahy | Význam | Typická politika |
|---|---|---|
| SourceFileCorruption | Zdrojová prezentace obsahuje poškození, které může způsobit, že dokument uložený v původním formátu bude nevyužitelný. | Ukončit. |
| DataLoss | Po načtení nebo uložení může chybět text, grafy, obrázky nebo jiná data. | Ukončit. |
| MajorFormattingLoss | Prezentace může ztratit důležité formátování. | Ukončit v režimu přísné validace; jinak zaznamenat a pokračovat. |
| MinorFormattingLoss | Může dojít k omezenému rozdílu ve formátování. | Zaznamenat pro diagnostiku a pokračovat. |
| CompatibilityIssue | Výsledek se nemusí otevřít nebo správně fungovat v některých aplikacích či starších verzích. | Zaznamenat a pokračovat, pokud není kompatibilita povinná. |
| UnexpectedContent | Zdroj obsahuje nepodporovaný nebo nerozpoznaný obsah, jehož dopad ještě není znám. | Zaznamenat a pokračovat, nebo v přísné politice považovat za chybu. |
Kategorie by měla určovat rozhodnutí politiky. Uložte hodnotu vrácenou getDescription pro diagnostiku, ale nespoléhejte se na její znění při logice aplikace, protože text zprávy se může lišit mezi scénáři výstrah a verzemi produktu.
Sbírat a klasifikovat výstrahy
Následující příklad používá jednu úroveň zprávy aplikace pro celý zpracovatelský řetězec. Samostatná instance zpětné volání označuje výstrahy z načítání, vykreslování, konverze do PDF a ukládání PPTX. Politika ukončuje při poškození zdroje nebo ztrátě dat, volitelně ukončuje při velké ztrátě formátování a pokračuje u ostatních výstrah.
import sys
from dataclasses import dataclass
from enum import Enum
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ImageFormat, LoadOptions, PdfOptions, PptxOptions, Presentation, RenderingOptions, ReturnAction, SaveFormat, WarningType
class OperationStage(Enum):
Loading = "Loading"
Rendering = "Rendering"
Conversion = "Conversion"
Saving = "Saving"
@dataclass(frozen=True)
class WarningEntry:
stage: OperationStage
type: int
description: str
class WarningReport:
def __init__(self):
self._entries = []
def get_entries(self):
return tuple(self._entries)
def add(self, stage, warning):
entry = WarningEntry(stage, warning.getWarningType(), str(warning.getDescription()))
self._entries.append(entry)
class WarningPolicy:
def __init__(self, abort_on_major_formatting_loss):
self.abort_on_major_formatting_loss = abort_on_major_formatting_loss
def get_action(self, warning_type):
if warning_type in (WarningType.SourceFileCorruption, WarningType.DataLoss):
return ReturnAction.Abort
if warning_type == WarningType.MajorFormattingLoss and self.abort_on_major_formatting_loss:
return ReturnAction.Abort
return ReturnAction.Continue
class ReportingWarningCallback:
def __init__(self, stage, report, policy):
self.stage = stage
self.report = report
self.policy = policy
def warning(self, warning):
self.report.add(self.stage, warning)
return self.policy.get_action(warning.getWarningType())
def process_presentation(input_path, report, policy):
try:
load_options = LoadOptions()
handler = ReportingWarningCallback(OperationStage.Loading, report, policy)
callback = jpype.JProxy("com.aspose.slides.IWarningCallback", inst=handler)
load_options.setWarningCallback(callback)
presentation = Presentation(input_path, load_options)
try:
if not render_first_slide(presentation, report, policy):
return False
if not convert_to_pdf(presentation, report, policy):
return False
return save_validated_copy(presentation, report, policy)
finally:
presentation.dispose()
except Exception as exception:
print(f"Loading stopped: {exception}", file=sys.stderr)
return False
def render_first_slide(presentation, report, policy):
if presentation.getSlides().size() == 0:
print("Rendering stopped: the presentation has no slides.", file=sys.stderr)
return False
try:
options = RenderingOptions()
handler = ReportingWarningCallback(OperationStage.Rendering, report, policy)
callback = jpype.JProxy("com.aspose.slides.IWarningCallback", inst=handler)
options.setWarningCallback(callback)
image = presentation.getSlides().get_Item(0).getImage(options)
try:
image.save("slide-1.png", ImageFormat.Png)
return True
finally:
image.dispose()
except Exception as exception:
print(f"Rendering stopped: {exception}", file=sys.stderr)
return False
def convert_to_pdf(presentation, report, policy):
try:
options = PdfOptions()
handler = ReportingWarningCallback(OperationStage.Conversion, report, policy)
callback = jpype.JProxy("com.aspose.slides.IWarningCallback", inst=handler)
options.setWarningCallback(callback)
presentation.save("converted.pdf", SaveFormat.Pdf, options)
return True
except Exception as exception:
print(f"Conversion stopped: {exception}", file=sys.stderr)
return False
def save_validated_copy(presentation, report, policy):
try:
options = PptxOptions()
handler = ReportingWarningCallback(OperationStage.Saving, report, policy)
callback = jpype.JProxy("com.aspose.slides.IWarningCallback", inst=handler)
options.setWarningCallback(callback)
presentation.save("validated-output.pptx", SaveFormat.Pptx, options)
return True
except Exception as exception:
print(f"Saving stopped: {exception}", file=sys.stderr)
return False
def warning_type_name(warning_type):
names = {
WarningType.SourceFileCorruption: "SourceFileCorruption",
WarningType.DataLoss: "DataLoss",
WarningType.MajorFormattingLoss: "MajorFormattingLoss",
WarningType.MinorFormattingLoss: "MinorFormattingLoss",
WarningType.CompatibilityIssue: "CompatibilityIssue",
WarningType.UnexpectedContent: "UnexpectedContent",
}
return names.get(warning_type, f"Unknown ({warning_type})")
report = WarningReport()
policy = WarningPolicy(True)
completed = process_presentation("input.pptx", report, policy)
print("Processing completed." if completed else "Processing stopped.")
for entry in report.get_entries():
type_name = warning_type_name(entry.type)
print(f"[{entry.stage.value}] {type_name}: {entry.description}")
Při vytváření WarningPolicy předávejte False pro abort_on_major_formatting_loss, pokud jsou hlavní rozdíly ve formátování přijatelné. Problémy s kompatibilitou, menší ztráta formátování a neočekávaný obsah jsou i tak zachovány ve zprávě, i když operace pokračuje. Rozšiřte WarningPolicy.get_action, pokud aplikace musí odmítnout některou z těchto kategorií.
Běžné scénáře výstrah
Výstrahy se mohou objevit v různých fázích pracovního postupu:
- Digitální podpisy: Podepsaná prezentace může při načítání vyvolat výstrahu, že její podpis bude během zpracování ztracen. Aspose.Slides tuto podmínku
DataLosshlásí prostřednictvímIPresentationSignedWarningInfo. Zpětná volání v načítací fázi umožňuje aplikaci soubor odmítnout nebo výslovně přijmout hlášenou ztrátu. - Náhrada písma: Nedostupné písmo může být nahrazeno během vykreslování nebo exportu snímku. Výstrahy z náhrady písma jsou hlášeny jako
DataLoss, takže přísná politika výše ukončí i když by aplikace považovala konkrétní náhradu za vizuálně přijatelnou. Pro pozorování tohoto chování použijte vstupní prezentaci obsahující text v písmu nedostupném v době běhu. Popis výstrahy identifikuje náhradu; nakonfigurujte požadovaná písma nebo pravidla náhrady písma před dalším pokusem. - Nepodporovaný nebo neočekávaný obsah: Načítací komponenta může narazit na záznamy nebo funkce prezentace, které nepozná. Takové výstrahy mohou použít
UnexpectedContentnebo závažnější kategorii, pokud jsou data nebo formátování známy jako postižené. - Kompatibilita formátu: Ukládání do jiného formátu prezentace může vynechat funkce nebo vytvořit výsledek, který se v některých aplikacích chová odlišně. Například uložení prezentace s více než osmi vodorovnými nebo svislými kreslicími vodítky do staršího PPT hlásí
CompatibilityIssue. Zpětná volání v ukládací fázi může ztrátu zaznamenat a pokračovat, nebo ji odmítnout, pokud je zachování všech vodítek vyžadováno. - Chování při načítání: Možnosti načítání a staré chování mohou také generovat výstrahy. Například
IObsoletePresLockingBehaviorWarningInfoidentifikuje použití zastaralého chování zamykání prezentace jakoCompatibilityIssue.
Výstrahy závisí na zdrojovém dokumentu, cílovém formátu, operaci a verzi Aspose.Slides. Nepředpokládejte, že každý soubor vygeneruje výstrahu nebo že scénář vždy spadá jen do jedné kategorie.
Bezpečné zacházení s přerušenými operacemi
Když zpětná volání vrátí ReturnAction.Abort, nepoužívejte objekt, který se nepodařilo načíst, a nepředpokládejte, že výstup vykreslení nebo uložení je kompletní. Operace může skončit po vytvoření výstupního souboru, ale před jeho dokončením.
Ukládejte ověřené výsledky do samostatné cesty, například validated-output.pptx. Stávající prezentaci nahraďte až po úspěšném dokončení operace, pokud zpráva o výstrahách splňuje politiku aplikace a výstup lze otevřít a zkontrolovat. Tím se zabrání přepsání platného zdrojového souboru částečným nebo odmítnutým výsledkem.
Prázdná zpráva o výstrahách není zárukou, že každý zdrojový prvek byl zachován. Proveďte případné další kontroly obsahu a vizuální kontroly požadované aplikací. Viz také Open Presentations a Save Presentations.
Často kladené otázky
Může výstražná zpětná volání zvládnout každou chybu Aspose.Slides?
Ne. Zvládá pouze obnovitelné podmínky hlášené jako výstrahy. Výjimky, které nastanou nezávisle na zpětné volání, musí být ošetřeny aplikací kolem volání načítání, vykreslování, převodu nebo ukládání.
Zaručuje vrácení ReturnAction.Continue stejný výstup?
Ne. Pouze umožní pokračovat ve zpracování. Nahlášená podmínka může stále způsobit rozdíly v datech, formátování nebo kompatibilitě, proto přezkoumejte shromážděné typy výstrah a jejich popisy.
Jak může aplikace identifikovat operaci, která výstrahu vyvolala?
Vytvořte samostatnou instanci zpětné volání pro každou operaci a uložte aplikací definovanou fázi spolu s hodnotami vrácenými getWarningType a getDescription, jak ukazuje příklad.