/// <summary>
            /// Gets core and extended properties from the specified document.
            /// </summary>
            /// <param name="fileName">The file name to get the properties from.</param>
            /// <returns>The properties</returns>
            public static PropertiesAdapter GetProperties(string fileName)
            {
                if (string.IsNullOrEmpty(fileName))
                {
                    throw new ArgumentException(nameof(fileName));
                }
                if (!File.Exists(fileName))
                {
                    throw new InvalidOperationException($"{Strings.InvalidOperationFileDoesNotExist} {fileName}");
                }

                try
                {
                    PropertiesAdapter result      = null;
                    Package           wordPackage = Package.Open(fileName, FileMode.Open, FileAccess.Read);
                    using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(wordPackage))
                    {
                        result = new PropertiesAdapter(fileName, wordDocument);
                    }
                    wordPackage.Close();
                    return(result);
                }
                catch (IOException)
                {
                    throw;
                }
                catch (Exception)
                {
                    throw new InvalidOperationException(Strings.InvalidOperationOpenXmlReader);
                }
            }
            /// <summary>
            /// Sets core and extended properties for the specified document.
            /// </summary>
            /// <param name="fileName">The file name to set the properties for.</param>
            /// <param name="props">The properties object.</param>
            /// <remarks>
            /// This method does not preserve the original created and modification dates.
            /// To do so, call the <see cref="PropertiesAdapter.Save"/> method on the object
            /// returned from the <see cref="Reader.GetProperties"/> method instead. For example:
            /// <code>
            /// var props = OpenXmlDocument.Reader.GetProperties(@"D:\MyDocument.docx");
            /// props.Core.Title = "The New Title";
            /// props.Core.Description= "This title has a new description";
            /// props.Save();
            /// </code>
            /// <para>
            /// If you don't want to preserve the dates, or want to handle it yourself, use the <see cref="SetProperties"/> method:
            /// </para>
            /// <code>
            /// var props = OpenXmlDocument.Reader.GetProperties(@"D:\MyDocument.docx");
            /// props.Core.Title = "The New Title";
            /// props.Core.Description= "This title has a new description";
            /// OpenXmlDocument.Writer.SetProperties(@"D:\MyDocument.docx", props);
            /// </code>
            /// </remarks>
            public static void SetProperties(string fileName, PropertiesAdapter props)
            {
                if (string.IsNullOrEmpty(fileName))
                {
                    throw new ArgumentException(nameof(fileName));
                }
                if (!File.Exists(fileName))
                {
                    throw new InvalidOperationException($"{Strings.InvalidOperationFileDoesNotExist} {fileName}");
                }
                if (props == null)
                {
                    throw new ArgumentNullException(nameof(props));
                }

                try
                {
                    Package wordPackage = Package.Open(fileName, FileMode.Open, FileAccess.ReadWrite);
                    using (WordprocessingDocument doc = WordprocessingDocument.Open(wordPackage))
                    {
                        // core properties
                        doc.PackageProperties.Category       = props.Core.Category;
                        doc.PackageProperties.ContentStatus  = props.Core.ContentStatus;
                        doc.PackageProperties.ContentType    = props.Core.ContentType;
                        doc.PackageProperties.Created        = props.Core.Created;
                        doc.PackageProperties.Creator        = props.Core.Creator;
                        doc.PackageProperties.Description    = props.Core.Description;
                        doc.PackageProperties.Identifier     = props.Core.Identifier;
                        doc.PackageProperties.Keywords       = props.Core.Keywords;
                        doc.PackageProperties.Language       = props.Core.Language;
                        doc.PackageProperties.LastModifiedBy = props.Core.LastModifiedBy;
                        doc.PackageProperties.LastPrinted    = props.Core.LastPrinted;
                        doc.PackageProperties.Modified       = props.Core.Modified;
                        doc.PackageProperties.Revision       = props.Core.Revision;
                        doc.PackageProperties.Subject        = props.Core.Subject;
                        doc.PackageProperties.Title          = props.Core.Title;
                        doc.PackageProperties.Version        = props.Core.Version;

                        // extended properties
                        OpenXmlDocumentCreator.AddExtendedFilePropertiesPartIfNeeded(doc);
                        doc.ExtendedFilePropertiesPart.Properties.Company.Text = props.Extended.Company;
                    }

                    wordPackage.Close();
                }
                catch (IOException)
                {
                    throw;
                }
                catch (Exception)
                {
                    throw new InvalidOperationException(Strings.InvalidOperationOpenXmlReader);
                }
            }