Определить исходный формат презентации в Python через Java
Обзор
После загрузки презентации вызовите метод Presentation.getSourceFormat, чтобы определить её исходный формат. Используйте его, когда последующая обработка зависит от формата, из которого была загружена текущая копия.
Исходный формат отличается от выбранного для выходного файла SaveFormat. Сохранение в другой формат не изменяет исходный формат уже существующего экземпляра.
Для примеров требуется Aspose.Slides for Python via Java и совместимая среда выполнения Java. Каждый пример запускает JVM, если она ещё не запущена.
Чтение исходного формата файла
Этот пример требует существующего файла sample.pptx. Он загружает файл и выбирает политику обработки приложения, используя Presentation.getSourceFormat, а не имя файла. Измените путь входного файла, чтобы протестировать другие форматы. Пример выводит выбранную политику; замените сообщения своей логикой приложения.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SourceFormat
presentation = Presentation("sample.pptx")
try:
source_format = presentation.getSourceFormat()
if source_format in (SourceFormat.Ppt, SourceFormat.Pps, SourceFormat.Pot):
print("Use the legacy PowerPoint processing policy.")
elif source_format == SourceFormat.Pptx:
print("Use the standard PPTX processing policy.")
else:
print(f"Use the general policy for source format {source_format}.")
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 |
Плоская XML‑ODF презентация |
Xml |
.xml |
Презентация PowerPoint XML |
Чтение исходного формата из потока
Этот пример требует существующего файла sample.pps. Чтение его байтов в поток памяти моделирует ввод без имени файла, например значение из базы данных или загруженный массив байтов. Конструктор Presentation получает только поток. Python считывает байты файла, а JPype преобразует их в массив Java‑байтов для Java‑потока памяти.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from pathlib import Path
from asposeslides.api import Presentation
try:
data = Path("sample.pps").read_bytes()
java_bytes = jpype.JArray(jpype.JByte)(data)
stream = jpype.JClass("java.io.ByteArrayInputStream")(java_bytes)
try:
presentation = Presentation(stream)
try:
print(f"Source format: {presentation.getSourceFormat()}")
finally:
presentation.dispose()
finally:
stream.close()
except OSError as exception:
print(f"Cannot read the presentation: {exception}")
PPT, PPS и POT используют один и тот же базовый бинарный формат. При загрузке по пути к файлу расширение может помочь различить слайд‑шоу или шаблон. Без имени файла наследуемый контент PPS и POT может быть определён как SourceFormat.Ppt; пример PPS выше выводит целочисленное значение SourceFormat.Ppt.
Если приложению необходимо сохранять различие, храните оригинальное имя файла или метаданные подтипа отдельно. Расширение служит полезной подсказкой для этих наследуемых подтипов, но не должно быть единственной основой для идентификации произвольного содержимого презентации.
Сравнение определения до и после загрузки
Используйте PresentationFactory.getPresentationInfo и PresentationInfo.getLoadFormat, когда необходимо проанализировать файл до полной загрузки его модели объектов. Используйте Presentation.getSourceFormat, если экземпляр уже существует.
Этот пример требует sample.pptx и выводит целочисленные значения LoadFormat.Pptx и SourceFormat.Pptx соответственно. На продакшене выбирайте API, соответствующее вашему этапу обработки; уже загруженная презентация не нуждается во второй проверке только для получения её исходного формата.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, PresentationFactory
path = "sample.pptx"
information = PresentationFactory.getInstance().getPresentationInfo(path)
print(f"Before loading: {information.getLoadFormat()}")
presentation = Presentation(path)
try:
print(f"After loading: {presentation.getSourceFormat()}")
finally:
presentation.dispose()
Результаты используют константы из разных классов: LoadFormat и SourceFormat. Не сравнивайте их числовые значения и не предполагаете, что каждый формат имеет одинаковые результаты обнаружения. PowerPoint XML может быть определён как LoadFormat.Unknown до загрузки и как SourceFormat.Xml после загрузки.
Разделение исходного и целевого форматов
Этот пример требует sample.pptx и записывает converted.odp. Он выводит целочисленное значение SourceFormat.Pptx как до, так и после сохранения исходного экземпляра. Только новый экземпляр, загруженный из ODP‑вывода, сообщает Odp.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation("sample.pptx")
try:
print(f"Before saving: {presentation.getSourceFormat()}")
presentation.save("converted.odp", SaveFormat.Odp)
print(f"After saving: {presentation.getSourceFormat()}")
reopened = Presentation("converted.odp")
try:
print(f"Reopened output: {reopened.getSourceFormat()}")
finally:
reopened.dispose()
finally:
presentation.dispose()
Презентация, созданная с нуля с помощью Presentation(), сообщает SourceFormat.Pptx. У неё нет входного файла: это значение по умолчанию для нового экземпляра, а не доказательство того, что был загружен файл PPTX. Отслеживайте, создал ли ваш код экземпляр или загрузил его, если это различие имеет значение.
Отображение исходного формата в расширение
Следующий пример требует sample.pptx. Он сопоставляет каждый поддерживаемый в настоящее время значение SourceFormat с условным расширением, не разбирая имя входного файла. При отсутствии соответствия используется резервный вариант, избегающий тихого назначения расширения неизвестному значению.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SourceFormat
extensions = {
SourceFormat.Ppt: ".ppt",
SourceFormat.Pptx: ".pptx",
SourceFormat.Pptm: ".pptm",
SourceFormat.Pps: ".pps",
SourceFormat.Ppsx: ".ppsx",
SourceFormat.Ppsm: ".ppsm",
SourceFormat.Pot: ".pot",
SourceFormat.Potx: ".potx",
SourceFormat.Potm: ".potm",
SourceFormat.Odp: ".odp",
SourceFormat.Otp: ".otp",
SourceFormat.Fodp: ".fodp",
SourceFormat.Xml: ".xml",
}
presentation = Presentation("sample.pptx")
try:
extension = extensions.get(presentation.getSourceFormat())
print(extension if extension is not None else "No extension mapping is available.")
finally:
presentation.dispose()
Это сопоставление не конвертирует файл и не восстанавливает наследуемый подтип PPS/POT, потерянный при загрузке из потока. Для реального сохранения явно указывайте SaveFormat или используйте конверсию, показанную в разделе Save Presentations in Their Original Format.
Проверка форматов путем сохранения и повторного открытия
Этот автономный пример создает презентацию и записывает три файла в рабочий каталог, перезаписывая файлы с теми же именами. Он повторно открывает каждый вывод как по пути, так и через поток памяти. Для PPTX и ODP оба пути сообщают сохранённый формат. Для PPS загрузка по пути сообщает Pps, тогда как загрузка тех же байтов без имени файла сообщает Ppt.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from pathlib import Path
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation()
try:
formats = [
(SaveFormat.Pptx, "pptx"),
(SaveFormat.Odp, "odp"),
(SaveFormat.Pps, "pps"),
]
for save_format, extension in formats:
path = f"roundtrip.{extension}"
presentation.save(path, save_format)
from_file = Presentation(path)
try:
data = Path(path).read_bytes()
java_bytes = jpype.JArray(jpype.JByte)(data)
stream = jpype.JClass("java.io.ByteArrayInputStream")(java_bytes)
try:
from_stream = Presentation(stream)
try:
print(f"{extension}: file={from_file.getSourceFormat()}, stream={from_stream.getSourceFormat()}")
finally:
from_stream.dispose()
finally:
stream.close()
finally:
from_file.dispose()
except OSError as exception:
print(f"Cannot read a saved presentation: {exception}")
finally:
presentation.dispose()
В таблице ниже суммированы результаты определения исходного формата для презентаций с совпадающими расширениями. Имена обозначают константы; примеры Python выводят их целочисленные значения:
| Сохранённый формат | 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
Изменит ли сохранение в ODP исходный формат презентации, загруженной из PPTX?
Нет. Существующий экземпляр по‑прежнему сообщает Pptx. Экземпляр, загруженный из сохранённого ODP‑файла, сообщает Odp.
Всегда ли поток может различать наследуемую презентацию, слайд‑шоу и шаблон?
Нет. PPT, PPS и POT используют один и тот же бинарный формат. Храните имя файла или метаданные подтипа отдельно, если требуется различие.
Какой API использовать, если презентация уже загружена?
Читайте Presentation.getSourceFormat. Для предварительной инспекции используйте PresentationFactory.getPresentationInfo.