Διαχείριση Προειδοποιήσεων Παρουσίασης σε Android

Επισκόπηση

Aspose.Slides μπορεί να αναφέρει ανακτήσιμα προβλήματα κατά τη φόρτωση, την απόδοση, τη μετατροπή ή την αποθήκευση μιας παρουσίασης. Παραδείγματα περιλαμβάνουν κατεστραμμένες εγγραφές πηγής, περιεχόμενο που δεν μπορεί να διατηρηθεί, αντικατάσταση γραμματοσειράς και περιορισμούς του προορισμού μορφής. Ένα callback προειδοποίησης επιτρέπει σε μια εφαρμογή να καταγράψει αυτές τις συνθήκες και να αποφασίσει αν η τρέχουσα λειτουργία μπορεί να συνεχιστεί.

Υλοποιήστε το IWarningCallback interface και εξετάστε τις τιμές getWarningType και getDescription που παρέχονται μέσω του IWarningInfo. Επιστρέψτε το ReturnAction.Continue για να αποδεχθείτε την προειδοποίηση ή το ReturnAction.Abort για να σταματήσετε τη λειτουργία.

Χρησιμοποιήστε το LoadOptions.setWarningCallback για προειδοποιήσεις που προκύπτουν κατά το άνοιγμα μιας παρουσίασης. Οι κλάσεις επιλογών απόδοσης και εξαγωγής κληρονομούν το SaveOptions.setWarningCallback, το οποίο λαμβάνει προειδοποιήσεις από την απόδοση διαφάνειας, τη μετατροπή και την αποθήκευση. Επειδή η προειδοποίηση δεν προσδιορίζει τη λειτουργία της εφαρμογής, συσχετίστε κάθε instance callback με ένα στάδιο λειτουργίας όταν δημιουργείτε μια ενιαία αναφορά.

Προειδοποιήσεις και Εξαιρέσεις

Μία προειδοποίηση περιγράφει μια κατάσταση από την οποία το Aspose.Slides μπορεί να ανακάμψει εάν το callback επιστρέψει ReturnAction.Continue. Μία εξαίρεση σημαίνει ότι η ζητούμενη λειτουργία δεν μπορεί να ολοκληρωθεί κανονικά· οι εξαιρέσεις δεν μετατρέπονται σε προειδοποιήσεις και δεν μπορούν να διαχειριστούν από πολιτική προειδοποίησης.

Η επιστροφή ReturnAction.Abort ζητά από τον dispatcher προειδοποιήσεων να τερματίσει την τρέχουσα λειτουργία σηκώνοντας μια εξαίρεση. Η δημόσια εξαίρεση εξαρτάται από τη λειτουργία και τη μορφή παρουσίασης. Για παράδειγμα, η φόρτωση μπορεί να προκύψει με PptxReadException ή PptReadException, ενώ η αποθήκευση ή εξαγωγή μπορεί να προκύψει με PptxException. Διαχειριστείτε την εξαίρεση στα όρια της λειτουργίας και χρησιμοποιήστε την αναφορά προειδοποιήσεων για να καθορίσετε εάν η πολιτική της εφαρμογής προκάλεσε τον τερματισμό αντί να βασίζεστε σε έναν υποτύπο εξαίρεσης ή μήνυμα. Το callback καταγράφει την προειδοποίηση πριν επιστρέψει ReturnAction.Abort, εξασφαλίζοντας ότι ο λόγος παραμένει διαθέσιμος στην εφαρμογή.

Κατηγορίες Προειδοποιήσεων

Η κλάση WarningType παρέχει ακέραιους σταθερούς για τις ακόλουθες κατηγορίες:

Τύπος προειδοποίησης Νόημα Τυπική πολιτική
SourceFileCorruption Η πηγαία παρουσίαση περιέχει φθορές που μπορούν να κάνουν ένα έγγραφο αποθηκευμένο στην αρχική του μορφή μη χρησιμοποιήσιμο. Απόρριψη.
DataLoss Κείμενο, διαγράμματα, εικόνες ή άλλα δεδομένα μπορεί να λείπουν μετά τη φόρτωση ή την αποθήκευση. Απόρριψη.
MajorFormattingLoss Η παρουσίαση μπορεί να χάσει σημαντική μορφοποίηση. Απόρριψη σε αυστηρή λειτουργία επαλήθευσης· διαφορετικά καταγραφή και συνέχεια.
MinorFormattingLoss Μπορεί να προκύψει περιορισμένη διαφορά μορφοποίησης. Καταγραφή για διάγνωση και συνέχεια.
CompatibilityIssue Το αποτέλεσμα μπορεί να μην ανοίξει ή να συμπεριφερθεί σωστά σε ορισμένες εφαρμογές ή παλαιότερες εκδόσεις. Καταγραφή και συνέχεια εκτός εάν η συμβατότητα είναι υποχρεωτική.
UnexpectedContent Η πηγή περιέχει μη υποστηριζόμενο ή μη αναγνωρίσιμο περιεχόμενο του οποίου η επίδραση ενδέχεται να μην είναι ακόμη γνωστή. Καταγραφή και συνέχεια, ή αντιμετώπιση ως σφάλμα σε αυστηρή πολιτική.

Η κατηγορία πρέπει να καθοδηγεί την απόφαση πολιτικής. Αποθηκεύστε την τιμή που επιστρέφεται από το getDescription για διαγνωστικούς σκοπούς, αλλά μην εξαρτάστε από τη διατύπωσή της για λογική της εφαρμογής, επειδή το κείμενο του μηνύματος μπορεί να διαφέρει μεταξύ σεναρίων προειδοποίησης και εκδόσεων του προϊόντος.

Συλλογή και Κατηγοριοποίηση Προειδοποιήσεων

Το παρακάτω παράδειγμα χρησιμοποιεί μία αναφορά σε επίπεδο εφαρμογής για ολόκληρη τη διαδικασία επεξεργασίας. Μία ξεχωριστή instance callback επισημαίνει προειδοποιήσεις από τη φόρτωση, την απόδοση, τη μετατροπή σε PDF και την αποθήκευση PPTX. Η πολιτική ακυρώνει σε περίπτωση φθορών πηγής ή απώλειας δεδομένων, προαιρετικά ακυρώνει σε περίπτωση μεγάλης απώλειας μορφοποίησης και συνεχίζει για τις υπόλοιπες προειδοποιήσεις.

Τοποθετήστε το input.pptx σε έναν εγγράψιμο κατάλογο εφαρμογής και περάστε αυτόν τον κατάλογο στη μέθοδο PresentationWarningExample.run. Το παράδειγμα αποθηκεύει τα αποτελέσματά του στον ίδιο κατάλογο. Εκτελέστε την επεξεργασία παρουσίασης σε νήμα του παρασκηνίου για να διατηρήσετε το Android UI ανταποκρινόμενο.

import com.aspose.slides.IImage;
import com.aspose.slides.IWarningCallback;
import com.aspose.slides.IWarningInfo;
import com.aspose.slides.ImageFormat;
import com.aspose.slides.LoadOptions;
import com.aspose.slides.PdfOptions;
import com.aspose.slides.PptxOptions;
import com.aspose.slides.Presentation;
import com.aspose.slides.RenderingOptions;
import com.aspose.slides.ReturnAction;
import com.aspose.slides.SaveFormat;
import com.aspose.slides.WarningType;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class PresentationWarningExample {
    public static void run(File dataDirectory) {
        WarningReport report = new WarningReport();
        WarningPolicy policy = new WarningPolicy(true);
        File inputFile = new File(dataDirectory, "input.pptx");
        boolean completed = processPresentation(inputFile.getAbsolutePath(), dataDirectory, report, policy);

        System.out.println(completed ? "Processing completed." : "Processing stopped.");

        for (WarningEntry entry : report.getEntries()) {
            String typeName = warningTypeName(entry.type);
            System.out.println("[" + entry.stage + "] " + typeName + ": " + entry.description);
        }
    }

    private static boolean processPresentation(String inputPath, File dataDirectory, WarningReport report, WarningPolicy policy) {
        try {
            LoadOptions loadOptions = new LoadOptions();
            ReportingWarningCallback callback = new ReportingWarningCallback(OperationStage.Loading, report, policy);
            loadOptions.setWarningCallback(callback);

            Presentation presentation = new Presentation(inputPath, loadOptions);
            try {
                if (!renderFirstSlide(presentation, dataDirectory, report, policy)) {
                    return false;
                }

                if (!convertToPdf(presentation, dataDirectory, report, policy)) {
                    return false;
                }

                return saveValidatedCopy(presentation, dataDirectory, report, policy);
            }
            finally {
                presentation.dispose();
            }
        }
        catch (Exception exception) {
            System.err.println("Loading stopped: " + exception.getMessage());
            return false;
        }
    }

    private static boolean renderFirstSlide(Presentation presentation, File dataDirectory, WarningReport report, WarningPolicy policy) {
        if (presentation.getSlides().size() == 0) {
            System.err.println("Rendering stopped: the presentation has no slides.");
            return false;
        }

        try {
            RenderingOptions options = new RenderingOptions();
            ReportingWarningCallback callback = new ReportingWarningCallback(OperationStage.Rendering, report, policy);
            options.setWarningCallback(callback);

            IImage image = presentation.getSlides().get_Item(0).getImage(options);
            try {
                File outputFile = new File(dataDirectory, "slide-1.png");
                image.save(outputFile.getAbsolutePath(), ImageFormat.Png);
                return true;
            }
            finally {
                image.dispose();
            }
        }
        catch (Exception exception) {
            System.err.println("Rendering stopped: " + exception.getMessage());
            return false;
        }
    }

    private static boolean convertToPdf(Presentation presentation, File dataDirectory, WarningReport report, WarningPolicy policy) {
        try {
            PdfOptions options = new PdfOptions();
            ReportingWarningCallback callback = new ReportingWarningCallback(OperationStage.Conversion, report, policy);
            options.setWarningCallback(callback);

            File outputFile = new File(dataDirectory, "converted.pdf");
            presentation.save(outputFile.getAbsolutePath(), SaveFormat.Pdf, options);
            return true;
        }
        catch (Exception exception) {
            System.err.println("Conversion stopped: " + exception.getMessage());
            return false;
        }
    }

    private static boolean saveValidatedCopy(Presentation presentation, File dataDirectory, WarningReport report, WarningPolicy policy) {
        try {
            PptxOptions options = new PptxOptions();
            ReportingWarningCallback callback = new ReportingWarningCallback(OperationStage.Saving, report, policy);
            options.setWarningCallback(callback);

            File outputFile = new File(dataDirectory, "validated-output.pptx");
            presentation.save(outputFile.getAbsolutePath(), SaveFormat.Pptx, options);
            return true;
        }
        catch (Exception exception) {
            System.err.println("Saving stopped: " + exception.getMessage());
            return false;
        }
    }

    private static String warningTypeName(int warningType) {
        switch (warningType) {
            case WarningType.SourceFileCorruption:
                return "SourceFileCorruption";
            case WarningType.DataLoss:
                return "DataLoss";
            case WarningType.MajorFormattingLoss:
                return "MajorFormattingLoss";
            case WarningType.MinorFormattingLoss:
                return "MinorFormattingLoss";
            case WarningType.CompatibilityIssue:
                return "CompatibilityIssue";
            case WarningType.UnexpectedContent:
                return "UnexpectedContent";
            default:
                return "Unknown (" + warningType + ")";
        }
    }

    private enum OperationStage {
        Loading,
        Rendering,
        Conversion,
        Saving
    }

    private static final class WarningEntry {
        final OperationStage stage;
        final int type;
        final String description;

        WarningEntry(OperationStage stage, int type, String description) {
            this.stage = stage;
            this.type = type;
            this.description = description;
        }
    }

    private static final class WarningReport {
        private final List<WarningEntry> entries = new ArrayList<WarningEntry>();

        List<WarningEntry> getEntries() {
            return Collections.unmodifiableList(entries);
        }

        void add(OperationStage stage, IWarningInfo warning) {
            WarningEntry entry = new WarningEntry(stage, warning.getWarningType(), warning.getDescription());
            entries.add(entry);
        }
    }

    private static final class WarningPolicy {
        private final boolean abortOnMajorFormattingLoss;

        WarningPolicy(boolean abortOnMajorFormattingLoss) {
            this.abortOnMajorFormattingLoss = abortOnMajorFormattingLoss;
        }

        int getAction(int warningType) {
            if (warningType == WarningType.SourceFileCorruption || warningType == WarningType.DataLoss) {
                return ReturnAction.Abort;
            }

            if (warningType == WarningType.MajorFormattingLoss && abortOnMajorFormattingLoss) {
                return ReturnAction.Abort;
            }

            return ReturnAction.Continue;
        }
    }

    private static final class ReportingWarningCallback implements IWarningCallback {
        private final OperationStage stage;
        private final WarningReport report;
        private final WarningPolicy policy;

        ReportingWarningCallback(OperationStage stage, WarningReport report, WarningPolicy policy) {
            this.stage = stage;
            this.report = report;
            this.policy = policy;
        }

        @Override
        public int warning(IWarningInfo warning) {
            report.add(stage, warning);
            return policy.getAction(warning.getWarningType());
        }
    }
}

Περνάτε false για το abortOnMajorFormattingLoss κατά την κατασκευή του WarningPolicy εφόσον οι μεγάλες διαφορές μορφοποίησης είναι αποδεκτές. Τα ζητήματα συμβατότητας, η μικρή απώλεια μορφοποίησης και το μη αναμενόμενο περιεχόμενο παραμένουν στην αναφορά ακόμη και όταν η λειτουργία συνεχίζει. Επεκτείνετε το WarningPolicy.getAction εάν η εφαρμογή πρέπει να απορρίψει οποιαδήποτε από αυτές τις κατηγορίες.

Κοινά Σενάρια Προειδοποιήσεων

  • Digital signatures: Μία υπο signed παρουσίαση μπορεί να δημιουργήσει προειδοποίηση κατά τη φόρτωση ότι η υπογραφή της θα χαθεί κατά την επεξεργασία. Το Aspose.Slides αναφέρει αυτήν την κατάσταση DataLoss μέσω του IPresentationSignedWarningInfo. Ένα callback στο στάδιο φόρτωσης επιτρέπει στην εφαρμογή να απορρίψει το αρχείο ή να αποδεχθεί ρητά την αναφερόμενη απώλεια.
  • Font substitution: Μια μη διαθέσιμη γραμματοσειρά μπορεί να αντικατασταθεί ενώ μια διαφάνεια αποδίδεται ή εξάγεται. Οι προειδοποιήσεις αντικατάστασης γραμματοσειράς αναφέρονται ως DataLoss, έτσι η αυστηρή πολιτική παραπάνω ακυρώνει ακόμη και αν η εφαρμογή θεωρεί την αντικατάσταση οπτικά αποδεκτή. Για να παρατηρήσετε αυτή τη συμπεριφορά, χρησιμοποιήστε μια παρουσίαση εισόδου που περιέχει κείμενο σε γραμματοσειρά μη διαθέσιμη στο χρόνο εκτέλεσης. Η περιγραφή της προειδοποίησης προσδιορίζει την αντικατάσταση· ρυθμίστε τις απαιτούμενες γραμματοσειρές ή κανόνες αντικατάστασης γραμματοσειρών πριν επαναλάβετε.
  • Unsupported or unexpected content: Ένας φορτωτής μπορεί να συναντήσει εγγραφές παρουσίασης ή δυνατότητες που δεν αναγνωρίζει. Τέτοιες προειδοποιήσεις μπορεί να χρησιμοποιούν UnexpectedContent, ή πιο σοβαρή κατηγορία όταν γνωστοί είναι οι επηρεαζόμενοι δεδομένα ή μορφοποίηση.
  • Format compatibility: Η αποθήκευση σε άλλη μορφή παρουσίασης μπορεί να παραλείψει χαρακτηριστικά ή να δημιουργήσει αποτέλεσμα που συμπεριφέρεται διαφορετικά σε ορισμένες εφαρμογές. Για παράδειγμα, η αποθήκευση μιας παρουσίασης με περισσότερους από οκτώ οριζόντιους ή οκτώ κάθετους οδηγούς σχεδίασης σε κληρονομική PPT αναφέρει CompatibilityIssue. Το callback στο στάδιο αποθήκευσης μπορεί να καταγράψει την απώλεια και να συνεχίσει, ή να την απορρίψει εάν απαιτείται η διατήρηση όλων των οδηγών.
  • Loading behavior: Οι επιλογές φόρτωσης και οι κληρονομικές συμπεριφορές μπορούν επίσης να παράγουν προειδοποιήσεις. Για παράδειγμα, το IObsoletePresLockingBehaviorWarningInfo προσδιορίζει τη χρήση μιας ξεπερασμένης συμπεριφοράς κλειδώματος παρουσίασης ως CompatibilityIssue.

Οι προειδοποιήσεις εξαρτώνται από το έγγραφο πηγής, τη μορφή προορισμού, τη λειτουργία και την έκδοση του Aspose.Slides. Μην υποθέτετε ότι κάθε αρχείο παράγει προειδοποίηση ή ότι ένα σενάριο αντιστοιχεί πάντα σε μία μόνο κατηγορία.

Ασφαλής Διαχείριση Ακυρωμένων Λειτουργιών

Όταν ένα callback επιστρέφει ReturnAction.Abort, μην χρησιμοποιείτε ένα αντικείμενο που απέτυχε να φορτωθεί και μην υποθέτετε ότι το αποτέλεσμα από την απόδοση ή αποθήκευση είναι πλήρες. Η λειτουργία μπορεί να τερματιστεί μετά τη δημιουργία ενός αρχείου εξόδου αλλά πριν η διαδικασία ολοκληρωθεί.

Αποθηκεύστε τα επικυρωμένα αποτελέσματα σε ξεχωριστό μονοπάτι, όπως validated-output.pptx. Αντικαταστήστε μια υπάρχουσα παρουσίαση μόνο μετά την επιτυχή ολοκλήρωση της λειτουργίας, εφόσον η αναφορά προειδοποιήσεων ικανοποιεί την πολιτική της εφαρμογής και το αποτέλεσμα μπορεί να ανοιχτεί και να ελεγχθεί. Αυτό αποτρέπει την αντικατάσταση ενός έγκυρου αρχείου πηγής με μερικό ή απορριφθέν αποτέλεσμα.

Μια κενή αναφορά προειδοποιήσεων δεν αποτελεί εγγύηση ότι κάθε χαρακτηριστικό πηγής διατηρήθηκε. Εφαρμόστε τυχόν επιπλέον ελέγχους περιεχομένου και οπτικούς ελέγχους που απαιτούνται από την εφαρμογή. Δείτε επίσης Άνοιγμα Παρουσιάσεων και Αποθήκευση Παρουσιάσεων.

Συχνές Ερωτήσεις

Μπορεί ένα callback προειδοποίησης να διαχειριστεί κάθε σφάλμα του Aspose.Slides;

Όχι. Διαχειρίζεται μόνο τις ανακτήσιμες συνθήκες που αναφέρονται ως προειδοποιήσεις. Οι εξαιρέσεις που εμφανίζονται ανεξάρτητα από το callback πρέπει να αντιμετωπίζονται από την εφαρμογή γύρω από την κλήση φόρτωσης, απόδοσης, μετατροπής ή αποθήκευσης.

Εγγυάται η επιστροφή ReturnAction.Continue το ίδιο αποτέλεσμα;

Όχι. Επιτρέπει μόνο τη συνέχεια της επεξεργασίας. Η αναφερόμενη κατάσταση μπορεί ακόμη να προκαλέσει διαφορές σε δεδομένα, μορφοποίηση ή συμβατότητα, επομένως εξετάστε τους συλλεγμένους τύπους προειδοποιήσεων και περιγραφές.

Πώς μπορεί μια εφαρμογή να ταυτοποιήσει τη λειτουργία που παρήγαγε την προειδοποίηση;

Δημιουργήστε μια instance callback για κάθε λειτουργία και αποθηκεύστε ένα στάδιο που ορίζεται από την εφαρμογή μαζί με τις τιμές που επιστρέφονται από τα getWarningType και getDescription, όπως φαίνεται στο παράδειγμα.