Определить исходный формат презентации в Node.js

Обзор

После загрузки презентации вызовите метод Presentation.getSourceFormat, чтобы определить её исходный формат. Используйте его, когда дальнейшая обработка зависит от формата, из которого был загружен текущий экземпляр.

Исходный формат отличается от SaveFormat выбранного для выходного файла. Сохранение в другой формат не изменяет исходный формат существующего экземпляра.

Чтение исходного формата файла

Для этого примера требуется существующий файл sample.pptx. Он загружает файл и выбирает политику обработки приложения, используя Presentation.getSourceFormat, а не имя файла. Измените путь входного файла, чтобы попробовать другие форматы. Пример выводит выбранную политику; замените сообщения своей логикой приложения.

const aspose = require("aspose.slides.via.java");

const presentation = new aspose.Presentation("sample.pptx");
try {
    switch (presentation.getSourceFormat()) {
        case aspose.SourceFormat.Ppt:
        case aspose.SourceFormat.Pps:
        case aspose.SourceFormat.Pot:
            console.log("Use the legacy PowerPoint processing policy.");
            break;
        case aspose.SourceFormat.Pptx:
            console.log("Use the standard PPTX processing policy.");
            break;
        default:
            console.log("Use the general policy for source format " + presentation.getSourceFormat() + ".");
            break;
    }
} finally {
    presentation.dispose();
}

Определение поддерживаемых значений

Класс SourceFormat определяет целочисленные константы, которые различают следующие форматы презентаций. Приведённые ниже расширения являются общепринятыми, а не восстановлением оригинального имени файла.

SourceFormat value Extension Format
Ppt .ppt Презентация PowerPoint 97–2003
Pptx .pptx Презентация Office Open XML
Pptm .pptm Презентация Office Open XML с макросами
Pps .pps Слайд-шоу PowerPoint 97–2003
Ppsx .ppsx Слайд-шоу Office Open XML
Ppsm .ppsm Слайд-шоу Office Open XML с макросами
Pot .pot Шаблон PowerPoint 97–2003
Potx .potx Шаблон Office Open XML
Potm .potm Шаблон Office Open XML с макросами
Odp .odp Презентация OpenDocument
Otp .otp Шаблон презентации OpenDocument
Fodp .fodp Презентация Flat XML ODF
Xml .xml Презентация PowerPoint XML

Чтение исходного формата из потока

Для этого примера требуется существующий файл sample.pps. Чтение его байтов в поток памяти имитирует ввод, полученный без имени файла, например, значение из базы данных или загруженный массив байтов. Конструктор Presentation принимает только поток.

const aspose = require("aspose.slides.via.java");
const java = require("java");
const fs = require("fs");

const buffer = fs.readFileSync("sample.pps");
const bytes = java.newArray("byte", Array.from(buffer));
const stream = java.newInstanceSync("java.io.ByteArrayInputStream", bytes);
try {
    const presentation = new aspose.Presentation(stream);
    try {
        console.log("Source format: " + presentation.getSourceFormat());
    } finally {
        presentation.dispose();
    }
} finally {
    stream.close();
}

PPT, PPS и POT используют один и тот же базовый бинарный формат. При загрузке по пути к файлу расширение может помочь различить слайд-шоу или шаблон. Без имени файла древнее содержимое PPS и POT может быть определено как SourceFormat.Ppt; пример PPS выше выводит целочисленное значение SourceFormat.Ppt.

Если вашему приложению необходимо сохранять различие, храните оригинальное имя файла или метаданные подтипа отдельно. Расширение может служить полезной подсказкой для этих устаревших подтипов, но не должно быть единственной основой для определения произвольного содержимого презентации.

Сравнение обнаружения до и после загрузки

Используйте PresentationFactory.getPresentationInfo и PresentationInfo.getLoadFormat, когда необходимо проанализировать файл до загрузки полной модели объектов презентации. Используйте Presentation.getSourceFormat, когда экземпляр уже существует.

Для этого примера требуется sample.pptx; он выводит целочисленные значения LoadFormat.Pptx и SourceFormat.Pptx соответственно. В продакшн‑среде выбирайте API, соответствующее вашему этапу обработки; уже загруженная презентация не требует повторной проверки только для получения её исходного формата.

const aspose = require("aspose.slides.via.java");

const path = "sample.pptx";
const information = aspose.PresentationFactory.getInstance().getPresentationInfo(path);
console.log("Before loading: " + information.getLoadFormat());

const presentation = new aspose.Presentation(path);
try {
    console.log("After loading: " + presentation.getSourceFormat());
} finally {
    presentation.dispose();
}

Результаты используют константы из разных классов: LoadFormat и SourceFormat. Не сравнивайте их числовые значения и не предполагайте, что каждый формат имеет одинаковые результаты обнаружения. PowerPoint XML может быть определён как LoadFormat.Unknown до загрузки и как SourceFormat.Xml после загрузки.

Разделение исходного и выходного форматов

Для этого примера требуется sample.pptx и создаётся файл converted.odp. Он выводит целочисленное значение SourceFormat.Pptx как до, так и после сохранения исходного экземпляра. Только новый экземпляр, загруженный из ODP‑вывода, сообщает Odp.

const aspose = require("aspose.slides.via.java");

const presentation = new aspose.Presentation("sample.pptx");
try {
    console.log("Before saving: " + presentation.getSourceFormat());

    presentation.save("converted.odp", aspose.SaveFormat.Odp);
    console.log("After saving: " + presentation.getSourceFormat());

    const reopened = new aspose.Presentation("converted.odp");
    try {
        console.log("Reopened output: " + reopened.getSourceFormat());
    } finally {
        reopened.dispose();
    }
} finally {
    presentation.dispose();
}

Презентация, созданная с нуля via new Presentation(), сообщает SourceFormat.Pptx. У неё нет входного файла: это значение по умолчанию для только что созданного экземпляра, а не свидетельство того, что был загружен файл PPTX. При необходимости различать создание и загрузку отслеживайте этот факт отдельно в приложении.

Отображение исходного формата в расширение

Следующий пример требует sample.pptx. Он сопоставляет каждое из текущих поддерживаемых значений SourceFormat с обычным расширением без разбора имени входного файла. Запасной вариант предотвращает бесшумное присваивание расширения нераспознанному значению.

const aspose = require("aspose.slides.via.java");

const presentation = new aspose.Presentation("sample.pptx");
try {
    let extension;
    switch (presentation.getSourceFormat()) {
        case aspose.SourceFormat.Ppt:
            extension = ".ppt";
            break;
        case aspose.SourceFormat.Pptx:
            extension = ".pptx";
            break;
        case aspose.SourceFormat.Pptm:
            extension = ".pptm";
            break;
        case aspose.SourceFormat.Pps:
            extension = ".pps";
            break;
        case aspose.SourceFormat.Ppsx:
            extension = ".ppsx";
            break;
        case aspose.SourceFormat.Ppsm:
            extension = ".ppsm";
            break;
        case aspose.SourceFormat.Pot:
            extension = ".pot";
            break;
        case aspose.SourceFormat.Potx:
            extension = ".potx";
            break;
        case aspose.SourceFormat.Potm:
            extension = ".potm";
            break;
        case aspose.SourceFormat.Odp:
            extension = ".odp";
            break;
        case aspose.SourceFormat.Otp:
            extension = ".otp";
            break;
        case aspose.SourceFormat.Fodp:
            extension = ".fodp";
            break;
        case aspose.SourceFormat.Xml:
            extension = ".xml";
            break;
        default:
            extension = null;
            break;
    }

    console.log(extension != null ? extension : "No extension mapping is available.");
} finally {
    presentation.dispose();
}

Это сопоставление не преобразует файл и не восстанавливает устаревший подтип PPS/POT, утерянный при загрузке из потока. Для реального сохранения явно выбирайте SaveFormat либо используйте конвертацию, показанную в разделе Save Presentations in Their Original Format.

Проверка форматов сохранением и повторным открытием

Этот автономный пример создаёт презентацию и записывает три файла в рабочий каталог, перезаписывая файлы с теми же именами. Он повторно открывает каждый вывод как по пути, так и через поток памяти. Для PPTX и ODP оба способа сообщают сохранённый формат. Для PPS загрузка по пути сообщает Pps, а загрузка тех же байтов без имени файла — Ppt.

const aspose = require("aspose.slides.via.java");
const java = require("java");
const fs = require("fs");

const presentation = new aspose.Presentation();
try {
    const formats = [aspose.SaveFormat.Pptx, aspose.SaveFormat.Odp, aspose.SaveFormat.Pps];
    const extensions = ["pptx", "odp", "pps"];

    for (let i = 0; i < formats.length; i++) {
        const path = "roundtrip." + extensions[i];
        presentation.save(path, formats[i]);

        const fromFile = new aspose.Presentation(path);
        try {
            const buffer = fs.readFileSync(path);
            const bytes = java.newArray("byte", Array.from(buffer));
            const stream = java.newInstanceSync("java.io.ByteArrayInputStream", bytes);
            try {
                const fromStream = new aspose.Presentation(stream);
                try {
                    console.log(extensions[i] + ": file=" + fromFile.getSourceFormat() + ", stream=" + fromStream.getSourceFormat());
                } finally {
                    fromStream.dispose();
                }
            } finally {
                stream.close();
            }
        } finally {
            fromFile.dispose();
        }
    }
} finally {
    presentation.dispose();
}

В следующей таблице суммировано определение исходного формата для презентаций с совпадающими расширениями. Имена обозначают константы; примеры JavaScript выводят их целочисленные значения:

Сохранённый формат SourceFormat по пути к файлу SourceFormat из безымянного потока
PPT Ppt Ppt
PPTX, PPTM Pptx, Pptm соответственно То же, что и путь к файлу
PPS Pps Ppt
PPSX, PPSM Ppsx, Ppsm соответственно То же, что и путь к файлу
POT Pot Ppt
POTX, POTM Potx, Potm соответственно То же, что и путь к файлу
ODP, OTP Odp, Otp соответственно То же, что и путь к файлу
FODP Fodp Fodp
PowerPoint XML Xml Xml

Содержимое PPS/POT определяется как Ppt для безымянных потоков. Таблица описывает определение формата, а не сохранение всех характеристик презентации при конвертации.

Вопросы и ответы

Сохраняет ли сохранение в ODP изменение исходного формата презентации, загруженной из PPTX?

Нет. Существующий экземпляр по‑прежнему сообщает Pptx. Экземпляр, загруженный из сохранённого файла ODP, сообщает Odp.

Может ли поток всегда различать устаревшую презентацию, слайд‑шоу и шаблон?

Нет. PPT, PPS и POT используют один и тот же бинарный формат. Храните имя файла или метаданные подтипа отдельно, если требуется различие.

Какой API следует использовать, если презентация уже загружена?

Вызовите Presentation.getSourceFormat. Используйте PresentationFactory.getPresentationInfo для проверки перед загрузкой.