Secure Document Loading

This module uses the DevExpress Word Processing Document API to load Word documents with protection against potentially harmful content. You can process the predefined sample file or supply your own document. To do the latter, select Upload a File in the file selection drop-down menu.

Configure security constraints in the Security Settings section: set limits for the number of sections, sub-documents, tables, paragraphs, and rows per table. In the Content Settings section, select content types to remove: ActiveX Content, Custom XML Parts, Macros, OLE Objects, Restricted Links, External Images, Include Picture Fields, DDE Fields.

Use the Convert Document to… dropdown button to select the output format, process the document, and download the result.

Select a Document
Sample.docx
Loading log will be displayed here.



using DevExpress.XtraRichEdit;
using DevExpress.Office;

Stream TryLoadDocument(Stream inputStream, WordProcessingSecurityLoadingLimits securityLoadingLimits,
    WordProcessingSecurityLoadingOptions securityLoadingOptions, out string loadErrorMessage, DocumentFormat outputFormat) {
    using var richEditDocumentServer = new RichEditDocumentServer();

    var richSecurityLoadingOptions = richEditDocumentServer.Options.SecurityLoadingOptions;
    richSecurityLoadingOptions.RemoveActiveXContent = securityLoadingOptions.RemoveActiveXContent;
    richSecurityLoadingOptions.RemoveCustomXMLParts = securityLoadingOptions.RemoveCustomXMLParts;
    richSecurityLoadingOptions.RemoveMacros = securityLoadingOptions.RemoveMacros;
    richSecurityLoadingOptions.RemoveOleObjects = securityLoadingOptions.RemoveOleObjects;
    richSecurityLoadingOptions.RemoveRestrictedLinks = securityLoadingOptions.RemoveRestrictedLinks;
    richSecurityLoadingOptions.RemoveExternalImages = securityLoadingOptions.RemoveExternalImages;
    richSecurityLoadingOptions.RemoveIncludePictureFields = securityLoadingOptions.RemoveIncludePictureFields;
    richSecurityLoadingOptions.RemoveDDEFields = securityLoadingOptions.RemoveDDEFields;

    var richSecurityLoadingLimits = richEditDocumentServer.Options.SecurityLoadingLimits;
    richSecurityLoadingLimits.MaxFileSize = securityLoadingLimits.MaxFileSize;
    richSecurityLoadingLimits.MaxXmlElementCount = securityLoadingLimits.MaxXmlElementCount;
    richSecurityLoadingLimits.MaxXmlElementDepth = securityLoadingLimits.MaxXmlElementDepth;
    richSecurityLoadingLimits.MaxSectionsCount = securityLoadingLimits.MaxSectionsCount;
    richSecurityLoadingLimits.MaxParagraphCount = securityLoadingLimits.MaxParagraphCount;
    richSecurityLoadingLimits.MaxTableCount = securityLoadingLimits.MaxTableCount;
    richSecurityLoadingLimits.MaxTableRowCount = securityLoadingLimits.MaxTableRowCount;
    richSecurityLoadingLimits.MaxSubDocumentCount = securityLoadingLimits.MaxSubDocumentCount;

    richEditDocumentServer.SecurityLoadingLimitExceeded += (o, ea) => {
        // Use the SecurityLoadingLimitExceeded event to log information about the security loading limits
        // Set the "Handled" parameter to true to load a document even if it exceeds the specified limits
    };

    richEditDocumentServer.SecurityLoadingOptionsViolation += (o, ea) => {
        // Use the SecurityLoadingOptionsViolation event to log information about the security loading options violation
        // Set the "Handled" parameter to true to ignore the violation and load a document even if it contains unsafe content
    };

    loadErrorMessage = "";
    try {
        richEditDocumentServer.LoadDocument(inputStream);

        // Save document
        var outputStream = new MemoryStream();

        richEditDocumentServer.SaveDocument(outputStream, outputFormat);

        outputStream.Position = 0;
        return outputStream;
    }
    catch(SecurityLoadingLimitExceededException limitExceededException) {
        loadErrorMessage = limitExceededException.Message;
        return new MemoryStream();
    }
}