Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow to set default font, size, and other settings for the whole document #48

Merged
merged 7 commits into from
Oct 14, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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