From b2bf8a54b7ef907a42f839540c553605d4723e95 Mon Sep 17 00:00:00 2001 From: tssujt Date: Tue, 4 Jun 2024 14:15:48 +0800 Subject: [PATCH] Add support for .docm --- src/docx/__init__.py | 1 + src/docx/api.py | 5 ++++- src/docx/opc/constants.py | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/docx/__init__.py b/src/docx/__init__.py index 205221027..557637a81 100644 --- a/src/docx/__init__.py +++ b/src/docx/__init__.py @@ -41,6 +41,7 @@ def part_class_selector(content_type: str, reltype: str) -> Type[Part] | None: PartFactory.part_class_selector = part_class_selector PartFactory.part_type_for[CT.OPC_CORE_PROPERTIES] = CorePropertiesPart +PartFactory.part_type_for[CT.WML_DOCUMENT_MACRO_ENABLED_MAIN] = DocumentPart PartFactory.part_type_for[CT.WML_DOCUMENT_MAIN] = DocumentPart PartFactory.part_type_for[CT.WML_FOOTER] = FooterPart PartFactory.part_type_for[CT.WML_HEADER] = HeaderPart diff --git a/src/docx/api.py b/src/docx/api.py index aea876458..21801448b 100644 --- a/src/docx/api.py +++ b/src/docx/api.py @@ -25,7 +25,10 @@ def Document(docx: str | IO[bytes] | None = None) -> DocumentObject: """ docx = _default_docx_path() if docx is None else docx document_part = cast("DocumentPart", Package.open(docx).main_document_part) - if document_part.content_type != CT.WML_DOCUMENT_MAIN: + if document_part.content_type not in { + CT.WML_DOCUMENT_MACRO_ENABLED_MAIN, + CT.WML_DOCUMENT_MAIN, + }: tmpl = "file '%s' is not a Word file, content type is '%s'" raise ValueError(tmpl % (docx, document_part.content_type)) return document_part.document diff --git a/src/docx/opc/constants.py b/src/docx/opc/constants.py index 89d3c16cc..8dcfd626b 100644 --- a/src/docx/opc/constants.py +++ b/src/docx/opc/constants.py @@ -205,6 +205,9 @@ class CONTENT_TYPE: "application/vnd.openxmlformats-officedocument.wordprocessingml.docu" "ment.glossary+xml" ) + WML_DOCUMENT_MACRO_ENABLED_MAIN = ( + "application/vnd.ms-word.document.macroEnabled.main+xml" + ) WML_DOCUMENT_MAIN = ( "application/vnd.openxmlformats-officedocument.wordprocessingml.docu" "ment.main+xml"