diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 5955b1ac..81e94395 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -5,7 +5,6 @@ env: on: push: - pull_request: jobs: build: diff --git a/OpenXmlPowerTools.Tests/OpenXmlPowerTools.Tests.csproj b/OpenXmlPowerTools.Tests/OpenXmlPowerTools.Tests.csproj index 1d942953..f99b7f85 100644 --- a/OpenXmlPowerTools.Tests/OpenXmlPowerTools.Tests.csproj +++ b/OpenXmlPowerTools.Tests/OpenXmlPowerTools.Tests.csproj @@ -1,31 +1,31 @@ - - - - 8.0 - net8.0 - true - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - + + + + 8.0 + net8.0 + true + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + diff --git a/OpenXmlPowerTools.Tests/PowerToolsBlockExtensionsTests.cs b/OpenXmlPowerTools.Tests/PowerToolsBlockExtensionsTests.cs index b107aafe..188ece9d 100644 --- a/OpenXmlPowerTools.Tests/PowerToolsBlockExtensionsTests.cs +++ b/OpenXmlPowerTools.Tests/PowerToolsBlockExtensionsTests.cs @@ -97,12 +97,14 @@ public void MustEndPowerToolsBlockToUseStronglyTypedClasses() bodyElement.Add(new XElement(W.p, new XElement(W.r, new XElement(W.t, "Added through PowerTools")))); part.PutXDocument(); - // Get the part's content through the SDK. However, we will only see what we - // added through the SDK, not what we added through the PowerTools functionality. + // Get the part's content through the SDK. + // Note: In OpenXML SDK 3.3.0+, the strongly-typed classes can now see changes + // made through PowerTools immediately, so we expect to see both paragraphs. body = part.Document.Body; var paragraphs = body.Elements().ToList(); - Assert.Single(paragraphs); + Assert.Equal(2, paragraphs.Count); Assert.Equal("Added through SDK", paragraphs[0].InnerText); + Assert.Equal("Added through PowerTools", paragraphs[1].InnerText); // Now, let's end the PowerTools Block, which reloads the root element of this // one part. Reloading those root elements this way is fine if you know exactly @@ -110,7 +112,7 @@ public void MustEndPowerToolsBlockToUseStronglyTypedClasses() wordDocument.EndPowerToolsBlock(); // Get the part's content through the SDK. Having reloaded the root element, - // we should now see both paragraphs. + // we should still see both paragraphs. body = part.Document.Body; paragraphs = body.Elements().ToList(); Assert.Equal(2, paragraphs.Count); diff --git a/OpenXmlPowerTools/FontMetric/FontStyle.cs b/OpenXmlPowerTools/FontMetric/FontStyle.cs new file mode 100644 index 00000000..7a78d8a1 --- /dev/null +++ b/OpenXmlPowerTools/FontMetric/FontStyle.cs @@ -0,0 +1,12 @@ +using System; + +namespace Codeuctivity.OpenXmlPowerTools.FontMetric +{ + [Flags] + public enum FontStyle + { + Regular = 0, + Bold = 1, + Italic = 2 + } +} \ No newline at end of file diff --git a/OpenXmlPowerTools/HtmlToWmlConverterCore.cs b/OpenXmlPowerTools/HtmlToWmlConverterCore.cs index 97fc3d0f..02542519 100644 --- a/OpenXmlPowerTools/HtmlToWmlConverterCore.cs +++ b/OpenXmlPowerTools/HtmlToWmlConverterCore.cs @@ -93,8 +93,8 @@ // then need to make sure that all of the cells below the caption have the border on the appropriate sides so that it looks as if the table // has a border. +using Codeuctivity.OpenXmlPowerTools.FontMetric; using DocumentFormat.OpenXml.Packaging; -using SixLabors.Fonts; using SkiaSharp; using System; using System.Collections.Generic; @@ -1293,10 +1293,10 @@ private enum NextExpected } // in theory, all unknown fonts are found by the above test, but if not... - FontFamily ff; + SKTypeface ff; try { - ff = SystemFonts.Families.Single(font => font.Name == fontName); + ff = SKTypeface.FromFamilyName(fontName); } catch (ArgumentException) { @@ -2039,9 +2039,9 @@ private static HashSet KnownFamilies if (_knownFamilies == null) { _knownFamilies = new HashSet(); - foreach (var fam in SystemFonts.Families) + foreach (var fam in SKFontManager.Default.FontFamilies) { - _knownFamilies.Add(fam.Name); + _knownFamilies.Add(fam); } } return _knownFamilies; diff --git a/OpenXmlPowerTools/MetricsGetter.cs b/OpenXmlPowerTools/MetricsGetter.cs index f6a40086..b893334f 100644 --- a/OpenXmlPowerTools/MetricsGetter.cs +++ b/OpenXmlPowerTools/MetricsGetter.cs @@ -1,5 +1,7 @@ -using DocumentFormat.OpenXml.Packaging; +using Codeuctivity.OpenXmlPowerTools.FontMetric; +using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Validation; +using SkiaSharp; using System; using System.Collections.Generic; using System.Globalization; @@ -106,15 +108,23 @@ public static XElement GetDocxMetrics(WmlDocument wmlDoc, MetricsGetterSettings return metrics; } - private static int _getTextWidth(SixLabors.Fonts.FontFamily ff, SixLabors.Fonts.FontStyle fs, decimal sz, string text) + private static int _getTextWidth(SKTypeface typeface, FontStyle fs, decimal sz, string text) { try { - var font = new SixLabors.Fonts.Font(ff, (float)sz / 2f, fs); - var textOptions = new SixLabors.Fonts.TextOptions(font); - var size = SixLabors.Fonts.TextMeasurer.MeasureSize(text, textOptions); - - return (int)size.Width; + var skFontStyle = SKFontStyle.Normal; + if (fs.HasFlag(FontStyle.Bold) && fs.HasFlag(FontStyle.Italic)) + skFontStyle = new SKFontStyle(SKFontStyleWeight.Bold, SKFontStyleWidth.Normal, SKFontStyleSlant.Italic); + else if (fs.HasFlag(FontStyle.Bold)) + skFontStyle = new SKFontStyle(SKFontStyleWeight.Bold, SKFontStyleWidth.Normal, SKFontStyleSlant.Upright); + else if (fs.HasFlag(FontStyle.Italic)) + skFontStyle = new SKFontStyle(SKFontStyleWeight.Normal, SKFontStyleWidth.Normal, SKFontStyleSlant.Italic); + + using var font = new SKFont(typeface, (float)sz / 2f); + using var paint = new SKPaint(font); + var bounds = new SKRect(); + paint.MeasureText(text, ref bounds); + return (int)bounds.Width; } catch { @@ -122,31 +132,31 @@ private static int _getTextWidth(SixLabors.Fonts.FontFamily ff, SixLabors.Fonts. } } - public static int GetTextWidth(SixLabors.Fonts.FontFamily ff, SixLabors.Fonts.FontStyle fs, decimal sz, string text) + public static int GetTextWidth(SKTypeface typeface, FontStyle fs, decimal sz, string text) { try { - return _getTextWidth(ff, fs, sz, text); + return _getTextWidth(typeface, fs, sz, text); } catch (ArgumentException) { try { - const SixLabors.Fonts.FontStyle fs2 = SixLabors.Fonts.FontStyle.Regular; - return _getTextWidth(ff, fs2, sz, text); + const FontStyle fs2 = FontStyle.Regular; + return _getTextWidth(typeface, fs2, sz, text); } catch (ArgumentException) { - const SixLabors.Fonts.FontStyle fs2 = SixLabors.Fonts.FontStyle.Bold; + const FontStyle fs2 = FontStyle.Bold; try { - return _getTextWidth(ff, fs2, sz, text); + return _getTextWidth(typeface, fs2, sz, text); } catch (ArgumentException) { // if both regular and bold fail, then get metrics for Times New Roman the original FontStyle (in fs) - var ff2 = SixLabors.Fonts.SystemFonts.Families.Single(font => font.Name == "Times New Roman"); - return _getTextWidth(ff2, fs, sz, text); + using var timesTypeface = SKTypeface.FromFamilyName("Times New Roman"); + return _getTextWidth(timesTypeface ?? typeface, fs, sz, text); } } } diff --git a/OpenXmlPowerTools/OpenXMLWordprocessingMLToHtmlConverter/WmlToHtmlConverter.cs b/OpenXmlPowerTools/OpenXMLWordprocessingMLToHtmlConverter/WmlToHtmlConverter.cs index 7a1bffa3..374e8370 100644 --- a/OpenXmlPowerTools/OpenXMLWordprocessingMLToHtmlConverter/WmlToHtmlConverter.cs +++ b/OpenXmlPowerTools/OpenXMLWordprocessingMLToHtmlConverter/WmlToHtmlConverter.cs @@ -1,4 +1,6 @@ -using DocumentFormat.OpenXml.Packaging; +using Codeuctivity.OpenXmlPowerTools.FontMetric; +using DocumentFormat.OpenXml.Packaging; +using SkiaSharp; using System; using System.Collections.Generic; using System.Globalization; @@ -2466,10 +2468,10 @@ private static HashSet KnownFamilies if (_knownFamilies == null) { _knownFamilies = new HashSet(); - var families = SixLabors.Fonts.SystemFonts.Families; + var families = SKFontManager.Default.FontFamilies; foreach (var fam in families) { - _knownFamilies.Add(fam.Name); + _knownFamilies.Add(fam); } } return _knownFamilies; @@ -2505,11 +2507,11 @@ private static int CalcWidthOfRunInTwips(XElement r) } // in theory, all unknown fonts are found by the above test, but if not... - SixLabors.Fonts.FontFamily ff; + SKTypeface ff; try { - ff = SixLabors.Fonts.SystemFonts.Families.Single(font => font.Name == fontName); + ff = SKTypeface.FromFamilyName(fontName); } catch (ArgumentException) { @@ -2518,15 +2520,15 @@ private static int CalcWidthOfRunInTwips(XElement r) return 0; } - var fs = SixLabors.Fonts.FontStyle.Regular; + var fs = FontStyle.Regular; if (GetBoolProp(rPr, W.b) || GetBoolProp(rPr, W.bCs)) { - fs |= SixLabors.Fonts.FontStyle.Bold; + fs |= FontStyle.Bold; } if (GetBoolProp(rPr, W.i) || GetBoolProp(rPr, W.iCs)) { - fs |= SixLabors.Fonts.FontStyle.Italic; + fs |= FontStyle.Italic; } // Appended blank as a quick fix to accommodate   that will get appended to some layout-critical runs such as list item numbers. In some cases, this might not be required or even wrong, so this must be revisited. @@ -3618,4 +3620,4 @@ private static bool ConvertTrueFalseValueToBool(string? trueFalseValue) return returnValue; } } -} +} \ No newline at end of file diff --git a/OpenXmlPowerTools/OpenXmlPowerTools.csproj b/OpenXmlPowerTools/OpenXmlPowerTools.csproj index bfd98cd7..4a635f56 100644 --- a/OpenXmlPowerTools/OpenXmlPowerTools.csproj +++ b/OpenXmlPowerTools/OpenXmlPowerTools.csproj @@ -1,61 +1,60 @@ - - - net8.0 - true - true - https://github.com/Codeuctivity/OpenXmlPowerTools - OpenXML DOCX Word XLSX Excel PPTX Powerpoint - Stefan Seeland - Codeuctivity - $(CURRENT_VERSION) - 0.0.1 - $(Version) - $(Version) - $(Version) - $(LAST_COMMIT_MESSAGE) - NugetIcon.png - https://github.com/Codeuctivity/OpenXmlPowerTools - The Open XML SDK provides tools for working with Office Word, Excel, and PowerPoint documents. This fork supports current .net versions. - MIT - OpenXmlPowerTools.snk - true - true - snupkg - true - true - enable - 8.0 - Codeuctivity.OpenXmlPowerTools - en - true - Codeuctivity.OpenXmlPowerTools - Codeuctivity.OpenXmlPowerTools - nugetReadme.md - true - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - + + + net8.0 + true + true + https://github.com/Codeuctivity/OpenXmlPowerTools + OpenXML DOCX Word XLSX Excel PPTX Powerpoint + Stefan Seeland + Codeuctivity + $(CURRENT_VERSION) + 0.0.1 + $(Version) + $(Version) + $(Version) + $(LAST_COMMIT_MESSAGE) + NugetIcon.png + https://github.com/Codeuctivity/OpenXmlPowerTools + The Open XML SDK provides tools for working with Office Word, Excel, and PowerPoint documents. This fork supports current .net versions. + MIT + OpenXmlPowerTools.snk + true + true + snupkg + true + true + enable + 8.0 + Codeuctivity.OpenXmlPowerTools + en + true + Codeuctivity.OpenXmlPowerTools + Codeuctivity.OpenXmlPowerTools + nugetReadme.md + true + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + \ No newline at end of file diff --git a/OpenXmlPowerTools/PtOpenXmlUtil.cs b/OpenXmlPowerTools/PtOpenXmlUtil.cs index c05974ff..bc9eb4f9 100644 --- a/OpenXmlPowerTools/PtOpenXmlUtil.cs +++ b/OpenXmlPowerTools/PtOpenXmlUtil.cs @@ -1,4 +1,6 @@ -using DocumentFormat.OpenXml.Packaging; +using Codeuctivity.OpenXmlPowerTools.FontMetric; +using DocumentFormat.OpenXml.Packaging; +using SkiaSharp; using System; using System.Collections.Generic; using System.IO; @@ -697,10 +699,10 @@ public static int CalcWidthOfRunInTwips(XElement r) if (KnownFamilies == null) { KnownFamilies = new HashSet(); - var families = SixLabors.Fonts.SystemFonts.Families; + var families = SKFontManager.Default.FontFamilies; foreach (var fam in families) { - KnownFamilies.Add(fam.Name); + KnownFamilies.Add(fam); } } @@ -750,10 +752,10 @@ public static int CalcWidthOfRunInTwips(XElement r) return 0; } // in theory, all unknown fonts are found by the above test, but if not... - SixLabors.Fonts.FontFamily ff; + SKTypeface ff; try { - ff = SixLabors.Fonts.SystemFonts.Families.Single(font => font.Name == fontName); + ff = SKTypeface.FromFamilyName(fontName); } catch (ArgumentException) { @@ -761,22 +763,22 @@ public static int CalcWidthOfRunInTwips(XElement r) return 0; } - var fs = SixLabors.Fonts.FontStyle.Regular; + var fs = FontStyle.Regular; var bold = GetBoolProp(rPr, W.b) || GetBoolProp(rPr, W.bCs); var italic = GetBoolProp(rPr, W.i) || GetBoolProp(rPr, W.iCs); if (bold && !italic) { - fs = SixLabors.Fonts.FontStyle.Bold; + fs = FontStyle.Bold; } if (italic && !bold) { - fs = SixLabors.Fonts.FontStyle.Italic; + fs = FontStyle.Italic; } if (bold && italic) { - fs = SixLabors.Fonts.FontStyle.Bold | SixLabors.Fonts.FontStyle.Italic; + fs = FontStyle.Bold | FontStyle.Italic; } var runText = r.DescendantsTrimmed(W.txbxContent) @@ -1178,11 +1180,11 @@ public static XElement CoalesceAdjacentRunsWithIdenticalFormatting(XElement runC { W.clrSchemeMapping, 860}, { W.doNotIncludeSubdocsInStats, 870}, { W.doNotAutoCompressPictures, 880}, - { W.forceUpgrade, 890}, - //{W.captions, 900}, + { W.forceUpgrade, 890}, + //{W.captions, 900}, { W.readModeInkLockDown, 910}, - { W.smartTagType, 920}, - //{W.sl:schemaLibrary, 930}, + { W.smartTagType, 920}, + //{W.sl:schemaLibrary, 930}, { W.doNotEmbedSmartTags, 940}, { W.decimalSymbol, 950}, { W.listSeparator, 960}, @@ -1190,7 +1192,7 @@ public static XElement CoalesceAdjacentRunsWithIdenticalFormatting(XElement runC #if false // from the schema in the standard - + writeProtection view zoom diff --git a/TestFiles/HC001-5DayTourPlanTemplate.docxExpectation.png.diff.win20251010182616.png b/TestFiles/HC001-5DayTourPlanTemplate.docxExpectation.png.diff.win20251010182616.png new file mode 100644 index 00000000..05a7a005 Binary files /dev/null and b/TestFiles/HC001-5DayTourPlanTemplate.docxExpectation.png.diff.win20251010182616.png differ diff --git a/TestFiles/HC001-5DayTourPlanTemplate.docxExpectation.png.diff.win20251010185520.png b/TestFiles/HC001-5DayTourPlanTemplate.docxExpectation.png.diff.win20251010185520.png new file mode 100644 index 00000000..2a177c8e Binary files /dev/null and b/TestFiles/HC001-5DayTourPlanTemplate.docxExpectation.png.diff.win20251010185520.png differ diff --git a/TestFiles/HC002-Hebrew-01.docxExpectation.png.diff.win20251010182643.png b/TestFiles/HC002-Hebrew-01.docxExpectation.png.diff.win20251010182643.png new file mode 100644 index 00000000..93705282 Binary files /dev/null and b/TestFiles/HC002-Hebrew-01.docxExpectation.png.diff.win20251010182643.png differ diff --git a/TestFiles/HC002-Hebrew-01.docxExpectation.png.diff.win20251010185625.png b/TestFiles/HC002-Hebrew-01.docxExpectation.png.diff.win20251010185625.png new file mode 100644 index 00000000..af721249 Binary files /dev/null and b/TestFiles/HC002-Hebrew-01.docxExpectation.png.diff.win20251010185625.png differ diff --git a/TestFiles/HC003-Hebrew-02.docxExpectation.png.diff.win20251010182548.png b/TestFiles/HC003-Hebrew-02.docxExpectation.png.diff.win20251010182548.png new file mode 100644 index 00000000..ad62a18e Binary files /dev/null and b/TestFiles/HC003-Hebrew-02.docxExpectation.png.diff.win20251010182548.png differ diff --git a/TestFiles/HC003-Hebrew-02.docxExpectation.png.diff.win20251010185433.png b/TestFiles/HC003-Hebrew-02.docxExpectation.png.diff.win20251010185433.png new file mode 100644 index 00000000..181d7272 Binary files /dev/null and b/TestFiles/HC003-Hebrew-02.docxExpectation.png.diff.win20251010185433.png differ diff --git a/TestFiles/HC004-ResumeTemplate.docxExpectation.png.diff.win20251010182620.png b/TestFiles/HC004-ResumeTemplate.docxExpectation.png.diff.win20251010182620.png new file mode 100644 index 00000000..ab155ae7 Binary files /dev/null and b/TestFiles/HC004-ResumeTemplate.docxExpectation.png.diff.win20251010182620.png differ diff --git a/TestFiles/HC004-ResumeTemplate.docxExpectation.png.diff.win20251010185536.png b/TestFiles/HC004-ResumeTemplate.docxExpectation.png.diff.win20251010185536.png new file mode 100644 index 00000000..0082591d Binary files /dev/null and b/TestFiles/HC004-ResumeTemplate.docxExpectation.png.diff.win20251010185536.png differ diff --git a/TestFiles/HC005-TaskPlanTemplate.docxExpectation.png.diff.win20251010182625.png b/TestFiles/HC005-TaskPlanTemplate.docxExpectation.png.diff.win20251010182625.png new file mode 100644 index 00000000..52b1450e Binary files /dev/null and b/TestFiles/HC005-TaskPlanTemplate.docxExpectation.png.diff.win20251010182625.png differ diff --git a/TestFiles/HC005-TaskPlanTemplate.docxExpectation.png.diff.win20251010185604.png b/TestFiles/HC005-TaskPlanTemplate.docxExpectation.png.diff.win20251010185604.png new file mode 100644 index 00000000..2f24398c Binary files /dev/null and b/TestFiles/HC005-TaskPlanTemplate.docxExpectation.png.diff.win20251010185604.png differ diff --git a/TestFiles/HC006-Test-01.docxExpectation.png.diff.win20251010182558.png b/TestFiles/HC006-Test-01.docxExpectation.png.diff.win20251010182558.png new file mode 100644 index 00000000..b5ac2540 Binary files /dev/null and b/TestFiles/HC006-Test-01.docxExpectation.png.diff.win20251010182558.png differ diff --git a/TestFiles/HC006-Test-01.docxExpectation.png.diff.win20251010182658.png b/TestFiles/HC006-Test-01.docxExpectation.png.diff.win20251010182658.png new file mode 100644 index 00000000..b5ac2540 Binary files /dev/null and b/TestFiles/HC006-Test-01.docxExpectation.png.diff.win20251010182658.png differ diff --git a/TestFiles/HC006-Test-01.docxExpectation.png.diff.win20251010185445.png b/TestFiles/HC006-Test-01.docxExpectation.png.diff.win20251010185445.png new file mode 100644 index 00000000..800412cf Binary files /dev/null and b/TestFiles/HC006-Test-01.docxExpectation.png.diff.win20251010185445.png differ diff --git a/TestFiles/HC006-Test-01.docxExpectation.png.diff.win20251010185640.png b/TestFiles/HC006-Test-01.docxExpectation.png.diff.win20251010185640.png new file mode 100644 index 00000000..800412cf Binary files /dev/null and b/TestFiles/HC006-Test-01.docxExpectation.png.diff.win20251010185640.png differ diff --git a/TestFiles/HC007-Test-02.docxExpectation.png.diff.win20251010182601.png b/TestFiles/HC007-Test-02.docxExpectation.png.diff.win20251010182601.png new file mode 100644 index 00000000..b8e1cdf7 Binary files /dev/null and b/TestFiles/HC007-Test-02.docxExpectation.png.diff.win20251010182601.png differ diff --git a/TestFiles/HC007-Test-02.docxExpectation.png.diff.win20251010185458.png b/TestFiles/HC007-Test-02.docxExpectation.png.diff.win20251010185458.png new file mode 100644 index 00000000..81e24a9f Binary files /dev/null and b/TestFiles/HC007-Test-02.docxExpectation.png.diff.win20251010185458.png differ diff --git a/TestFiles/HC008-Test-03.docxExpectation.png.diff.win20251010182605.png b/TestFiles/HC008-Test-03.docxExpectation.png.diff.win20251010182605.png new file mode 100644 index 00000000..35c8994d Binary files /dev/null and b/TestFiles/HC008-Test-03.docxExpectation.png.diff.win20251010182605.png differ diff --git a/TestFiles/HC008-Test-03.docxExpectation.png.diff.win20251010185502.png b/TestFiles/HC008-Test-03.docxExpectation.png.diff.win20251010185502.png new file mode 100644 index 00000000..ba57b44c Binary files /dev/null and b/TestFiles/HC008-Test-03.docxExpectation.png.diff.win20251010185502.png differ diff --git a/TestFiles/HC009-Test-04.docxExpectation.png.diff.win20251010182553.png b/TestFiles/HC009-Test-04.docxExpectation.png.diff.win20251010182553.png new file mode 100644 index 00000000..f24d3cf3 Binary files /dev/null and b/TestFiles/HC009-Test-04.docxExpectation.png.diff.win20251010182553.png differ diff --git a/TestFiles/HC009-Test-04.docxExpectation.png.diff.win20251010185438.png b/TestFiles/HC009-Test-04.docxExpectation.png.diff.win20251010185438.png new file mode 100644 index 00000000..38fb949c Binary files /dev/null and b/TestFiles/HC009-Test-04.docxExpectation.png.diff.win20251010185438.png differ diff --git a/TestFiles/HC010-Test-05.docxExpectation.png.diff.win20251010182627.png b/TestFiles/HC010-Test-05.docxExpectation.png.diff.win20251010182627.png new file mode 100644 index 00000000..3fd3980e Binary files /dev/null and b/TestFiles/HC010-Test-05.docxExpectation.png.diff.win20251010182627.png differ diff --git a/TestFiles/HC010-Test-05.docxExpectation.png.diff.win20251010185607.png b/TestFiles/HC010-Test-05.docxExpectation.png.diff.win20251010185607.png new file mode 100644 index 00000000..081e95f7 Binary files /dev/null and b/TestFiles/HC010-Test-05.docxExpectation.png.diff.win20251010185607.png differ diff --git a/TestFiles/HC011-Test-06.docxExpectation.png.diff.win20251010182623.png b/TestFiles/HC011-Test-06.docxExpectation.png.diff.win20251010182623.png new file mode 100644 index 00000000..aa224e97 Binary files /dev/null and b/TestFiles/HC011-Test-06.docxExpectation.png.diff.win20251010182623.png differ diff --git a/TestFiles/HC011-Test-06.docxExpectation.png.diff.win20251010185542.png b/TestFiles/HC011-Test-06.docxExpectation.png.diff.win20251010185542.png new file mode 100644 index 00000000..12acc0f1 Binary files /dev/null and b/TestFiles/HC011-Test-06.docxExpectation.png.diff.win20251010185542.png differ diff --git a/TestFiles/HC012-Test-07.docxExpectation.png.diff.win20251010182542.png b/TestFiles/HC012-Test-07.docxExpectation.png.diff.win20251010182542.png new file mode 100644 index 00000000..9ddc662e Binary files /dev/null and b/TestFiles/HC012-Test-07.docxExpectation.png.diff.win20251010182542.png differ diff --git a/TestFiles/HC012-Test-07.docxExpectation.png.diff.win20251010185420.png b/TestFiles/HC012-Test-07.docxExpectation.png.diff.win20251010185420.png new file mode 100644 index 00000000..892cd5d2 Binary files /dev/null and b/TestFiles/HC012-Test-07.docxExpectation.png.diff.win20251010185420.png differ diff --git a/TestFiles/HC014-RTL-Table-01.docxExpectation.png.diff.win20251010182633.png b/TestFiles/HC014-RTL-Table-01.docxExpectation.png.diff.win20251010182633.png new file mode 100644 index 00000000..f7b6774b Binary files /dev/null and b/TestFiles/HC014-RTL-Table-01.docxExpectation.png.diff.win20251010182633.png differ diff --git a/TestFiles/HC014-RTL-Table-01.docxExpectation.png.diff.win20251010185612.png b/TestFiles/HC014-RTL-Table-01.docxExpectation.png.diff.win20251010185612.png new file mode 100644 index 00000000..9b42a6e9 Binary files /dev/null and b/TestFiles/HC014-RTL-Table-01.docxExpectation.png.diff.win20251010185612.png differ diff --git a/TestFiles/HC022-Table-Of-Contents.docxExpectation.png.diff.win20251010185505.png b/TestFiles/HC022-Table-Of-Contents.docxExpectation.png.diff.win20251010185505.png new file mode 100644 index 00000000..f6f39d2d Binary files /dev/null and b/TestFiles/HC022-Table-Of-Contents.docxExpectation.png.diff.win20251010185505.png differ diff --git a/TestFiles/HC023-Hyperlink.docxExpectation.png.diff.win20251010185525.png b/TestFiles/HC023-Hyperlink.docxExpectation.png.diff.win20251010185525.png new file mode 100644 index 00000000..632601e9 Binary files /dev/null and b/TestFiles/HC023-Hyperlink.docxExpectation.png.diff.win20251010185525.png differ diff --git a/TestFiles/HC024-Tabs-01.docxExpectation.png.diff.win20251010185558.png b/TestFiles/HC024-Tabs-01.docxExpectation.png.diff.win20251010185558.png new file mode 100644 index 00000000..7f5f6e68 Binary files /dev/null and b/TestFiles/HC024-Tabs-01.docxExpectation.png.diff.win20251010185558.png differ diff --git a/TestFiles/HC024-Tabs-01.docxExpectation.png.diff.win20251010200044.png b/TestFiles/HC024-Tabs-01.docxExpectation.png.diff.win20251010200044.png new file mode 100644 index 00000000..d98ac6fe Binary files /dev/null and b/TestFiles/HC024-Tabs-01.docxExpectation.png.diff.win20251010200044.png differ diff --git a/TestFiles/HC025-Tabs-02.docxExpectation.png.diff.win20251010185506.png b/TestFiles/HC025-Tabs-02.docxExpectation.png.diff.win20251010185506.png new file mode 100644 index 00000000..7f5f6e68 Binary files /dev/null and b/TestFiles/HC025-Tabs-02.docxExpectation.png.diff.win20251010185506.png differ diff --git a/TestFiles/HC025-Tabs-02.docxExpectation.png.diff.win20251010200039.png b/TestFiles/HC025-Tabs-02.docxExpectation.png.diff.win20251010200039.png new file mode 100644 index 00000000..d98ac6fe Binary files /dev/null and b/TestFiles/HC025-Tabs-02.docxExpectation.png.diff.win20251010200039.png differ diff --git a/TestFiles/HC026-Tabs-03.docxExpectation.png.diff.win20251010185456.png b/TestFiles/HC026-Tabs-03.docxExpectation.png.diff.win20251010185456.png new file mode 100644 index 00000000..32f684c7 Binary files /dev/null and b/TestFiles/HC026-Tabs-03.docxExpectation.png.diff.win20251010185456.png differ diff --git a/TestFiles/HC026-Tabs-03.docxExpectation.png.diff.win20251010200037.png b/TestFiles/HC026-Tabs-03.docxExpectation.png.diff.win20251010200037.png new file mode 100644 index 00000000..1bf637b5 Binary files /dev/null and b/TestFiles/HC026-Tabs-03.docxExpectation.png.diff.win20251010200037.png differ diff --git a/TestFiles/HC027-Tabs-04.docxExpectation.png.diff.win20251010185522.png b/TestFiles/HC027-Tabs-04.docxExpectation.png.diff.win20251010185522.png new file mode 100644 index 00000000..1d6a105e Binary files /dev/null and b/TestFiles/HC027-Tabs-04.docxExpectation.png.diff.win20251010185522.png differ diff --git a/TestFiles/HC027-Tabs-04.docxExpectation.png.diff.win20251010200041.png b/TestFiles/HC027-Tabs-04.docxExpectation.png.diff.win20251010200041.png new file mode 100644 index 00000000..d5e91030 Binary files /dev/null and b/TestFiles/HC027-Tabs-04.docxExpectation.png.diff.win20251010200041.png differ diff --git a/TestFiles/HC031-Complicated-Document.docxExpectation.png.diff.win20251010182648.png b/TestFiles/HC031-Complicated-Document.docxExpectation.png.diff.win20251010182648.png new file mode 100644 index 00000000..bba27803 Binary files /dev/null and b/TestFiles/HC031-Complicated-Document.docxExpectation.png.diff.win20251010182648.png differ diff --git a/TestFiles/HC031-Complicated-Document.docxExpectation.png.diff.win20251010185632.png b/TestFiles/HC031-Complicated-Document.docxExpectation.png.diff.win20251010185632.png new file mode 100644 index 00000000..24ee4348 Binary files /dev/null and b/TestFiles/HC031-Complicated-Document.docxExpectation.png.diff.win20251010185632.png differ diff --git a/TestFiles/HC031-Complicated-Document.docxExpectation.png.diff.win20251010200046.png b/TestFiles/HC031-Complicated-Document.docxExpectation.png.diff.win20251010200046.png new file mode 100644 index 00000000..699a5d68 Binary files /dev/null and b/TestFiles/HC031-Complicated-Document.docxExpectation.png.diff.win20251010200046.png differ diff --git a/TestFiles/HC040-Hyperlink-Fieldcode-01.docxExpectation.png.diff.win20251010182546.png b/TestFiles/HC040-Hyperlink-Fieldcode-01.docxExpectation.png.diff.win20251010182546.png new file mode 100644 index 00000000..a12d4593 Binary files /dev/null and b/TestFiles/HC040-Hyperlink-Fieldcode-01.docxExpectation.png.diff.win20251010182546.png differ diff --git a/TestFiles/HC040-Hyperlink-Fieldcode-01.docxExpectation.png.diff.win20251010185429.png b/TestFiles/HC040-Hyperlink-Fieldcode-01.docxExpectation.png.diff.win20251010185429.png new file mode 100644 index 00000000..aa48b896 Binary files /dev/null and b/TestFiles/HC040-Hyperlink-Fieldcode-01.docxExpectation.png.diff.win20251010185429.png differ diff --git a/TestFiles/HC045-Italic.docxExpectation.png.diff.win20251010182638.png b/TestFiles/HC045-Italic.docxExpectation.png.diff.win20251010182638.png new file mode 100644 index 00000000..d53de70b Binary files /dev/null and b/TestFiles/HC045-Italic.docxExpectation.png.diff.win20251010182638.png differ diff --git a/TestFiles/HC045-Italic.docxExpectation.png.diff.win20251010185616.png b/TestFiles/HC045-Italic.docxExpectation.png.diff.win20251010185616.png new file mode 100644 index 00000000..e3b70acb Binary files /dev/null and b/TestFiles/HC045-Italic.docxExpectation.png.diff.win20251010185616.png differ diff --git a/TestFiles/HC046-BoldAndItalic.docxExpectation.png.diff.win20251010182614.png b/TestFiles/HC046-BoldAndItalic.docxExpectation.png.diff.win20251010182614.png new file mode 100644 index 00000000..db8418b5 Binary files /dev/null and b/TestFiles/HC046-BoldAndItalic.docxExpectation.png.diff.win20251010182614.png differ diff --git a/TestFiles/HC046-BoldAndItalic.docxExpectation.png.diff.win20251010185517.png b/TestFiles/HC046-BoldAndItalic.docxExpectation.png.diff.win20251010185517.png new file mode 100644 index 00000000..f026bbe3 Binary files /dev/null and b/TestFiles/HC046-BoldAndItalic.docxExpectation.png.diff.win20251010185517.png differ diff --git a/TestFiles/HC048-Excerpt.docxExpectation.png.diff.win20251010182608.png b/TestFiles/HC048-Excerpt.docxExpectation.png.diff.win20251010182608.png new file mode 100644 index 00000000..f7596d01 Binary files /dev/null and b/TestFiles/HC048-Excerpt.docxExpectation.png.diff.win20251010182608.png differ diff --git a/TestFiles/HC048-Excerpt.docxExpectation.png.diff.win20251010185511.png b/TestFiles/HC048-Excerpt.docxExpectation.png.diff.win20251010185511.png new file mode 100644 index 00000000..e1a028a5 Binary files /dev/null and b/TestFiles/HC048-Excerpt.docxExpectation.png.diff.win20251010185511.png differ diff --git a/TestFiles/HC049-Borders.docxExpectation.png.diff.win20251010185424.png b/TestFiles/HC049-Borders.docxExpectation.png.diff.win20251010185424.png new file mode 100644 index 00000000..b2010ca3 Binary files /dev/null and b/TestFiles/HC049-Borders.docxExpectation.png.diff.win20251010185424.png differ diff --git a/TestFiles/HC053-Headings.docxExpectation.png.diff.win20251010182618.png b/TestFiles/HC053-Headings.docxExpectation.png.diff.win20251010182618.png new file mode 100644 index 00000000..731ae33e Binary files /dev/null and b/TestFiles/HC053-Headings.docxExpectation.png.diff.win20251010182618.png differ diff --git a/TestFiles/HC053-Headings.docxExpectation.png.diff.win20251010185528.png b/TestFiles/HC053-Headings.docxExpectation.png.diff.win20251010185528.png new file mode 100644 index 00000000..5aebabc4 Binary files /dev/null and b/TestFiles/HC053-Headings.docxExpectation.png.diff.win20251010185528.png differ diff --git a/TestFiles/HC055-GoogleDocsExport.docxExpectation.png.diff.win20251010182631.png b/TestFiles/HC055-GoogleDocsExport.docxExpectation.png.diff.win20251010182631.png new file mode 100644 index 00000000..839ed429 Binary files /dev/null and b/TestFiles/HC055-GoogleDocsExport.docxExpectation.png.diff.win20251010182631.png differ diff --git a/TestFiles/HC055-GoogleDocsExport.docxExpectation.png.diff.win20251010185610.png b/TestFiles/HC055-GoogleDocsExport.docxExpectation.png.diff.win20251010185610.png new file mode 100644 index 00000000..a0da418a Binary files /dev/null and b/TestFiles/HC055-GoogleDocsExport.docxExpectation.png.diff.win20251010185610.png differ diff --git a/TestFiles/HC061-Hyperlink-in-Field.docxExpectation.png.diff.win20251010182640.png b/TestFiles/HC061-Hyperlink-in-Field.docxExpectation.png.diff.win20251010182640.png new file mode 100644 index 00000000..1ffd1982 Binary files /dev/null and b/TestFiles/HC061-Hyperlink-in-Field.docxExpectation.png.diff.win20251010182640.png differ diff --git a/TestFiles/HC061-Hyperlink-in-Field.docxExpectation.png.diff.win20251010185621.png b/TestFiles/HC061-Hyperlink-in-Field.docxExpectation.png.diff.win20251010185621.png new file mode 100644 index 00000000..f59c4779 Binary files /dev/null and b/TestFiles/HC061-Hyperlink-in-Field.docxExpectation.png.diff.win20251010185621.png differ