Specify OOXML Compliance Level for Word Documents
Leave feedback
Overview
GroupDocs.Assembly for Java allows you to control the OOXML compliance level when saving Word documents to OOXML formats (DOCX, DOCM, DOTX, DOTM, FlatOpc, etc.). You can explicitly specify the compliance level or let the system automatically preserve the original document’s compliance level.
Set the OoxmlCompliance property to the desired compliance level (or leave null for automatic preservation)
Use DocumentAssembler with the LoadSaveOptions to assemble the document
The output document will be saved with the specified compliance level
Note
The OoxmlCompliance property only applies to OOXML formats (DOCX, DOCM, DOTX, DOTM, FlatOpc, etc.) and is ignored for other file formats. When set to null (default), the system automatically preserves the original document’s compliance level if it was Transitional, otherwise uses Strict compliance.
Available OOXML Compliance Levels
The OoxmlCompliance enumeration provides three compliance levels:
Ecma: Specifies ECMA-376 compliance level
Transitional: Specifies ISO/IEC 29500:2008 Transitional compliance level (commonly used for compatibility)
Strict: Specifies ISO/IEC 29500:2008 Strict compliance level (fully compliant with the standard)
Specify Explicit OOXML Compliance Level
You can explicitly set the OOXML compliance level when assembling a document:
importcom.groupdocs.assembly.*;publicstaticvoidspecifyExplicitCompliance()throwsException{DocumentAssemblerassembler=newDocumentAssembler();// Create LoadSaveOptions with explicit OOXML compliance
LoadSaveOptionsoptions=newLoadSaveOptions(FileFormat.DOCX);options.setOoxmlCompliance(OoxmlCompliance.STRICT);// or OoxmlCompliance.ECMA, OoxmlCompliance.TRANSITIONAL
// Data object (Java has no anonymous types; use a POJO or Map)
CompanyDatadata=newCompanyData();data.setCompanyName("ABC Corp");data.setYear(2026);assembler.assembleDocument("Template.docx","Output.docx",options,newDataSourceInfo(data,"company"));}// Simple POJO for the data source (getters required for assembly engine)
staticclassCompanyData{privateStringcompanyName;privateintyear;publicStringgetCompanyName(){returncompanyName;}publicvoidsetCompanyName(Stringvalue){this.companyName=value;}publicintgetYear(){returnyear;}publicvoidsetYear(intvalue){this.year=value;}}
Use Transitional Compliance
For maximum compatibility with older Office versions, use Transitional compliance:
importcom.groupdocs.assembly;publicstaticvoiduseTransitionalCompliance()throwsException{DocumentAssemblerassembler=newDocumentAssembler();LoadSaveOptionsoptions=newLoadSaveOptions(FileFormat.DOCX);options.setOoxmlCompliance(OoxmlCompliance.TRANSITIONAL);OrderDatadata=newOrderData();data.setCustomerName("John Doe");data.setOrderNumber("ORD-12345");assembler.assembleDocument("Template.docx","Output.docx",options,newDataSourceInfo(data,"order"));}// POJO for the data source
staticclassOrderData{privateStringcustomerName;privateStringorderNumber;publicStringgetCustomerName(){returncustomerName;}publicvoidsetCustomerName(Stringvalue){this.customerName=value;}publicStringgetOrderNumber(){returnorderNumber;}publicvoidsetOrderNumber(Stringvalue){this.orderNumber=value;}}
Use Ecma Compliance
For ECMA-376 standard compliance:
importcom.groupdocs.assembly.*;publicstaticvoiduseEcmaCompliance()throwsException{DocumentAssemblerassembler=newDocumentAssembler();LoadSaveOptionsoptions=newLoadSaveOptions(FileFormat.DOCX);options.setOoxmlCompliance(OoxmlCompliance.ECMA);ReportDatadata=newReportData();data.setReportTitle("Monthly Report");data.setMonth("January 2026");assembler.assembleDocument("Template.docx","Output.docx",options,newDataSourceInfo(data,"report"));}// POJO for the data source
staticclassReportData{privateStringreportTitle;privateStringmonth;publicStringgetReportTitle(){returnreportTitle;}publicvoidsetReportTitle(Stringvalue){this.reportTitle=value;}publicStringgetMonth(){returnmonth;}publicvoidsetMonth(Stringvalue){this.month=value;}}
Automatic Preservation of Original Compliance
When OoxmlCompliance is not explicitly set (default null), the system automatically preserves the original document’s compliance level if it was Transitional:
importcom.groupdocs.assembly.*;publicstaticvoidpreserveOriginalCompliance()throwsException{DocumentAssemblerassembler=newDocumentAssembler();// OoxmlCompliance is null by default - original compliance will be preserved
LoadSaveOptionsoptions=newLoadSaveOptions(FileFormat.DOCX);// options.getOoxmlCompliance() is null - automatic preservation
DocumentDatadata=newDocumentData();data.setTitle("Document Title");data.setContent("Document content");// Output document will maintain Transitional compliance from template if it was Transitional
assembler.assembleDocument("Template_Transitional.docx","Output.docx",options,newDataSourceInfo(data,"document"));}// POJO for the data source
staticclassDocumentData{privateStringtitle;privateStringcontent;publicStringgetTitle(){returntitle;}publicvoidsetTitle(Stringvalue){this.title=value;}publicStringgetContent(){returncontent;}publicvoidsetContent(Stringvalue){this.content=value;}}
Using with Different OOXML Formats
The OoxmlCompliance property works with all OOXML formats:
importcom.groupdocs.assembly.*;publicstaticvoiduseWithDifferentFormats()throwsException{DocumentAssemblerassembler=newDocumentAssembler();ItemDatadata=newItemData();data.setName("Test Document");data.setValue(100);// DOCX format
LoadSaveOptionsdocxOptions=newLoadSaveOptions(FileFormat.DOCX);docxOptions.setOoxmlCompliance(OoxmlCompliance.STRICT);assembler.assembleDocument("Template.docx","Output.docx",docxOptions,newDataSourceInfo(data,"item"));// DOCM format (macro-enabled)
LoadSaveOptionsdocmOptions=newLoadSaveOptions(FileFormat.DOCM);docmOptions.setOoxmlCompliance(OoxmlCompliance.TRANSITIONAL);assembler.assembleDocument("Template.docm","Output.docm",docmOptions,newDataSourceInfo(data,"item"));// DOTX format (template)
LoadSaveOptionsdotxOptions=newLoadSaveOptions(FileFormat.DOTX);dotxOptions.setOoxmlCompliance(OoxmlCompliance.STRICT);assembler.assembleDocument("Template.dotx","Output.dotx",dotxOptions,newDataSourceInfo(data,"item"));}// POJO for the data source
staticclassItemData{privateStringname;privateintvalue;publicStringgetName(){returnname;}publicvoidsetName(Stringvalue){this.name=value;}publicintgetValue(){returnvalue;}publicvoidsetValue(intvalue){this.value=value;}}
Using with Streams
You can also specify OOXML compliance when working with streams:
importcom.groupdocs.assembly.*;importjava.io.*;publicstaticvoiduseComplianceWithStreams()throwsException{DocumentAssemblerassembler=newDocumentAssembler();LoadSaveOptionsoptions=newLoadSaveOptions(FileFormat.DOCX);options.setOoxmlCompliance(OoxmlCompliance.STRICT);CompanyDatadata=newCompanyData();data.setCompany("My Company");data.setYear(2024);try(InputStreamtemplateStream=newFileInputStream("Template.docx");OutputStreamoutputStream=newFileOutputStream("Output.docx")){assembler.assembleDocument(templateStream,outputStream,options,newDataSourceInfo(data,"company"));}}// POJO for the data source
staticclassCompanyData{privateStringcompany;privateintyear;publicStringgetCompany(){returncompany;}publicvoidsetCompany(Stringvalue){this.company=value;}publicintgetYear(){returnyear;}publicvoidsetYear(intvalue){this.year=value;}}
Compliance Level Behavior
Understanding how compliance levels work:
When explicitly set: The specified compliance level is used when saving to OOXML formats
When null (default):
If the original document had Transitional compliance, it is preserved
Otherwise, Strict compliance is used
For non-OOXML formats: The property is ignored (e.g., PDF, HTML, RTF)
importcom.groupdocs.assembly.*;publicstaticvoiddemonstrateComplianceBehavior()throwsException{DocumentAssemblerassembler=newDocumentAssembler();DocDatadata=newDocData();data.setTitle("Test");data.setContent("Content");// Explicit Strict compliance
LoadSaveOptionsstrictOptions=newLoadSaveOptions(FileFormat.DOCX);strictOptions.setOoxmlCompliance(OoxmlCompliance.STRICT);assembler.assembleDocument("Template.docx","Output_Strict.docx",strictOptions,newDataSourceInfo(data,"doc"));// Automatic preservation (null)
LoadSaveOptionsautoOptions=newLoadSaveOptions(FileFormat.DOCX);// autoOptions.getOoxmlCompliance() is null - will preserve if Transitional
assembler.assembleDocument("Template.docx","Output_Auto.docx",autoOptions,newDataSourceInfo(data,"doc"));// Note: For PDF output, OoxmlCompliance is ignored
LoadSaveOptionspdfOptions=newLoadSaveOptions(FileFormat.PDF);pdfOptions.setOoxmlCompliance(OoxmlCompliance.STRICT);// Ignored for PDF
assembler.assembleDocument("Template.docx","Output.pdf",pdfOptions,newDataSourceInfo(data,"doc"));}// POJO for the data source
staticclassDocData{privateStringtitle;privateStringcontent;publicStringgetTitle(){returntitle;}publicvoidsetTitle(Stringvalue){this.title=value;}publicStringgetContent(){returncontent;}publicvoidsetContent(Stringvalue){this.content=value;}}
Warning
The OoxmlCompliance property only affects OOXML formats. When saving to other formats like PDF, HTML, or RTF, this property is ignored. The compliance level is determined by the output format, not the template format.
Advanced Usage Topics
To learn more about format-specific options, document conversion settings, and advanced compliance handling, please refer to the advanced usage section.
More resources
GitHub Examples
You may easily run the code above and see the feature in action in our GitHub examples: