Как определить файл 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