Определение формата файла и проверка совместимости форматов

Иногда необходимо определить формат документа перед открытием, поскольку расширение файла не гарантирует, что содержимое файла соответствует действительности. Например, известно, что Crystal Reports часто выводит документы в формате RTF, но присваивает им расширение .doc.

Aspose.Words предоставляет возможность получить информацию о типе файла, чтобы избежать исключения, если вы не уверены в фактическом содержимом файла.

Определение формата файла без каких-либо исключений

Когда вы имеете дело с несколькими документами в различных форматах, вам может потребоваться отделить те файлы, которые могут быть обработаны с помощью Aspose.Words, от тех, которые не могут. Возможно, вы также захотите узнать, почему некоторые документы не могут быть обработаны.

Если вы попытаетесь загрузить файл в объект Document и Aspose.Words не сможет распознать формат файла или формат не поддерживается, Aspose.Words вызовет исключение. Вы можете перехватить эти исключения и проанализировать их, но Aspose.Words также предоставляет метод detect_file_format, который позволяет нам быстро определить формат файла, не загружая документ с возможными исключениями. Этот метод возвращает объект FileFormatInfo, содержащий обнаруженную информацию о типе файла.

Проверьте совместимость форматов файлов

Мы можем проверить совместимость форматов всех файлов в выбранной папке и отсортировать их по формату в соответствующие подпапки.

Поскольку мы имеем дело с содержимым папки, первое, что нам нужно сделать, это получить коллекцию всех файлов в этой папке, используя метод listdir модуля os.

В следующем примере кода показано, как получить список всех файлов в папке:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
fileList = (file for file in os.listdir(docs_base.my_dir)
if (os.path.isfile(os.path.join(docs_base.my_dir, file)) and not file.endswith("Corrupted document.docx")))

Когда все файлы собраны, остальная часть работы выполняется методом detect_file_format, который проверяет формат файла.

В следующем примере кода показано, как выполнить итерацию по собранному списку файлов, проверить формат каждого файла и переместить каждый файл в соответствующую папку:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
supported_dir = docs_base.artifacts_dir + "Supported"
unknown_dir = docs_base.artifacts_dir + "Unknown"
encrypted_dir = docs_base.artifacts_dir + "Encrypted"
pre97_dir = docs_base.artifacts_dir + "Pre97"
# Create the directories if they do not already exist.
if not os.path.exists(supported_dir):
os.makedirs(supported_dir)
if not os.path.exists(unknown_dir):
os.makedirs(unknown_dir)
if not os.path.exists(encrypted_dir):
os.makedirs(encrypted_dir)
if not os.path.exists(pre97_dir):
os.makedirs(pre97_dir)
fileList = (file for file in os.listdir(docs_base.my_dir)
if (os.path.isfile(os.path.join(docs_base.my_dir, file)) and not file.endswith("Corrupted document.docx")))
for fileName in fileList:
name_only = fileName
fileName = os.path.join(docs_base.my_dir, name_only)
print(name_only)
info = aw.FileFormatUtil.detect_file_format(fileName)
lf = info.load_format
# Display the document type
if lf == aw.LoadFormat.DOC:
print("\tMicrosoft Word 97-2003 document.")
elif lf == aw.LoadFormat.DOT:
print("\tMicrosoft Word 97-2003 template.")
elif lf == aw.LoadFormat.DOCX:
print("\tOffice Open XML WordprocessingML Macro-Free Document.")
elif lf == aw.LoadFormat.DOCM:
print("\tOffice Open XML WordprocessingML Macro-Enabled Document.")
elif lf == aw.LoadFormat.DOTX:
print("\tOffice Open XML WordprocessingML Macro-Free Template.")
elif lf == aw.LoadFormat.DOTM:
print("\tOffice Open XML WordprocessingML Macro-Enabled Template.")
elif lf == aw.LoadFormat.FLAT_OPC:
print("\tFlat OPC document.")
elif lf == aw.LoadFormat.RTF:
print("\tRTF format.")
elif lf == aw.LoadFormat.WORD_ML:
print("\tMicrosoft Word 2003 WordprocessingML format.")
elif lf == aw.LoadFormat.HTML:
print("\tHTML format.")
elif lf == aw.LoadFormat.MHTML:
print("\tMHTML (Web archive) format.")
elif lf == aw.LoadFormat.ODT:
print("\tOpenDocument Text.")
elif lf == aw.LoadFormat.OTT:
print("\tOpenDocument Text Template.")
elif lf == aw.LoadFormat.DOC_PRE_WORD60:
print("\tMS Word 6 or Word 95 format.")
elif lf == aw.LoadFormat.UNKNOWN:
print("\tUnknown format.")
if info.is_encrypted:
print("\tAn encrypted document.")
shutil.copyfile(fileName, os.path.join(encrypted_dir, name_only))
else:
if lf == aw.LoadFormat.DOC_PRE_WORD60:
shutil.copyfile(fileName, os.path.join(pre97_dir, name_only))
elif lf == aw.LoadFormat.UNKNOWN:
shutil.copyfile(fileName, os.path.join(unknown_dir, name_only))
else:
shutil.copyfile(fileName, os.path.join(supported_dir, name_only))

Файлы перемещаются в соответствующие подпапки с помощью метода copyfile модуля shutil.

В приведенном выше примере используются следующие файлы. Название файла указано слева, а его описание - справа:

Группа файлов Входной документ Тип
Поддерживаемые форматы файлов Test File (Doc).doc Microsoft Word 95/6.0 или Microsoft Word 97 – документ 2003 года.
Тестовый файл (Dot).точка Microsoft Word 95/6.0 или Microsoft Word 97 – шаблон 2003 года.
Test File (Docx).docx Office Открывает XML WordprocessingML документ без макросов.
Test File (Docm).docm Откройте в Office XML WordprocessingML документ с помощью макросов.
Test File (Dotx).dotx Шаблон Office Open XML WordprocessingML.
Test File (Dotm).dotm Шаблон Office Open XML WordprocessingML с макросами.
Test File (XML).xml FlatOPC OOXML Документ.
Test File (RTF).rtf Документ в формате Rich Text.
Test File (WordML).xml Microsoft Word документ 2003 года WordprocessingML.
Test File (HTML).html HTML документ.
Test File (MHTML).mhtml MHTML документ (веб-архив).
Test File (Odt).odt OpenDocument Текст (OpenOffice Автор).
Test File (Ott).ott OpenDocument Шаблон документа.
Test File (DocPreWord60).doc Microsoft Word 2.0 документ.
Зашифрованные документы Test File (Enc).doc Зашифрованный документ Microsoft Word 95/6.0 или Microsoft Word 97 – 2003.
Test File (Enc).docx Зашифрованный офис Открывает XML WordprocessingML документ.
Неподдерживаемые форматы файлов Test File (JPG).jpg JPEG файл изображения.