Μετατροπή παρουσιάσεων PowerPoint σε Markdown με Python μέσω Java

Επισκόπηση

Το Aspose.Slides for Python via Java μπορεί να μετατρέπει παρουσιάσεις PPT και PPTX σε Markdown για τεκμηρίωση, στατικές τοποθεσίες, μεταφορά περιεχομένου και διαδικασίες ελέγχου εκδόσεων. Μπορείτε να επιλέξετε μια γεύση Markdown, να ελέγξετε πώς αποδίδεται το περιεχόμενο των διαφανειών και να αποφασίσετε πού αποθηκεύονται οι εξαγόμενες εικόνες και πώς οι παραγόμενες αναφορές Markdown τις αναφέρονται.

Από προεπιλογή, η εξαγωγή σε Markdown χρησιμοποιεί μόνο κείμενο. Για να εξάγετε οπτικό περιεχόμενο, ορίστε τον τύπο εξαγωγής με τη μέθοδο MarkdownSaveOptions.setExportType στο Sequential ή Visual τιμή από την απαρίθμηση MarkdownExportType. Το Sequential αποδίδει τα στοιχεία της διαφάνειας ξεχωριστά και με τη σειρά, ενώ το Visual διατηρεί τα ομαδοποιημένα στοιχεία μαζί για να διατηρήσει τη οπτική σχέση τους. Η τιμή TextOnly δεν εκδίδει πόρους εικόνων, επομένως οι callbacks αποθήκευσης εικόνας δεν καλούνται σε αυτή τη λειτουργία.

Μετατροπή Παρουσίασης σε Markdown

Φορτώστε το πηγαίο αρχείο με την κλάση Presentation και, στη συνέχεια, καλέστε τη μέθοδο Presentation.save με την τιμή Md από την απαρίθμηση SaveFormat.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    presentation.save("presentation.md", SaveFormat.Md)
finally:
    presentation.dispose()

Κάθε παράδειγμα διαβάζει το presentation.pptx από τον τρέχοντα φάκελο εργασίας. Εγκαταστήστε το Aspose.Slides for Python via Java και ένα συμβατό περιβάλλον εκτέλεσης Java πριν τρέξετε τα παραδείγματα. Ξεκινήστε το JVM μία φορά ανά διεργασία Python.

Επιλογή Γεύσης Markdown

Η μέθοδος MarkdownSaveOptions.setFlavor ελέγχει την προδιαγραφή Markdown που χρησιμοποιείται για την παραγωγή. Η απαρίθμηση Flavor περιλαμβάνει CommonMark, GitHub Flavored Markdown και άλλες υποστηριζόμενες παραλλαγές.

Το παρακάτω παράδειγμα εξάγει μια παρουσίαση ως CommonMark:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Flavor, MarkdownSaveOptions, Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    options = MarkdownSaveOptions()
    options.setFlavor(Flavor.CommonMark)

    presentation.save("presentation.md", SaveFormat.Md, options)
finally:
    presentation.dispose()

Εξαγωγή Εικόνων Χρησιμοποιώντας τη Προεπιλεγμένη Συμπεριφορά Τοπικής Αποθήκευσης

Η κλάση MarkdownSaveOptions παρέχει δύο μεθόδους για τη διαμόρφωση τοπικά αποθηκευμένων εικόνων:

  • setBasePath καθορίζει τον βασικό κατάλογο για το έγγραφο Markdown και τους πόρους του.
  • setImagesSaveFolderName καθορίζει τον υποκατάλογο εικόνων. Η προεπιλεγμένη τιμή του είναι Images.

Το παρακάτω παράδειγμα αποδίδει οπτικό περιεχόμενο, γράφει εικόνες στο output/assets και δημιουργεί σχετικές αναφορές εικόνων στο έγγραφο Markdown:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from pathlib import Path
from asposeslides.api import MarkdownExportType, MarkdownSaveOptions, Presentation, SaveFormat

output_directory = Path("output")
output_directory.mkdir(parents=True, exist_ok=True)

presentation = Presentation("presentation.pptx")
try:
    options = MarkdownSaveOptions()
    options.setExportType(MarkdownExportType.Visual)
    options.setBasePath(str(output_directory))
    options.setImagesSaveFolderName("assets")

    markdown_path = output_directory / "presentation.md"
    presentation.save(str(markdown_path), SaveFormat.Md, options)
finally:
    presentation.dispose()

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

Προσαρμογή Αποθήκευσης Εικόνας και Συνδέσμων Markdown

Χρησιμοποιήστε τη μέθοδο MarkdownSaveOptions.setImageSaving για να καταχωρίσετε μια callback για μη‑SVG bitmap και μεταφαίρεση πόρων που εκδίδονται κατά την εξαγωγή σε Markdown. Η callback MarkdownImageSavingHandler λαμβάνει το αντικείμενο εικόνας, την τιμή του ImageFormat και τον παραγόμενο σύνδεσμο Markdown ως παράμετρο String[] με ένα στοιχείο. Αποθηκεύστε ή ανεβάστε την εικόνα με τη δοθείσα μορφή και αντικαταστήστε το link[0] με τη διεύθυνση που πρέπει να εμφανιστεί στην έξοδο Markdown.

Οι πόροι που εκδίδονται σε μορφή SVG επεξεργάζονται ξεχωριστά. Καταχωρίστε μια callback με τη μέθοδο MarkdownSaveOptions.setSvgImageSaving. Η callback MarkdownSvgImageSavingHandler λαμβάνει ένα αντικείμενο SvgImage και την παράμετρο String[] link με ένα στοιχείο. Ένα SVG δεν έχει όρισμα ImageFormat; γράψτε ή ανεβάστε τα δεδομένα XML του από τη μέθοδο SvgImage.getSvgData. Ανάλογα με τη λειτουργία εξαγωγής και την οπτική ομαδοποίηση, ένα SVG στην πηγαία παρουσίαση μπορεί να μετατραπεί σε raster ή να συνδυαστεί με άλλο περιεχόμενο· ο παραγόμενος μη‑SVG πόρος τότε περνιέται στην callback αποθήκευσης εικόνας. Καταχωρίστε και τις δύο callbacks όταν κάθε εξαγόμενο οπτικό πόρο απαιτεί προσαρμοσμένη επεξεργασία.

Η τιμή επιστροφής της callback καθορίζει ποιος επεξεργάζεται την εικόνα:

  • Επιστρέψτε True αφού η callback έχει αποθηκεύσει, ανεβάσει, μετασχηματίσει ή με άλλο τρόπο επεξεργαστεί την εικόνα και έχει ορίσει μια έγκυρη τιμή στο link[0]. Το Aspose.Slides γράφει αυτήν την τιμή στο έγγραφο Markdown και δεν εκτελεί την προεπιλεγμένη τοπική αποθήκευση.
  • Επιστρέψτε False ώστε το Aspose.Slides να αποθηκεύσει την εικόνα τοπικά και να δημιουργήσει τον σύνδεσμο σύμφωνα με τις τιμές που ορίστηκαν με MarkdownSaveOptions.setBasePath και MarkdownSaveOptions.setImagesSaveFolderName.

Σε Python, καταχωρίστε αυτές τις callbacks με το jpype.JProxy, υλοποιώντας τη διεπαφή Java callback μέσω της μεθόδου invoke. Το όρισμα link είναι ένας μεταβλητός πίνακας συμβολοσειρών Java: μετατρέψτε το link[0] σε συμβολοσειρά Python πριν το επεξεργαστείτε, έπειτα εκχωρήστε τη νέα URL πίσω στο link[0].

Αποθήκευση Εικόνων σε Κατάλογο Προέλευσης CDN και Χρήση Εξωτερικών URL

Το παρακάτω παράδειγμα θεωρεί το cdn-origin/presentations/quarterly-report ως προσαρτημένο ή συγχρονισμένο κατάλογο προέλευσης CDN. Κάθε handler εξάγει το όνομα αρχείου, αποθηκεύει την εικόνα σε αυτόν τον προσαρμοσμένο κατάλογο και αντικαθιστά την παραγόμενη τοπική αναφορά με μια δημόσια URL CDN. Το παράδειγμα δεν εκτελεί καμία μεταφόρτωση δικτύου: η URL γίνεται έγκυρη μόνο αφού ο κατάλογος προσαρτηθεί ως προέλευση CDN ή τα αρχεία του δημοσιευτούν στο CDN. Για αποθήκευση αντικειμένων, αντικαταστήστε το γράψιμο στο σύστημα αρχείων με τη λειτουργία ανεβάσματος του SDK αποθήκευσης και εκχωρήστε το link[0] μόνο μετά την επιτυχή μεταφόρτωση.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from pathlib import Path
from urllib.parse import quote
from asposeslides.api import MarkdownExportType, MarkdownSaveOptions, Presentation, SaveFormat

output_directory = Path("output")
public_base_url = "https://cdn.example.com/presentations/quarterly-report"
storage_directory = Path("cdn-origin", "presentations", "quarterly-report")
output_directory.mkdir(parents=True, exist_ok=True)
storage_directory.mkdir(parents=True, exist_ok=True)

def get_file_name(generated_link):
    normalized_link = str(generated_link).replace("\\", "/")
    return normalized_link.rsplit("/", 1)[-1]

def save_image(image, image_format, link):
    if image.getWidth() < 128 or image.getHeight() < 128:
        return False

    file_name = get_file_name(link[0])
    storage_path = storage_directory / file_name
    image.save(str(storage_path), image_format)
    encoded_file_name = quote(file_name, safe="")
    link[0] = public_base_url + "/" + encoded_file_name
    return True

def save_svg(svg_image, link):
    file_name = get_file_name(link[0])
    storage_path = storage_directory / file_name
    svg_data = svg_image.getSvgData()
    try:
        storage_path.write_bytes(bytes(svg_data))
    except OSError as error:
        print(f"Could not save the SVG image: {error}")
        return False

    encoded_file_name = quote(file_name, safe="")
    link[0] = public_base_url + "/" + encoded_file_name
    return True

image_handler = jpype.JProxy("com.aspose.slides.MarkdownSaveOptions$MarkdownImageSavingHandler", dict(invoke=save_image))
svg_handler = jpype.JProxy("com.aspose.slides.MarkdownSaveOptions$MarkdownSvgImageSavingHandler", dict(invoke=save_svg))

presentation = Presentation("presentation.pptx")
try:
    options = MarkdownSaveOptions()
    options.setExportType(MarkdownExportType.Visual)
    options.setBasePath(str(output_directory))
    options.setImagesSaveFolderName("fallback-images")
    options.setImageSaving(image_handler)
    options.setSvgImageSaving(svg_handler)

    markdown_path = output_directory / "presentation.md"
    presentation.save(str(markdown_path), SaveFormat.Md, options)
finally:
    presentation.dispose()

Ο bitmap handler επιστρέφει σκόπιμα False για εικόνες μικρότερες από 128 × 128 εικονοστοιχεία, έτσι το Aspose.Slides αποθηκεύει αυτές τις εικόνες στο output/fallback-images χρησιμοποιώντας τη προεπιλεγμένη συμπεριφορά. Μεγαλύτεροι bitmap και πόροι metafile, καθώς και πόροι SVG, επεξεργάζονται από τον προσαρμοσμένο κώδικα. Για παράδειγμα, μια παραγόμενη τοπική αναφορά όπως fallback-images/image1.png γίνεται https://cdn.example.com/presentations/quarterly-report/image1.png. Οι handlers χρησιμοποιούν διαδρομές λειτουργικού συστήματος μόνο κατά τη γραφή αρχείων· οι σύνδεσμοι που γράφονται σε Markdown χρησιμοποιούν κάθετους (forward) παύλες και ονόματα αρχείων κωδικοποιημένα σε URL. Εφαρμόστε τον ίδιο κανόνα όταν δημιουργείτε σχετικούς συνδέσμους: χρησιμοποιήστε /, όχι το διαχωριστικό καταλόγου ειδικό για την πλατφόρμα.

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

Μπορεί ένας handler να επεξεργαστεί τόσο raster εικόνες όσο και SVG εικόνες;

Όχι. Χρησιμοποιήστε το MarkdownSaveOptions.setImageSaving για bitmap και metafile πόρους και το MarkdownSaveOptions.setSvgImageSaving για πόρους που εκδίδονται ως SVG. Το πρώτο παρέχει αντικείμενο εικόνας και τιμή ImageFormat, το δεύτερο αντικείμενο SvgImage του οποίου τα δεδομένα SVG μπορούν να διαβαστούν με το SvgImage.getSvgData. Ένα SVG που rasterizeται κατά την εξαγωγή επεξεργάζεται από το callback αποθήκευσης εικόνας.

Τι συμβαίνει όταν ένα image‑saving handler επιστρέφει False;

Το Aspose.Slides χρησιμοποιεί τη προεπιλεγμένη συμπεριφορά τοπικής αποθήκευσης. Η θέση της εικόνας και η παραγόμενη αναφορά ελέγχονται από τις τιμές που ορίστηκαν με MarkdownSaveOptions.setBasePath και MarkdownSaveOptions.setImagesSaveFolderName.

Μπορεί ένας handler να παρέχει URL χωρίς να αποθηκεύσει την εικόνα τοπικά;

Ναι. Ο handler μπορεί να ανεβάσει την εικόνα σε αποθηκευτικό αντικείμενο ή να τη δώσει σε άλλη υπηρεσία, να εκχωρήσει το προκύπτο URL στο link[0] και να επιστρέψει True. Ο handler πρέπει να ολοκληρώνει την επεξεργασία μόνος του· η επιστροφή True εμποδίζει την προεπιλεγμένη τοπική αποθήκευση.

Γιατί η εξαγωγή Markdown ρίχνει InvalidOperationException από έναν handler;

Αυτή η εξαίρεση εμφανίζεται όταν ο handler επιστρέφει True χωρίς να παρέχει μια έγκυρη διεύθυνση. Εκχωρήστε τη σχετική διαδρομή ή το εξωτερικό URL που πρέπει να γραφτεί στο Markdown πριν επιστρέψετε True.

Ποιο διαχωριστικό διαδρομής πρέπει να χρησιμοποιούν οι σύνδεσμοι εικόνων;

Χρησιμοποιήστε forward slashes (/) σε συνδέσμους Markdown και URLs. Χρησιμοποιήστε pathlib.Path μόνο για διαδρομές συστήματος αρχείων, και στη συνέχεια δημιουργήστε ή κανονικοποιήστε την αναφορά Markdown ξεχωριστά.

Διατηρούνται οι υπερσύνδεσμοι κατά την εξαγωγή σε Markdown;

Ναι. Τα κείμενα hyperlinks διατηρούνται ως κανονικοί σύνδεσμοι Markdown. Οι transitions και οι animations των διαφανειών δεν μετατρέπονται.

Μπορούν οι παρουσιάσεις να μετατραπούν σε Markdown παράλληλα;

Μπορείτε να επεξεργάζεστε διαφορετικά αρχεία παρουσίασης παράλληλα, αλλά μην μοιράζεστε το ίδιο αντικείμενο Presentation μεταξύ νημάτων. Ακολουθήστε τις multithreading guidelines και χρησιμοποιήστε ξεχωριστό instance για κάθε αρχείο.