Afhandelen van Presentatiewaarschuwingen in Python via Java
Overzicht
Aspose.Slides kan herstelbare problemen melden tijdens het laden, renderen, converteren of opslaan van een presentatie. Voorbeelden zijn beschadigde bronrecords, inhoud die niet bewaard kan blijven, lettertype‑vervanging en beperkingen van een doelformaat. Een waarschuwings‑callback stelt een toepassing in staat deze omstandigheden te registreren en te bepalen of de huidige bewerking kan worden voortgezet.
Implementeer de IWarningCallback‑interface via jpype.JProxy en bekijk de waarden van getWarningType en getDescription die via IWarningInfo worden geleverd. Retourneer ReturnAction.Continue om de waarschuwing te accepteren of ReturnAction.Abort om de bewerking te stoppen.
Gebruik LoadOptions.setWarningCallback voor waarschuwingen die worden gegenereerd bij het openen van een presentatie. Rendering‑ en exportoptie‑klassen erven SaveOptions.setWarningCallback, die waarschuwingen ontvangt van slide‑rendering, conversie en opslaan. Omdat de waarschuwing zelf de toepassingsbewerking niet identificeert, koppel je elke callback‑instantie aan een bewerkingsfase bij het opstellen van een gecombineerd rapport.
Waarschuwingen en uitzonderingen
Een waarschuwing beschrijft een situatie waarvan Aspose.Slides kan herstellen als de callback ReturnAction.Continue retourneert. Een uitzondering betekent dat de gevraagde bewerking niet normaal kan worden voltooid; uitzonderingen worden niet omgezet in waarschuwingen en kunnen niet door een waarschuwings‑policy worden afgehandeld.
Wanneer ReturnAction.Abort wordt geretourneerd, vraagt de waarschuwingsdispatcher de huidige bewerking te beëindigen door een uitzondering te werpen. De openbare uitzondering hangt af van de bewerking en het presentatiefomaat. Bijvoorbeeld, bij het laden kan een PptxReadException of PptReadException optreden, terwijl bij het opslaan of exporteren een PptxException kan verschijnen. Handel de uitzondering af aan de grens van de bewerking en gebruik het waarschuwingsrapport om te bepalen of het beleid van de toepassing de beëindiging heeft veroorzaakt in plaats van te vertrouwen op één subtype of bericht van de uitzondering. De callback registreert de waarschuwing voordat ReturnAction.Abort wordt geretourneerd, zodat de reden beschikbaar blijft voor de toepassing.
Waarschuwingscategorieën
De klasse WarningType biedt gehele‑cijfer‑constanten voor de volgende categorieën:
| Waarschuwingstype | Betekenis | Typisch beleid |
|---|---|---|
| SourceFileCorruption | De bronpresentatie bevat corruptie die een document dat in het originele formaat is opgeslagen onbruikbaar kan maken. | Afbreken. |
| DataLoss | Tekst, grafieken, afbeeldingen of andere gegevens kunnen ontbreken na het laden of opslaan. | Afbreken. |
| MajorFormattingLoss | De presentatie kan belangrijke opmaak verliezen. | Afbreken in strikte validatiemodus; anders registreren en doorgaan. |
| MinorFormattingLoss | Een beperkte opmaakverschil kan optreden. | Registreren voor diagnostiek en doorgaan. |
| CompatibilityIssue | Het resultaat kan in sommige toepassingen of oudere versies niet openen of correct functioneren. | Loggen en doorgaan tenzij compatibiliteit verplicht is. |
| UnexpectedContent | De bron bevat niet‑ondersteunde of niet‑herkende inhoud waarvan het effect nog onbekend kan zijn. | Registreren en doorgaan, of behandelen als een fout in een strikt beleid. |
De categorie moet de beleidsbeslissing sturen. Sla de waarde die door getDescription wordt geretourneerd op voor diagnostiek, maar baseer de toepassingslogica niet op de bewoording omdat de berichttekst kan variëren tussen waarschuwingsscenario’s en productversies.
Verzamel en classificeer waarschuwingen
Het volgende voorbeeld gebruikt één toepassings‑niveau rapport voor de volledige verwerkingspijplijn. Een afzonderlijke callback‑instantie labelt waarschuwingen van laden, renderen, PDF‑conversie en PPTX‑opslaan. Het beleid beëindigt bij bron‑corruptie of gegevensverlies, stopt eventueel bij grote opmaakverlies, en gaat door voor andere waarschuwingen.
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}")
Geef False op voor abort_on_major_formatting_loss bij het construeren van WarningPolicy als grote opmaakverschillen acceptabel zijn. Compatibiliteitsproblemen, klein opmaakverlies en onverwachte inhoud blijven nog steeds in het rapport behouden, zelfs wanneer de bewerking wordt voortgezet. Breid WarningPolicy.get_action uit als de toepassing een van deze categorieën moet afwijzen.
Veelvoorkomende waarschuwingsscenario’s
Waarschuwingen kunnen optreden in verschillende fasen van een workflow:
- Digitale handtekeningen: Een ondertekende presentatie kan bij het laden een waarschuwing genereren dat de handtekening verloren gaat tijdens de verwerking. Aspose.Slides meldt deze
DataLoss‑conditie viaIPresentationSignedWarningInfo. Een callback in de laadfase stelt de toepassing in staat het bestand te weigeren of het gemelde verlies expliciet te accepteren. - Lettertype‑vervanging: Een niet‑beschikbaar lettertype kan worden vervangen tijdens het renderen of exporteren van een dia. Waarschuwingen over lettertype‑vervanging worden gemeld als
DataLoss, waardoor het strikte beleid hierboven afbreekt, zelfs als de toepassing een bepaalde vervanging visueel acceptabel zou vinden. Om dit gedrag te observeren, gebruik een invoerpresentatie met tekst in een lettertype dat niet beschikbaar is voor de runtime. De waarschuwingsbeschrijving identificeert de vervanging; configureer de vereiste lettertypen of font substitution rules voordat u het opnieuw probeert. - Niet‑ondersteunde of onverwachte inhoud: Een loader kan presentatie‑records of functies tegenkomen die hij niet herkent. Dergelijke waarschuwingen kunnen
UnexpectedContentgebruiken, of een ernstigere categorie wanneer gegevens of opmaak bekend is aangetast. - Formaat‑compatibiliteit: Opslaan naar een ander presentatiefomaat kan functies weglaten of een resultaat opleveren dat zich anders gedraagt in sommige toepassingen. Bijvoorbeeld, een presentatie met meer dan acht horizontale of acht verticale tekengidsen opslaan naar een legacy PPT meldt een
CompatibilityIssue. De callback in de opslaanfase kan het verlies registreren en doorgaan, of het afwijzen als het behouden van alle gidsen vereist is. - Laadgedrag: Laadopties en legacy‑gedragingen kunnen eveneens waarschuwingen genereren. Bijvoorbeeld,
IObsoletePresLockingBehaviorWarningInfoidentificeert het gebruik van een verouderd presentatie‑vergrendelingsgedrag als eenCompatibilityIssue.
Waarschuwingen hangen af van het bron‑document, het doelformaat, de bewerking en de versie van Aspose.Slides. Ga niet ervan uit dat elk bestand een waarschuwing oplevert of dat een scenario altijd aan slechts één categorie gekoppeld is.
Afgebroken bewerkingen veilig afhandelen
Wanneer een callback ReturnAction.Abort retourneert, gebruik dan geen object dat niet geladen kon worden en ga niet ervan uit dat een render‑ of opslaag‑output compleet is. De bewerking kan beëindigen nadat een uitvoerbestand is aangemaakt maar vóórdat het voltooid is.
Sla gevalideerde resultaten op naar een apart pad, bijvoorbeeld validated-output.pptx. Vervang een bestaande presentatie pas nadat de bewerking succesvol is afgerond, het waarschuwingsrapport voldoet aan het beleids‑van de toepassing, en de output geopend en gecontroleerd kan worden. Dit voorkomt het overschrijven van een geldig bronbestand met een gedeeltelijk of afgewezen resultaat.
Een leeg waarschuwingsrapport biedt geen garantie dat elke bron‑eigenschap behouden is gebleven. Pas eventuele extra inhouds‑ en visuele controles toe die de toepassing vereist. Zie ook Open Presentations en Save Presentations.
FAQ
Kan een waarschuwings‑callback elke Aspose.Slides‑fout afhandelen?
Nee. Het handelt herstelbare situaties af die worden gerapporteerd als waarschuwingen. Uitzonderingen die onafhankelijk van de callback optreden, moeten door de toepassing worden afgehandeld rond het laad‑, render‑, conversie‑ of opslaag‑oproep.
Garandeert het retourneren van ReturnAction.Continue identieke output?
Nee. Het staat alleen toe de verwerking voort te zetten. De gerapporteerde situatie kan nog steeds data‑, opmaak‑ of compatibiliteitsverschillen veroorzaken, dus controleer de verzamelde waarschuwings‑typen en beschrijvingen.
Hoe kan een toepassing de bewerking identificeren die een waarschuwing heeft veroorzaakt?
Maak voor elke bewerking een callback‑instantie aan en sla een door de toepassing gedefinieerde fase op samen met de waarden die door getWarningType en getDescription worden geretourneerd, zoals in het voorbeeld wordt getoond.