Skip to content

Commit

Permalink
Merge pull request #48 from EvotecIT/DefaultStyleChanges
Browse files Browse the repository at this point in the history
Allow to set default font, size, and other settings for the whole document
  • Loading branch information
PrzemyslawKlys authored Oct 14, 2022
2 parents 468f3e2 + 3671d45 commit 08e0910
Show file tree
Hide file tree
Showing 5 changed files with 208 additions and 35 deletions.
7 changes: 4 additions & 3 deletions OfficeIMO.Examples/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ static void Main(string[] args) {
//BasicDocument.Example_BasicWord(folderPath, false);
//BasicDocument.Example_BasicWord2(folderPath, false);
//BasicDocument.Example_BasicWordWithBreaks(folderPath, true);
BasicDocument.Example_BasicWordWithDefaultStyleChange(folderPath, true);

//AdvancedDocument.Example_AdvancedWord(folderPath, true);

Expand Down Expand Up @@ -95,9 +96,9 @@ static void Main(string[] args) {
//filePath = System.IO.Path.Combine(folderPath, "AdvancedParagraphs.docx");
//Example_MultipleParagraphsViaDifferentWays(filePath, false);

Images.Example_AddingImages(folderPath, true);
Images.Example_ReadWordWithImages();
Images.Example_AddingImagesMultipleTypes(folderPath, true);
//Images.Example_AddingImages(folderPath, true);
//Images.Example_ReadWordWithImages();
//Images.Example_AddingImagesMultipleTypes(folderPath, true);
//Console.WriteLine("[*] Creating standard document with page breaks and removing them");
//filePath = System.IO.Path.Combine(folderPath, "Basic Document with some page breaks.docx");
//Example_PageBreaks(filePath, true);
Expand Down
29 changes: 29 additions & 0 deletions OfficeIMO.Examples/Word/BasicDocument/BasicDocument.Create03.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Wordprocessing;
using OfficeIMO.Word;

namespace OfficeIMO.Examples.Word {
internal static partial class BasicDocument {
public static void Example_BasicWordWithDefaultStyleChange(string folderPath, bool openWord) {
Console.WriteLine("[*] Creating standard document with different default style");
string filePath = System.IO.Path.Combine(folderPath, "BasicWordWithDefaultStyleChange.docx");
using (WordDocument document = WordDocument.Create(filePath)) {
document.Settings.FontSize = 30;
document.Settings.FontFamily = "Calibri Light";
document.Settings.Language = "pl-PL";

var paragraph1 = document.AddParagraph("To jest po polsku");

var paragraph2 = document.AddParagraph("Adding paragraph1 with some text and pressing ENTER");
paragraph2.FontSize = 15;
paragraph2.FontFamily = "Courier New";

document.Save(openWord);
}
}
}
}
22 changes: 21 additions & 1 deletion OfficeIMO.Tests/Word.Settings.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.IO;
using System.IO;
using DocumentFormat.OpenXml.Wordprocessing;
using OfficeIMO.Word;
using Xunit;
Expand Down Expand Up @@ -35,6 +35,22 @@ public void Test_CreatingDocumentWithSettings() {

Assert.True(document.Settings.UpdateFieldsOnOpen == true);

Assert.True(document.Settings.FontSize == 11); // default value

document.Settings.FontSize = 30;

Assert.True(document.Settings.FontSize == 30);

Assert.True(document.Settings.FontSizeComplexScript == 11);

document.Settings.FontSizeComplexScript = 20;

Assert.True(document.Settings.FontSizeComplexScript == 20);

document.Settings.FontFamily = "Courier New";

Assert.True(document.Settings.FontFamily == "Courier New");

document.Save(false);
}
using (WordDocument document = WordDocument.Load(Path.Combine(_directoryWithFiles, "CreatingDocumentWithSettings.docx"))) {
Expand Down Expand Up @@ -62,6 +78,10 @@ public void Test_CreatingDocumentWithSettings() {

document.Settings.UpdateFieldsOnOpen = false;

Assert.True(document.Settings.FontSizeComplexScript == 20);
Assert.True(document.Settings.FontSize == 30);
Assert.True(document.Settings.FontFamily == "Courier New");

document.Save();
}
using (WordDocument document = WordDocument.Load(Path.Combine(_directoryWithFiles, "CreatingDocumentWithSettings.docx"))) {
Expand Down
2 changes: 1 addition & 1 deletion OfficeIMO.Word/WordDocument.Parts.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
Expand Down
183 changes: 153 additions & 30 deletions OfficeIMO.Word/WordSettings.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
Expand All @@ -11,13 +11,19 @@ namespace OfficeIMO.Word {
public class WordSettings {
private WordDocument _document;

/// <summary>
/// Remove protection from document (if it's set).
/// </summary>
public void RemoveProtection() {
if (this.ProtectionType != null) {
DocumentProtection documentProtection = this._document._wordprocessingDocument.MainDocumentPart.DocumentSettingsPart.Settings.OfType<DocumentProtection>().FirstOrDefault();
documentProtection.Remove();
}
}

/// <summary>
/// Get or set Protection Type for the document
/// </summary>
public DocumentProtectionValues? ProtectionType {
get {
if (this._document._wordprocessingDocument.MainDocumentPart.DocumentSettingsPart.Settings != null) {
Expand All @@ -41,11 +47,19 @@ public DocumentProtectionValues? ProtectionType {
}
}
}

/// <summary>
/// Set a Protection Password for the document
/// </summary>
public string ProtectionPassword {
set {
Security.ProtectWordDoc(this._document._wordprocessingDocument, value);
}
}

/// <summary>
/// Get or set Zoom Preset for the document
/// </summary>
public PresetZoomValues? ZoomPreset {
get {
var settings = _document._wordprocessingDocument.MainDocumentPart.DocumentSettingsPart.Settings;
Expand All @@ -68,6 +82,9 @@ public PresetZoomValues? ZoomPreset {
}
}

/// <summary>
/// Get or Set Zoome Percentage for the document
/// </summary>
public int? ZoomPercentage {
get {
var settings = _document._wordprocessingDocument.MainDocumentPart.DocumentSettingsPart.Settings;
Expand All @@ -88,6 +105,10 @@ public int? ZoomPercentage {
}
}

/// <summary>
/// Tell Word to update fields when opening word.
/// Without this option the document fields won't be refreshed until manual intervention.
/// </summary>
public bool UpdateFieldsOnOpen {
get {
var settings = _document._wordprocessingDocument.MainDocumentPart.DocumentSettingsPart.Settings;
Expand All @@ -108,15 +129,6 @@ public bool UpdateFieldsOnOpen {
}
}

////Open Word Setting File
//DocumentSettingsPart settingsPart = xmlDOc.MainDocumentPart.GetPartsOfType<DocumentSettingsPart>().First();
////Update Fields
//UpdateFieldsOnOpen updateFields = new UpdateFieldsOnOpen();
//updateFields.Val = new OnOffValue(true);

//settingsPart.Settings.PrependChild<UpdateFieldsOnOpen>(updateFields);
//settingsPart.Settings.Save();

public WordSettings(WordDocument document) {
if (document.FileOpenAccess != FileAccess.Read) {
var documentSettingsPart = document._wordprocessingDocument.MainDocumentPart.DocumentSettingsPart;
Expand All @@ -134,44 +146,155 @@ public WordSettings(WordDocument document) {
document.Settings = this;
}


public string Language {
get {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles != null) {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults != null) {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault != null) {
private RunPropertiesBaseStyle? GetDefaultStyleProperties() {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles != null) {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults != null) {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault != null) {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle != null) {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle != null) {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle.Languages != null) {
return this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle.Languages.Val;
}
return this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle;
}
}
}
}
}
return null;
}

private RunPropertiesBaseStyle? SetDefaultStyleProperties() {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles != null) {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults == null) {
this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults = new DocDefaults();
}

if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault == null) {
this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault = new RunPropertiesDefault();
}

if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle == null) {
this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle = new RunPropertiesBaseStyle();
}

return this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle;
}

return null;
}

/// <summary>
/// Gets or Sets default font size for the whole document. Default is 11.
/// </summary>
public int? FontSize {
get {
var runPropertiesBaseStyle = GetDefaultStyleProperties();
if (runPropertiesBaseStyle != null) {
if (runPropertiesBaseStyle.FontSize != null) {
var fontSize = runPropertiesBaseStyle.FontSize.Val;
return int.Parse(fontSize) / 2;
}
}
return null;
}
set {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles != null) {
if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults == null) {
this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults = new DocDefaults();
var runPropertiesBaseStyle = SetDefaultStyleProperties();
if (runPropertiesBaseStyle != null) {
if (runPropertiesBaseStyle.FontSize == null) {
runPropertiesBaseStyle.FontSize = new FontSize();
}
runPropertiesBaseStyle.FontSize.Val = (value * 2).ToString();
} else {
throw new Exception("Could not set font size. Styles not found.");
}
}
}

if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault == null) {
this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault = new RunPropertiesDefault();
/// <summary>
/// Gets or Sets default font size complex script for the whole document. Default is 11.
/// </summary>
public int? FontSizeComplexScript {
get {
var runPropertiesBaseStyle = GetDefaultStyleProperties();
if (runPropertiesBaseStyle != null) {
if (runPropertiesBaseStyle.FontSizeComplexScript != null) {
var fontSize = runPropertiesBaseStyle.FontSizeComplexScript.Val;
return int.Parse(fontSize) / 2;
}

if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle == null) {
this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle = new RunPropertiesBaseStyle();
}
return null;
}
set {
var runPropertiesBaseStyle = SetDefaultStyleProperties();
if (runPropertiesBaseStyle != null) {
if (runPropertiesBaseStyle.FontSizeComplexScript == null) {
runPropertiesBaseStyle.FontSizeComplexScript = new FontSizeComplexScript();
}
runPropertiesBaseStyle.FontSizeComplexScript.Val = (value * 2).ToString();
} else {
throw new Exception("Could not set font size complex script. Styles not found.");
}
}
}

if (this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle.Languages == null) {
this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle.Languages = new Languages();
/// <summary>
/// Gets or Sets default font family for the whole document.
/// </summary>
public string FontFamily {
get {
var runPropertiesBaseStyle = GetDefaultStyleProperties();
if (runPropertiesBaseStyle != null) {
if (runPropertiesBaseStyle.RunFonts != null) {
var fontFamily = runPropertiesBaseStyle.RunFonts.Ascii;
return fontFamily;
}
}
return null;
}
set {
var runPropertiesBaseStyle = SetDefaultStyleProperties();
if (runPropertiesBaseStyle != null) {
//runPropertiesBaseStyle.RunFonts = new RunFonts();
if (runPropertiesBaseStyle.RunFonts == null) {
runPropertiesBaseStyle.RunFonts = new RunFonts() { AsciiTheme = ThemeFontValues.MinorHighAnsi, HighAnsiTheme = ThemeFontValues.MinorHighAnsi, EastAsiaTheme = ThemeFontValues.MinorHighAnsi, ComplexScriptTheme = ThemeFontValues.MinorBidi };
}
// we need to reset default AsciiTheme, before applying Ascii
runPropertiesBaseStyle.RunFonts.AsciiTheme = null;
runPropertiesBaseStyle.RunFonts.Ascii = value;
} else {
throw new Exception("Could not set font family. Styles not found.");
}
}
}

this._document._wordprocessingDocument.MainDocumentPart.StyleDefinitionsPart.Styles.DocDefaults.RunPropertiesDefault.RunPropertiesBaseStyle.Languages.Val = value;
/// <summary>
/// Gets or Sets default language for the whole document. Default is en-Us.
/// </summary>
public string Language {
get {
var runPropertiesBaseStyle = GetDefaultStyleProperties();
if (runPropertiesBaseStyle != null) {
if (runPropertiesBaseStyle.Languages != null) {
return runPropertiesBaseStyle.Languages.Val;
}
}
return null;
}
set {
var runPropertiesBaseStyle = SetDefaultStyleProperties();
if (runPropertiesBaseStyle != null) {
if (runPropertiesBaseStyle.Languages == null) {
runPropertiesBaseStyle.Languages = new Languages();
}
runPropertiesBaseStyle.Languages.Val = value;
//runPropertiesBaseStyle.Languages.EastAsia = value;
} else {
throw new Exception("Could not set language. Styles not found.");
}
}
}

/// <summary>
/// Gets or Sets default Background Color for the whole document
/// </summary>
public string BackgroundColor {
get {
if (_document._wordprocessingDocument.MainDocumentPart.Document.DocumentBackground != null) {
Expand Down

0 comments on commit 08e0910

Please sign in to comment.