Определение оригинального формата презентации в Java
Обзор
После загрузки презентации вызовите метод Presentation.getSourceFormat чтобы определить её оригинальный формат. Этот метод также доступен через IPresentation.getSourceFormat. Используйте его, когда последующая обработка зависит от формата, из которого была загружена текущая копия.
Исходный формат отличается от выбранного SaveFormat для выходного файла. Сохранение в другой формат не изменяет исходный формат существующего экземпляра.
Чтение исходного формата файла
Этот пример требует существующего файла sample.pptx. Он загружает файл и выбирает политику обработки приложения, используя Presentation.getSourceFormat, а не имя файла. Измените путь к входному файлу, чтобы попробовать другие форматы. Пример выводит выбранную политику; замените сообщения своей логикой приложения.
import com.aspose.slides.Presentation;
import com.aspose.slides.SourceFormat;
Presentation presentation = new Presentation("sample.pptx");
try {
switch (presentation.getSourceFormat()) {
case SourceFormat.Ppt:
case SourceFormat.Pps:
case SourceFormat.Pot:
System.out.println("Use the legacy PowerPoint processing policy.");
break;
case SourceFormat.Pptx:
System.out.println("Use the standard PPTX processing policy.");
break;
default:
System.out.println("Use the general policy for source format " + presentation.getSourceFormat() + ".");
break;
}
} finally {
presentation.dispose();
}
Распознавание поддерживаемых значений
Класс SourceFormat определяет целочисленные константы, отличающие следующие форматы презентаций. Ниже указанные расширения являются условными, а не восстановлением оригинального имени файла.
| Значение SourceFormat | Расширение | Формат |
|---|---|---|
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 принимает только поток.
import com.aspose.slides.Presentation;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
try {
byte[] bytes = Files.readAllBytes(Paths.get("sample.pps"));
try (ByteArrayInputStream stream = new ByteArrayInputStream(bytes)) {
Presentation presentation = new Presentation(stream);
try {
System.out.println("Source format: " + presentation.getSourceFormat());
} finally {
presentation.dispose();
}
}
} catch (IOException exception) {
System.err.println("Cannot read the presentation: " + exception.getMessage());
}
PPT, PPS и POT используют один и тот же базовый бинарный формат. При загрузке по пути к файлу расширение может помочь различить слайд-шоу или шаблон. Без имени файла содержимое старых форматов PPS и POT может быть определено как SourceFormat.Ppt; пример PPS выше выводит целочисленное значение SourceFormat.Ppt.
Если вашему приложению требуется сохранять различие, храните оригинальное имя файла или метаданные подтипа отдельно. Расширение является полезной подсказкой для этих старых подтипов, но не должно быть единственной основой для идентификации произвольного содержимого презентации.
Сравнение обнаружения до и после загрузки
Используйте PresentationFactory.getPresentationInfo и IPresentationInfo.getLoadFormat когда необходимо проанализировать файл до полной загрузки модели объектов презентации. Используйте Presentation.getSourceFormat когда экземпляр уже существует.
Этот пример требует sample.pptx и выводит целочисленные значения LoadFormat.Pptx и SourceFormat.Pptx соответственно. В продакшене выбирайте API, соответствующее вашему этапу обработки; уже загруженная презентация не нуждается во второй проверке только для получения её исходного формата.
import com.aspose.slides.Presentation;
import com.aspose.slides.IPresentationInfo;
import com.aspose.slides.PresentationFactory;
String path = "sample.pptx";
IPresentationInfo information = PresentationFactory.getInstance().getPresentationInfo(path);
System.out.println("Before loading: " + information.getLoadFormat());
Presentation presentation = new Presentation(path);
try {
System.out.println("After loading: " + presentation.getSourceFormat());
} finally {
presentation.dispose();
}
Результаты используют константы из разных классов: LoadFormat и SourceFormat. Не сравнивайте их числовые значения и не полагайтесь на то, что каждый формат имеет одинаковые результаты обнаружения. PowerPoint XML может быть определён как LoadFormat.Unknown до загрузки и как SourceFormat.Xml после загрузки.
Отдельное хранение исходного и выходного форматов
Этот пример требует sample.pptx и записывает converted.odp. Он выводит целочисленное значение SourceFormat.Pptx как до, так и после сохранения оригинального экземпляра. Только новый экземпляр, загруженный из выходного файла ODP, сообщает Odp.
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
Presentation presentation = new Presentation("sample.pptx");
try {
System.out.println("Before saving: " + presentation.getSourceFormat());
presentation.save("converted.odp", SaveFormat.Odp);
System.out.println("After saving: " + presentation.getSourceFormat());
Presentation reopened = new Presentation("converted.odp");
try {
System.out.println("Reopened output: " + reopened.getSourceFormat());
} finally {
reopened.dispose();
}
} finally {
presentation.dispose();
}
Презентация, созданная с нуля с помощью new Presentation(), сообщает SourceFormat.Pptx. У неё нет входного файла: это значение по умолчанию для вновь созданного экземпляра, а не доказательство того, что был загружен файл PPTX. Отслеживайте, создал ли ваш код экземпляр или загрузил его, если это различие имеет значение.
Отображение исходного формата в расширение
Следующий пример требует sample.pptx. Он отображает каждое в настоящее время поддерживаемое значение SourceFormat в условное расширение, без разбора имени входного файла. Запасной вариант предотвращает бесшумное присвоение расширения нераспознанному значению.
import com.aspose.slides.Presentation;
import com.aspose.slides.SourceFormat;
Presentation presentation = new Presentation("sample.pptx");
try {
String extension;
switch (presentation.getSourceFormat()) {
case SourceFormat.Ppt:
extension = ".ppt";
break;
case SourceFormat.Pptx:
extension = ".pptx";
break;
case SourceFormat.Pptm:
extension = ".pptm";
break;
case SourceFormat.Pps:
extension = ".pps";
break;
case SourceFormat.Ppsx:
extension = ".ppsx";
break;
case SourceFormat.Ppsm:
extension = ".ppsm";
break;
case SourceFormat.Pot:
extension = ".pot";
break;
case SourceFormat.Potx:
extension = ".potx";
break;
case SourceFormat.Potm:
extension = ".potm";
break;
case SourceFormat.Odp:
extension = ".odp";
break;
case SourceFormat.Otp:
extension = ".otp";
break;
case SourceFormat.Fodp:
extension = ".fodp";
break;
case SourceFormat.Xml:
extension = ".xml";
break;
default:
extension = null;
break;
}
System.out.println(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.
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
Presentation presentation = new Presentation();
try {
int[] formats = { SaveFormat.Pptx, SaveFormat.Odp, SaveFormat.Pps };
String[] extensions = { "pptx", "odp", "pps" };
for (int i = 0; i < formats.length; i++) {
String path = "roundtrip." + extensions[i];
presentation.save(path, formats[i]);
Presentation fromFile = new Presentation(path);
try {
byte[] bytes = Files.readAllBytes(Paths.get(path));
try (ByteArrayInputStream stream = new ByteArrayInputStream(bytes)) {
Presentation fromStream = new Presentation(stream);
try {
System.out.println(extensions[i] + ": file=" + fromFile.getSourceFormat() + ", stream=" + fromStream.getSourceFormat());
} finally {
fromStream.dispose();
}
}
} finally {
fromFile.dispose();
}
}
} catch (IOException exception) {
System.err.println("Cannot read a saved presentation: " + exception.getMessage());
} finally {
presentation.dispose();
}
Следующая таблица суммирует идентификацию исходного формата для презентаций с совпадающими расширениями. Имена обозначают константы; примеры на Java выводят их целочисленные значения:
| Сохранённый формат | 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 для безымянных потоков. Таблица описывает идентификацию форматов, а не сохранение всех особенностей презентации при конвертации.
FAQ
Изменяется ли исходный формат презентации, загруженной из PPTX, при сохранении в ODP?
Нет. Существующий экземпляр всё ещё сообщает Pptx. Экземпляр, загруженный из сохранённого файла ODP, сообщает Odp.
Всегда ли поток может различать наследуемую презентацию, слайд-шоу и шаблон?
Нет. PPT, PPS и POT используют один и тот же бинарный формат. Храните имя файла или метаданные подтипа отдельно, когда требуется различие.
Какой API использовать, если презентация уже загружена?
Читайте Presentation.getSourceFormat. Для проверки до загрузки используйте PresentationFactory.getPresentationInfo.