Как определить файл ODF?

Мне нужно иметь возможность определить, что данный файл является файлом ODF, основываясь на содержимом файла, а не на расширении файла.

Файлы ODF на самом деле представляют собой набор XML-файлов в zip-контейнере, а это означает, что я не могу использовать магический номер файла, поскольку он просто указывает, что это zip-файл.

Итак, я действительно спрашиваю, есть ли какие-либо файлы, которые обязательны для присутствия в контейнере ODF? Если да, то присутствие этого файла в zip-контейнере указывает на то, что скорее всего, это файл ODF, и отсутствие этого файла указывает на то, что это определенно не файл ODF.


person jwaddell    schedule 30.11.2009    source источник


Ответы (3)


Почему бы не ознакомиться с Технической спецификацией ODF? Перечисленный там файл MIME-типа, вероятно, был бы идеальным способом проверки (просто найдите строку vnd.oasis.opendocument в MIME-типе).

person Amber    schedule 30.11.2009
comment
Файл MIME-типа обязательно должен быть в допустимом файле ODF? - person jwaddell; 30.11.2009
comment
Не в ODF1.0: 17.4 Поток типов MIME: Если тип MIME для документа, использующего пакеты, существует, то пакет ДОЛЖЕН содержать поток с именем mimetype. - person Managu; 30.11.2009

Насколько я понимаю, в корне архива всегда будут файлы .xml, и этот/эти файлы xml всегда будут содержать строку <office:document в самом начале.

Все те, что я видел, содержат в корне файл с именем «content.xml», который действительно содержит эту строку.

Существует не так много приложений для записи документов ODF, а в прошлом их было всего одно. Так что не должно быть слишком сложно установить какую-нибудь старую версию OpenOffice, сохранить несколько файлов и проверить, применяется ли это правило, как и к текущим файлам ODF.

Я бы протестировал что-то подобное на партии известных файлов ODF, чтобы проверить, надежен ли он:

$ unzip -c $FILE content.xml | grep -q '<office:document' && echo yes || echo NO
person mivk    schedule 15.12.2010

Прочтите идентификатор сборки — если он отсутствует, документ не является ODF.

oDoc = ThisComponent
If oDoc.BuildID = "" Then
    bIsNotODF = TRUE
Endif
person Andreas    schedule 15.05.2015