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

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

oDoc = ThisComponent
If oDoc.BuildID = "" Then
    bIsNotODF = TRUE
Endif
Другие вопросы по тегам