From 49dd0b0ca2fcce4d62de13170cf18738dcf4e302 Mon Sep 17 00:00:00 2001 From: vderyushev Date: Fri, 9 Aug 2024 09:41:26 +0300 Subject: [PATCH 1/6] Removed extra code --- .../DocsExamples/Mail Merge and Reporting/Base operations.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Examples/DocsExamples/DocsExamples/Mail Merge and Reporting/Base operations.cs b/Examples/DocsExamples/DocsExamples/Mail Merge and Reporting/Base operations.cs index 50d5ffe3..36dab756 100644 --- a/Examples/DocsExamples/DocsExamples/Mail Merge and Reporting/Base operations.cs +++ b/Examples/DocsExamples/DocsExamples/Mail Merge and Reporting/Base operations.cs @@ -41,8 +41,6 @@ public void UseIfElseMustache() //ExStart:UseIfElseMustache //GistId:544788f602e697802e313a641cedb9b8 Document doc = new Document(MyDir + "Mail merge destinations - Mustache syntax.docx"); - doc.Sections.Clear(); - doc.Save(ArtifactsDir + "output.docx"); doc.MailMerge.UseNonMergeFields = true; doc.MailMerge.Execute(new[] { "GENDER" }, new object[] { "MALE" }); From ad1eab58e29c30e6c674c0bcd87632f0f2128a25 Mon Sep 17 00:00:00 2001 From: vderyushev Date: Mon, 12 Aug 2024 15:54:53 +0300 Subject: [PATCH 2/6] Updated API examples --- .../ApiExamples/ApiExamples.csproj | 10 +- .../Runner.MAUI/Runner.MAUI.csproj | 14 +- Examples/DocsExamples/Docker/Docker.csproj | 2 +- .../DocsExamples/DocsExamples.csproj | 10 +- .../CustomBarcodeGenerator.cs | 429 ++++++++++-------- .../DocumentExplorer/DocumentExplorer.csproj | 2 +- 6 files changed, 271 insertions(+), 196 deletions(-) diff --git a/Examples/ApiExamples/ApiExamples/ApiExamples.csproj b/Examples/ApiExamples/ApiExamples/ApiExamples.csproj index 8ffe2b8e..1ccca3b6 100644 --- a/Examples/ApiExamples/ApiExamples/ApiExamples.csproj +++ b/Examples/ApiExamples/ApiExamples/ApiExamples.csproj @@ -125,11 +125,11 @@ - - - - - + + + + + diff --git a/Examples/ApiExamples/Runner.MAUI/Runner.MAUI.csproj b/Examples/ApiExamples/Runner.MAUI/Runner.MAUI.csproj index 7b30d22a..f5e48b51 100644 --- a/Examples/ApiExamples/Runner.MAUI/Runner.MAUI.csproj +++ b/Examples/ApiExamples/Runner.MAUI/Runner.MAUI.csproj @@ -49,20 +49,20 @@ - - - - + + + + - + - + - + diff --git a/Examples/DocsExamples/Docker/Docker.csproj b/Examples/DocsExamples/Docker/Docker.csproj index 3bcedcee..8a13643d 100644 --- a/Examples/DocsExamples/Docker/Docker.csproj +++ b/Examples/DocsExamples/Docker/Docker.csproj @@ -6,7 +6,7 @@ - + diff --git a/Examples/DocsExamples/DocsExamples/DocsExamples.csproj b/Examples/DocsExamples/DocsExamples/DocsExamples.csproj index 2caba3a8..243afc8b 100644 --- a/Examples/DocsExamples/DocsExamples/DocsExamples.csproj +++ b/Examples/DocsExamples/DocsExamples/DocsExamples.csproj @@ -116,11 +116,11 @@ - - - - - + + + + + diff --git a/Examples/DocsExamples/DocsExamples/Programming with Documents/Working with Graphic Elements/CustomBarcodeGenerator.cs b/Examples/DocsExamples/DocsExamples/Programming with Documents/Working with Graphic Elements/CustomBarcodeGenerator.cs index eac134d7..0afe2cb6 100644 --- a/Examples/DocsExamples/DocsExamples/Programming with Documents/Working with Graphic Elements/CustomBarcodeGenerator.cs +++ b/Examples/DocsExamples/DocsExamples/Programming with Documents/Working with Graphic Elements/CustomBarcodeGenerator.cs @@ -1,240 +1,315 @@ +// Copyright (c) 2001-2024 Aspose Pty Ltd. All Rights Reserved. +// +// This file is part of Aspose.Words. The source code in this file +// is only intended as a supplement to the documentation, and is provided +// "as is", without warranty of any kind, either expressed or implied. +////////////////////////////////////////////////////////////////////////// + using System; -using System.Drawing; -using System.Globalization; -using Aspose.BarCode.Generation; +using System.IO; using Aspose.Words.Fields; -using BarcodeParameters = Aspose.Words.Fields.BarcodeParameters; -#if NET6_0 || __MOBILE__ -using Image = SkiaSharp.SKBitmap; -using Color = Aspose.Drawing.Color; +using Aspose.BarCode.Generation; +#if NET5_0_OR_GREATER +using SkiaSharp; +using Aspose.Drawing; +using Aspose.Drawing.Imaging; +#else +using System.Drawing; +using System.Drawing.Imaging; #endif -namespace DocsExamples.Programming_with_Documents.Working_with_Graphic_Elements +namespace DocsExamples { - //ExStart:CustomBarcodeGenerator - //GistId:00d34dba66626dbc0175b60bb3b71c8a - public class CustomBarcodeGenerator : DocsExamplesBase, IBarcodeGenerator + internal class CustomBarcodeGeneratorUtils { /// - /// Converts barcode image height from Word units to Aspose.BarCode units. + /// Converts a height value in twips to pixels using a default DPI of 96. /// - /// - /// - private static float ConvertSymbolHeight(string heightInTwipsString) + /// The height value in twips. + /// The default value to return if the conversion fails. + /// The height value in pixels. + public static double TwipsToPixels(string heightInTwips, double defVal) { - // Input value is in 1/1440 inches (twips). - int heightInTwips = TryParseInt(heightInTwipsString); - - if (heightInTwips == int.MinValue) - throw new Exception("Error! Incorrect height - " + heightInTwipsString + "."); - - // Convert to mm. - return (float) (heightInTwips * 25.4 / 1440); + return TwipsToPixels(heightInTwips, 96, defVal); } /// - /// Converts barcode image color from Word to Aspose.BarCode. + /// Converts a height value in twips to pixels based on the given resolution. /// - /// - /// - private static Color ConvertColor(string inputColor) + /// The height value in twips to be converted. + /// The resolution in pixels per inch. + /// The default value to be returned if the conversion fails. + /// The converted height value in pixels. + public static double TwipsToPixels(string heightInTwips, double resolution, double defVal) { - // Input should be from "0x000000" to "0xFFFFFF". - int color = TryParseHex(inputColor.Replace("0x", "")); - - if (color == int.MinValue) - throw new Exception("Error! Incorrect color - " + inputColor + "."); - - return Color.FromArgb(color >> 16, (color & 0xFF00) >> 8, color & 0xFF); - - // Backward conversion - - // return string.Format("0x{0,6:X6}", mControl.ForeColor.ToArgb() & 0xFFFFFF); + try + { + int lVal = int.Parse(heightInTwips); + return (lVal / 1440.0) * resolution; + } + catch + { + return defVal; + } } /// - /// Converts bar code scaling factor from percent to float. + /// Gets the rotation angle in degrees based on the given rotation angle string. /// - /// - /// - private static float ConvertScalingFactor(string scalingFactor) + /// The rotation angle string. + /// The default value to return if the rotation angle is not recognized. + /// The rotation angle in degrees. + public static float GetRotationAngle(string rotationAngle, float defVal) { - bool isParsed = false; - int percent = TryParseInt(scalingFactor); - - if (percent != int.MinValue && percent >= 10 && percent <= 10000) - isParsed = true; - - if (!isParsed) - throw new Exception("Error! Incorrect scaling factor - " + scalingFactor + "."); - - return percent / 100.0f; + switch (rotationAngle) + { + case "0": + return 0; + case "1": + return 270; + case "2": + return 180; + case "3": + return 90; + default: + return defVal; + } } /// - /// Implementation of the GetBarCodeImage() method for IBarCodeGenerator interface. + /// Converts a string representation of an error correction level to a QRErrorLevel enum value. /// - /// - /// - public Image GetBarcodeImage(BarcodeParameters parameters) + /// The string representation of the error correction level. + /// The default error correction level to return if the input is invalid. + /// The corresponding QRErrorLevel enum value. + public static QRErrorLevel GetQRCorrectionLevel(string errorCorrectionLevel, QRErrorLevel def) { - if (parameters.BarcodeType == null || parameters.BarcodeValue == null) - return null; - - BarcodeGenerator generator = new BarcodeGenerator(EncodeTypes.QR); - - string type = parameters.BarcodeType.ToUpper(); + switch (errorCorrectionLevel) + { + case "0": + return QRErrorLevel.LevelL; + case "1": + return QRErrorLevel.LevelM; + case "2": + return QRErrorLevel.LevelQ; + case "3": + return QRErrorLevel.LevelH; + default: + return def; + } + } - switch (type) + /// + /// Gets the barcode encode type based on the given encode type from Word. + /// + /// The encode type from Word. + /// The barcode encode type. + public static SymbologyEncodeType GetBarcodeEncodeType(string encodeTypeFromWord) + { + // https://support.microsoft.com/en-au/office/field-codes-displaybarcode-6d81eade-762d-4b44-ae81-f9d3d9e07be3 + switch (encodeTypeFromWord) { case "QR": - generator = new BarcodeGenerator(EncodeTypes.QR); - break; + return EncodeTypes.QR; case "CODE128": - generator = new BarcodeGenerator(EncodeTypes.Code128); - break; + return EncodeTypes.Code128; case "CODE39": - generator = new BarcodeGenerator(EncodeTypes.Code39Standard); - break; + return EncodeTypes.Code39; + case "JPPOST": + return EncodeTypes.RM4SCC; case "EAN8": - generator = new BarcodeGenerator(EncodeTypes.EAN8); - break; + case "JAN8": + return EncodeTypes.EAN8; case "EAN13": - generator = new BarcodeGenerator(EncodeTypes.EAN13); - break; + case "JAN13": + return EncodeTypes.EAN13; case "UPCA": - generator = new BarcodeGenerator(EncodeTypes.UPCA); - break; + return EncodeTypes.UPCA; case "UPCE": - generator = new BarcodeGenerator(EncodeTypes.UPCE); - break; - case "ITF14": - generator = new BarcodeGenerator(EncodeTypes.ITF14); - break; + return EncodeTypes.UPCE; case "CASE": - generator = new BarcodeGenerator(EncodeTypes.None); - break; + case "ITF14": + return EncodeTypes.ITF14; + case "NW7": + return EncodeTypes.Codabar; + default: + return EncodeTypes.None; } + } - if (generator.BarcodeType.Equals(EncodeTypes.None)) - return null; - - generator.CodeText = parameters.BarcodeValue; - - if (generator.BarcodeType.Equals(EncodeTypes.QR)) - generator.Parameters.Barcode.CodeTextParameters.TwoDDisplayText = parameters.BarcodeValue; - - if (parameters.ForegroundColor != null) - generator.Parameters.Barcode.BarColor = ConvertColor(parameters.ForegroundColor); - - if (parameters.BackgroundColor != null) - generator.Parameters.BackColor = ConvertColor(parameters.BackgroundColor); - - if (parameters.SymbolHeight != null) + /// + /// Converts a hexadecimal color string to a Color object. + /// + /// The hexadecimal color string to convert. + /// The default Color value to return if the conversion fails. + /// The Color object representing the converted color, or the default value if the conversion fails. + public static Color ConvertColor(string inputColor, Color defVal) + { + if (string.IsNullOrEmpty(inputColor)) return defVal; + try { - generator.Parameters.ImageHeight.Pixels = ConvertSymbolHeight(parameters.SymbolHeight); - generator.Parameters.AutoSizeMode = AutoSizeMode.None; + int color = Convert.ToInt32(inputColor, 16); + // Return Color.FromArgb((color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF); + return Color.FromArgb(color & 0xFF, (color >> 8) & 0xFF, (color >> 16) & 0xFF); } - - generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.None; - - if (parameters.DisplayText) - generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below; - - generator.Parameters.CaptionAbove.Text = ""; - - // Empiric scaling factor for converting Word barcode to Aspose.BarCode. - const float scale = 2.4f; - float xdim = 1.0f; - - if (generator.BarcodeType.Equals(EncodeTypes.QR)) + catch { - generator.Parameters.AutoSizeMode = AutoSizeMode.Nearest; - generator.Parameters.ImageWidth.Inches *= scale; - generator.Parameters.ImageHeight.Inches = generator.Parameters.ImageWidth.Inches; - xdim = generator.Parameters.ImageHeight.Inches / 25; - generator.Parameters.Barcode.XDimension.Inches = - generator.Parameters.Barcode.BarHeight.Inches = xdim; + return defVal; } + } - if (parameters.ScalingFactor != null) + /// + /// Calculates the scale factor based on the provided string representation. + /// + /// The string representation of the scale factor. + /// The default value to return if the scale factor cannot be parsed. + /// + /// The scale factor as a decimal value between 0 and 1, or the default value if the scale factor cannot be parsed. + /// + public static double ScaleFactor(string scaleFactor, double defVal) + { + try { - float scalingFactor = ConvertScalingFactor(parameters.ScalingFactor); - generator.Parameters.ImageHeight.Inches *= scalingFactor; - - if (generator.BarcodeType.Equals(EncodeTypes.QR)) - { - generator.Parameters.ImageWidth.Inches = generator.Parameters.ImageHeight.Inches; - generator.Parameters.Barcode.XDimension.Inches = - generator.Parameters.Barcode.BarHeight.Inches = xdim * scalingFactor; - } - - generator.Parameters.AutoSizeMode = AutoSizeMode.None; + int scale = int.Parse(scaleFactor); + return scale / 100.0; + } + catch + { + return defVal; } - -#if NET48 || JAVA - return generator.GenerateBarCodeImage(); - -#elif NET6_0 || __MOBILE__ - generator.GenerateBarCodeImage().Save(ArtifactsDir + "GetBarcodeImage.png"); - return Image.Decode(ArtifactsDir + "GetBarcodeImage.png"); -#endif } /// - /// Implementation of the GetOldBarcodeImage() method for IBarCodeGenerator interface. + /// Sets the position code style for a barcode generator. /// - /// - /// - public Image GetOldBarcodeImage(BarcodeParameters parameters) + /// The barcode generator. + /// The position code style to set. + /// The barcode value. + public static void SetPosCodeStyle(BarcodeGenerator gen, string posCodeStyle, string barcodeValue) { - if (parameters.PostalAddress == null) - return null; - - BarcodeGenerator generator = new BarcodeGenerator(EncodeTypes.Postnet) + switch (posCodeStyle) { - CodeText = parameters.PostalAddress - }; - -#if NET48 || JAVA - return generator.GenerateBarCodeImage(); -#elif NET6_0 || __MOBILE__ - generator.GenerateBarCodeImage().Save(ArtifactsDir + "OldBarcodeImage.png"); - return Image.Decode(ArtifactsDir + "OldBarcodeImage.png"); -#endif + // STD default and without changes. + case "SUP2": + gen.CodeText = barcodeValue.Substring(0, barcodeValue.Length - 2); + gen.Parameters.Barcode.Supplement.SupplementData = barcodeValue.Substring(barcodeValue.Length - 2, 2); + break; + case "SUP5": + gen.CodeText = barcodeValue.Substring(0, barcodeValue.Length - 5); + gen.Parameters.Barcode.Supplement.SupplementData = barcodeValue.Substring(barcodeValue.Length - 5, 5); + break; + case "CASE": + gen.Parameters.Border.Visible = true; + gen.Parameters.Border.Color = gen.Parameters.Barcode.BarColor; + gen.Parameters.Border.DashStyle = BorderDashStyle.Solid; + gen.Parameters.Border.Width.Pixels = gen.Parameters.Barcode.XDimension.Pixels * 5; + break; + } } + public const double DefaultQRXDimensionInPixels = 4.0; + public const double Default1DXDimensionInPixels = 1.0; + /// - /// Parses an integer using the invariant culture. Returns Int.MinValue if cannot parse. - /// - /// Allows leading sign. - /// Allows leading and trailing spaces. + /// Draws an error image with the specified exception message. /// - public static int TryParseInt(string s) + /// The exception containing the error message. + /// A Bitmap object representing the error image. + public static Bitmap DrawErrorImage(Exception error) { - return double.TryParse(s, NumberStyles.Integer, CultureInfo.InvariantCulture, out double temp) - ? CastDoubleToInt(temp) - : int.MinValue; + Bitmap bmp = new Bitmap(100, 100); + + using (Graphics grf = Graphics.FromImage(bmp)) +#if NET5_0_OR_GREATER + grf.DrawString(error.Message, new Aspose.Drawing.Font("Microsoft Sans Serif", 8f, FontStyle.Regular), Brushes.Red, new Rectangle(0, 0, bmp.Width, bmp.Height)); +#else + grf.DrawString(error.Message, new System.Drawing.Font("Microsoft Sans Serif", 8f, FontStyle.Regular), Brushes.Red, new Rectangle(0, 0, bmp.Width, bmp.Height)); +#endif + return bmp; } - /// - /// Casts a double to int32 in a way that uint32 are "correctly" casted too (they become negative numbers). - /// - public static int CastDoubleToInt(double value) +#if NET5_0_OR_GREATER + public static SKBitmap ConvertImageToWord(Bitmap bmp) { - long temp = (long) value; - return (int) temp; + MemoryStream ms = new MemoryStream(); + bmp.Save(ms, ImageFormat.Png); + ms.Position = 0; + + return SKBitmap.Decode(ms); + } +#else + public static Image ConvertImageToWord(Bitmap bmp) + { + return bmp; } +#endif + } - /// - /// Try parses a hex String into an integer value. - /// on error return int.MinValue - /// - public static int TryParseHex(string s) + internal class CustomBarcodeGenerator : IBarcodeGenerator + { +#if NET5_0_OR_GREATER + public SKBitmap GetBarcodeImage(Aspose.Words.Fields.BarcodeParameters parameters) +#else + public Image GetBarcodeImage(Aspose.Words.Fields.BarcodeParameters parameters) +#endif + { + try + { + BarcodeGenerator gen = new BarcodeGenerator(CustomBarcodeGeneratorUtils.GetBarcodeEncodeType(parameters.BarcodeType), parameters.BarcodeValue); + + // Set color. + gen.Parameters.Barcode.BarColor = CustomBarcodeGeneratorUtils.ConvertColor(parameters.ForegroundColor, gen.Parameters.Barcode.BarColor); + gen.Parameters.BackColor = CustomBarcodeGeneratorUtils.ConvertColor(parameters.BackgroundColor, gen.Parameters.BackColor); + + // Set display or hide text. + if (!parameters.DisplayText) + gen.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.None; + else + gen.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below; + + // Set QR Code error correction level.s + gen.Parameters.Barcode.QR.QrErrorLevel = QRErrorLevel.LevelH; + if (!string.IsNullOrEmpty(parameters.ErrorCorrectionLevel)) + gen.Parameters.Barcode.QR.QrErrorLevel = CustomBarcodeGeneratorUtils.GetQRCorrectionLevel(parameters.ErrorCorrectionLevel, gen.Parameters.Barcode.QR.QrErrorLevel); + + // Set rotation angle. + if (!string.IsNullOrEmpty(parameters.SymbolRotation)) + gen.Parameters.RotationAngle = CustomBarcodeGeneratorUtils.GetRotationAngle(parameters.SymbolRotation, gen.Parameters.RotationAngle); + + // Set scaling factor. + double scalingFactor = 1; + if (!string.IsNullOrEmpty(parameters.ScalingFactor)) + scalingFactor = CustomBarcodeGeneratorUtils.ScaleFactor(parameters.ScalingFactor, scalingFactor); + + // Set size. + if (gen.BarcodeType == EncodeTypes.QR) + gen.Parameters.Barcode.XDimension.Pixels = (float)Math.Max(1.0, Math.Round(CustomBarcodeGeneratorUtils.DefaultQRXDimensionInPixels * scalingFactor)); + else + gen.Parameters.Barcode.XDimension.Pixels = (float)Math.Max(1.0, Math.Round(CustomBarcodeGeneratorUtils.Default1DXDimensionInPixels * scalingFactor)); + + //Set height. + if (!string.IsNullOrEmpty(parameters.SymbolHeight)) + gen.Parameters.Barcode.BarHeight.Pixels = (float)Math.Max(5.0, Math.Round(CustomBarcodeGeneratorUtils.TwipsToPixels(parameters.SymbolHeight, gen.Parameters.Barcode.BarHeight.Pixels) * scalingFactor)); + + // Set style of a Point-of-Sale barcode. + if (!string.IsNullOrEmpty(parameters.PosCodeStyle)) + CustomBarcodeGeneratorUtils.SetPosCodeStyle(gen, parameters.PosCodeStyle, parameters.BarcodeValue); + + return CustomBarcodeGeneratorUtils.ConvertImageToWord(gen.GenerateBarCodeImage()); + } + catch (Exception e) + { + return CustomBarcodeGeneratorUtils.ConvertImageToWord(CustomBarcodeGeneratorUtils.DrawErrorImage(e)); + } + } + +#if NET5_0_OR_GREATER + public SKBitmap GetOldBarcodeImage(Aspose.Words.Fields.BarcodeParameters parameters) +#else + public Image GetOldBarcodeImage(Aspose.Words.Fields.BarcodeParameters parameters) +#endif { - return int.TryParse(s, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int result) - ? result - : int.MinValue; + throw new NotImplementedException(); } } - //ExEnd:CustomBarcodeGenerator } diff --git a/Examples/DocsExamples/DocumentExplorer/DocumentExplorer.csproj b/Examples/DocsExamples/DocumentExplorer/DocumentExplorer.csproj index 531a4346..b9b2290a 100644 --- a/Examples/DocsExamples/DocumentExplorer/DocumentExplorer.csproj +++ b/Examples/DocsExamples/DocumentExplorer/DocumentExplorer.csproj @@ -141,7 +141,7 @@ - 24.4.0 + 24.8.0 From c935943133e0a5857571d4765c68ea5b1bd80ce3 Mon Sep 17 00:00:00 2001 From: vderyushev Date: Tue, 13 Aug 2024 15:16:07 +0300 Subject: [PATCH 3/6] Updating test --- .../ApiExamples/ApiExamples/ExDocument.cs | 82 ++++++++++++++++++ Examples/Data/Header and footer types.docx | Bin 16924 -> 26164 bytes 2 files changed, 82 insertions(+) diff --git a/Examples/ApiExamples/ApiExamples/ExDocument.cs b/Examples/ApiExamples/ApiExamples/ExDocument.cs index 85fdbb72..b0233fb9 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocument.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocument.cs @@ -48,6 +48,88 @@ namespace ApiExamples [TestFixture] public class ExDocument : ApiExampleBase { + [Test] + public void SupportHF() + { + Document doc = new Document(MyDir + "Header and footer types.docx"); + + int sectIndex = 0; + foreach (Section s in doc.Sections) + { + foreach (CompositeNode hf in s.Body) + { + // Create a temporary document for rendering header content. + Document tmp = ConvertToImage(doc, hf); + tmp.Save(ArtifactsDir + $"hf_{sectIndex}.png"); + } + + sectIndex++; + } + } + + [Test] + public void RenderCell() + { + Document doc = new Document(MyDir + "Header and footer types.docx"); + + Cell cell = (Cell)doc.GetChild(NodeType.Cell, 2, true); + // Create a temporary document for rendering header content. + Document tmp = ConvertToImage(doc, cell); + tmp.Save(ArtifactsDir + "RenderCell.png"); + } + + private static Document ConvertToImage(Document doc, CompositeNode node) + { + // Create a temporary document for rendering header content. + Document tmp = (Document)doc.Clone(false); + tmp.Sections.Add(tmp.ImportNode(node.GetAncestor(NodeType.Section), false, ImportFormatMode.UseDestinationStyles)); + tmp.FirstSection.AppendChild(new Body(tmp)); + + // Copy content of the header to the temporary section. + Node currentNode = node; + while (!(currentNode.ParentNode is InlineStory || currentNode.ParentNode is Story || + currentNode.ParentNode is ShapeBase)) + { + CompositeNode parent = (CompositeNode)currentNode.ParentNode.Clone(false); + currentNode = currentNode.ParentNode; + parent.AppendChild(node.Clone(true)); + node = parent; // Store this new node to be inserted into the shape. + } + + tmp.FirstSection.Body.AppendChild(tmp.ImportNode(node, true, ImportFormatMode.UseDestinationStyles)); + + // Remove top and bottom margins. + tmp.FirstSection.PageSetup.TopMargin = 0; + tmp.FirstSection.PageSetup.BottomMargin = 0; + + // Use LayoutEnumerator to calculate the bottom edge fo visible content. + LayoutEnumerator enumerator = new LayoutEnumerator(tmp); + RectangleF rect = RectangleF.Empty; + rect = CalculateVisibleRect(enumerator, rect); + tmp.FirstSection.PageSetup.PageHeight = rect.Height; + Console.WriteLine(rect.Height); + tmp.UpdatePageLayout(); + + return tmp; + } + + private static RectangleF CalculateVisibleRect(LayoutEnumerator enumerator, RectangleF rect) + { + RectangleF result = rect; + do + { + if (enumerator.MoveFirstChild()) + { + if (enumerator.Type == LayoutEntityType.Line || enumerator.Type == LayoutEntityType.Span) + result = result.IsEmpty ? enumerator.Rectangle : RectangleF.Union(result, enumerator.Rectangle); + result = CalculateVisibleRect(enumerator, result); + enumerator.MoveParent(); + } + } while (enumerator.MoveNext()); + + return result; + } + [Test] public void CreateSimpleDocument() { diff --git a/Examples/Data/Header and footer types.docx b/Examples/Data/Header and footer types.docx index 405f760491dab6165baaf5e6d8d3b7c3af52a455..6fba6574ecccf13ba557788db882c0c014ff28fb 100644 GIT binary patch delta 20672 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 Date: Tue, 13 Aug 2024 15:17:47 +0300 Subject: [PATCH 4/6] Updated examples --- Examples/ApiExamples/ApiExamples/ExComment.cs | 6 +++--- Examples/ApiExamples/ApiExamples/ExXpsSaveOptions.cs | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Examples/ApiExamples/ApiExamples/ExComment.cs b/Examples/ApiExamples/ApiExamples/ExComment.cs index d1941a8f..deccca7a 100644 --- a/Examples/ApiExamples/ApiExamples/ExComment.cs +++ b/Examples/ApiExamples/ApiExamples/ExComment.cs @@ -109,18 +109,18 @@ public void RemoveCommentReplies() comment.AddReply("Joe Bloggs", "J.B.", DateTime.Now, "New reply"); comment.AddReply("Joe Bloggs", "J.B.", DateTime.Now, "Another reply"); - Assert.AreEqual(2, comment.Replies.Count()); + Assert.AreEqual(2, comment.Replies.Count); // Below are two ways of removing replies from a comment. // 1 - Use the "RemoveReply" method to remove replies from a comment individually: comment.RemoveReply(comment.Replies[0]); - Assert.AreEqual(1, comment.Replies.Count()); + Assert.AreEqual(1, comment.Replies.Count); // 2 - Use the "RemoveAllReplies" method to remove all replies from a comment at once: comment.RemoveAllReplies(); - Assert.AreEqual(0, comment.Replies.Count()); + Assert.AreEqual(0, comment.Replies.Count); //ExEnd } diff --git a/Examples/ApiExamples/ApiExamples/ExXpsSaveOptions.cs b/Examples/ApiExamples/ApiExamples/ExXpsSaveOptions.cs index f96cf2fd..17cd32dc 100644 --- a/Examples/ApiExamples/ApiExamples/ExXpsSaveOptions.cs +++ b/Examples/ApiExamples/ApiExamples/ExXpsSaveOptions.cs @@ -170,9 +170,11 @@ public void XpsDigitalSignature() Document doc = new Document(MyDir + "Document.docx"); CertificateHolder certificateHolder = CertificateHolder.Create(MyDir + "morzal.pfx", "aw"); - DigitalSignatureDetails digitalSignatureDetails = new DigitalSignatureDetails( - certificateHolder, - new SignOptions() { Comments = "Some comments", SignTime = DateTime.Now }); + SignOptions options = new SignOptions(); + options.SignTime = DateTime.Now; + options.Comments = "Some comments"; + + DigitalSignatureDetails digitalSignatureDetails = new DigitalSignatureDetails(certificateHolder, options); XpsSaveOptions saveOptions = new XpsSaveOptions(); saveOptions.DigitalSignatureDetails = digitalSignatureDetails; From 4dcdd620c52d5a906cefe22c738505d9380ffe29 Mon Sep 17 00:00:00 2001 From: vderyushev Date: Mon, 19 Aug 2024 11:47:22 +0300 Subject: [PATCH 5/6] Updated example --- .../ApiExamples/ApiExamples/ExDocument.cs | 82 ------- Examples/Data/Header and footer types.docx | Bin 26164 -> 19454 bytes .../Rendering shapes.cs | 223 ++++++++---------- 3 files changed, 99 insertions(+), 206 deletions(-) diff --git a/Examples/ApiExamples/ApiExamples/ExDocument.cs b/Examples/ApiExamples/ApiExamples/ExDocument.cs index b0233fb9..85fdbb72 100644 --- a/Examples/ApiExamples/ApiExamples/ExDocument.cs +++ b/Examples/ApiExamples/ApiExamples/ExDocument.cs @@ -48,88 +48,6 @@ namespace ApiExamples [TestFixture] public class ExDocument : ApiExampleBase { - [Test] - public void SupportHF() - { - Document doc = new Document(MyDir + "Header and footer types.docx"); - - int sectIndex = 0; - foreach (Section s in doc.Sections) - { - foreach (CompositeNode hf in s.Body) - { - // Create a temporary document for rendering header content. - Document tmp = ConvertToImage(doc, hf); - tmp.Save(ArtifactsDir + $"hf_{sectIndex}.png"); - } - - sectIndex++; - } - } - - [Test] - public void RenderCell() - { - Document doc = new Document(MyDir + "Header and footer types.docx"); - - Cell cell = (Cell)doc.GetChild(NodeType.Cell, 2, true); - // Create a temporary document for rendering header content. - Document tmp = ConvertToImage(doc, cell); - tmp.Save(ArtifactsDir + "RenderCell.png"); - } - - private static Document ConvertToImage(Document doc, CompositeNode node) - { - // Create a temporary document for rendering header content. - Document tmp = (Document)doc.Clone(false); - tmp.Sections.Add(tmp.ImportNode(node.GetAncestor(NodeType.Section), false, ImportFormatMode.UseDestinationStyles)); - tmp.FirstSection.AppendChild(new Body(tmp)); - - // Copy content of the header to the temporary section. - Node currentNode = node; - while (!(currentNode.ParentNode is InlineStory || currentNode.ParentNode is Story || - currentNode.ParentNode is ShapeBase)) - { - CompositeNode parent = (CompositeNode)currentNode.ParentNode.Clone(false); - currentNode = currentNode.ParentNode; - parent.AppendChild(node.Clone(true)); - node = parent; // Store this new node to be inserted into the shape. - } - - tmp.FirstSection.Body.AppendChild(tmp.ImportNode(node, true, ImportFormatMode.UseDestinationStyles)); - - // Remove top and bottom margins. - tmp.FirstSection.PageSetup.TopMargin = 0; - tmp.FirstSection.PageSetup.BottomMargin = 0; - - // Use LayoutEnumerator to calculate the bottom edge fo visible content. - LayoutEnumerator enumerator = new LayoutEnumerator(tmp); - RectangleF rect = RectangleF.Empty; - rect = CalculateVisibleRect(enumerator, rect); - tmp.FirstSection.PageSetup.PageHeight = rect.Height; - Console.WriteLine(rect.Height); - tmp.UpdatePageLayout(); - - return tmp; - } - - private static RectangleF CalculateVisibleRect(LayoutEnumerator enumerator, RectangleF rect) - { - RectangleF result = rect; - do - { - if (enumerator.MoveFirstChild()) - { - if (enumerator.Type == LayoutEntityType.Line || enumerator.Type == LayoutEntityType.Span) - result = result.IsEmpty ? enumerator.Rectangle : RectangleF.Union(result, enumerator.Rectangle); - result = CalculateVisibleRect(enumerator, result); - enumerator.MoveParent(); - } - } while (enumerator.MoveNext()); - - return result; - } - [Test] public void CreateSimpleDocument() { diff --git a/Examples/Data/Header and footer types.docx b/Examples/Data/Header and footer types.docx index 6fba6574ecccf13ba557788db882c0c014ff28fb..38a18543914266bb67d6949137ff341f036f98a1 100644 GIT binary patch delta 11857 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 - /// Renders any node in a document to the path specified using the image save options. + /// Renders any node in a document into an image. /// + /// The current document. /// The node to render. - /// The path to save the rendered image to. - /// The image options to use during rendering. This can be null. - public void RenderNode(Node node, string filePath, ImageSaveOptions imageOptions) + private static Document ConvertToImage(Document doc, CompositeNode node) { - if (imageOptions == null) - imageOptions = new ImageSaveOptions(FileFormatUtil.ExtensionToSaveFormat(Path.GetExtension(filePath))); - - // Store the paper color to be used on the final image and change to transparent. - // This will cause any content around the rendered node to be removed later on. - Color savePaperColor = imageOptions.PaperColor; - imageOptions.PaperColor = Color.Transparent; - - // There a bug which affects the cache of a cloned node. - // To avoid this, we clone the entire document, including all nodes, - // finding the matching node in the cloned document and rendering that instead. - Document doc = (Document) node.Document.Clone(true); - node = doc.GetChild(NodeType.Any, node.Document.GetChildNodes(NodeType.Any, true).IndexOf(node), true); - - // Create a temporary shape to store the target node in. This shape will be rendered to retrieve - // the rendered content of the node. - Shape shape = new Shape(doc, ShapeType.TextBox); - Section parentSection = (Section) node.GetAncestor(NodeType.Section); - - // Assume that the node cannot be larger than the page in size. - shape.Width = parentSection.PageSetup.PageWidth; - shape.Height = parentSection.PageSetup.PageHeight; - shape.FillColor = Color.Transparent; - - // Don't draw a surronding line on the shape. - shape.Stroked = false; - - // Move up through the DOM until we find a suitable node to insert into a Shape - // (a node with a parent can contain paragraphs, tables the same as a shape). Each parent node is cloned - // on the way up so even a descendant node passed to this method can be rendered. Since we are working - // with the actual nodes of the document we need to clone the target node into the temporary shape. - Node currentNode = node; - while (!(currentNode.ParentNode is InlineStory || currentNode.ParentNode is Story || - currentNode.ParentNode is ShapeBase)) - { - CompositeNode parent = (CompositeNode) currentNode.ParentNode.Clone(false); - currentNode = currentNode.ParentNode; - parent.AppendChild(node.Clone(true)); - node = parent; // Store this new node to be inserted into the shape. - } + Document tmp = CreateTemporaryDocument(doc, node); + AppendNodeContent(tmp, node); + AdjustDocumentLayout(tmp); + return tmp; + } - // We must add the shape to the document tree to have it rendered. - shape.AppendChild(node.Clone(true)); - parentSection.Body.FirstParagraph.AppendChild(shape); + /// + /// Creates a temporary document for further rendering. + /// + private static Document CreateTemporaryDocument(Document doc, CompositeNode node) + { + Document tmp = (Document)doc.Clone(false); + tmp.Sections.Add(tmp.ImportNode(node.GetAncestor(NodeType.Section), false, ImportFormatMode.UseDestinationStyles)); + tmp.FirstSection.AppendChild(new Body(tmp)); + tmp.FirstSection.PageSetup.TopMargin = 0; + tmp.FirstSection.PageSetup.BottomMargin = 0; - // Render the shape to stream so we can take advantage of the effects of the ImageSaveOptions class. - // Retrieve the rendered image and remove the shape from the document. - MemoryStream stream = new MemoryStream(); - ShapeRenderer renderer = shape.GetShapeRenderer(); - renderer.Save(stream, imageOptions); - shape.Remove(); + return tmp; + } - Rectangle crop = renderer.GetOpaqueBoundsInPixels(imageOptions.Scale, imageOptions.HorizontalResolution, - imageOptions.VerticalResolution); + /// + /// Adds a node to a temporary document. + /// + private static void AppendNodeContent(Document tmp, CompositeNode node) + { + if (node is HeaderFooter headerFooter) + foreach (Node hfNode in headerFooter.GetChildNodes(NodeType.Any, false)) + tmp.FirstSection.Body.AppendChild(tmp.ImportNode(hfNode, true, ImportFormatMode.UseDestinationStyles)); + else + AppendNonHeaderFooterContent(tmp, node); + } - using (Bitmap renderedImage = new Bitmap(stream)) + private static void AppendNonHeaderFooterContent(Document tmp, CompositeNode node) + { + Node parentNode = node.ParentNode; + while (!(parentNode is InlineStory || parentNode is Story || parentNode is ShapeBase)) { - Bitmap croppedImage = new Bitmap(crop.Width, crop.Height); - croppedImage.SetResolution(imageOptions.HorizontalResolution, imageOptions.VerticalResolution); - - // Create the final image with the proper background color. - using (Graphics g = Graphics.FromImage(croppedImage)) - { - g.Clear(savePaperColor); - g.DrawImage(renderedImage, new Rectangle(0, 0, croppedImage.Width, croppedImage.Height), crop.X, - crop.Y, crop.Width, crop.Height, GraphicsUnit.Pixel); + CompositeNode parent = (CompositeNode)parentNode.Clone(false); + parent.AppendChild(node.Clone(true)); + node = parent; - croppedImage.Save(filePath); - } + parentNode = parentNode.ParentNode; } + + tmp.FirstSection.Body.AppendChild(tmp.ImportNode(node, true, ImportFormatMode.UseDestinationStyles)); } /// - /// Finds the minimum bounding box around non-transparent pixels in a Bitmap. + /// Adjusts the layout of the document to fit the content area. /// - public Rectangle FindBoundingBoxAroundNode(Bitmap originalBitmap) + private static void AdjustDocumentLayout(Document tmp) { - Point min = new Point(int.MaxValue, int.MaxValue); - Point max = new Point(int.MinValue, int.MinValue); + LayoutEnumerator enumerator = new LayoutEnumerator(tmp); + RectangleF rect = RectangleF.Empty; + rect = CalculateVisibleRect(enumerator, rect); + + tmp.FirstSection.PageSetup.PageHeight = rect.Height; + tmp.UpdatePageLayout(); + } - for (int x = 0; x < originalBitmap.Width; ++x) + /// + /// Calculates the visible area of the content. + /// + private static RectangleF CalculateVisibleRect(LayoutEnumerator enumerator, RectangleF rect) + { + RectangleF result = rect; + do { - for (int y = 0; y < originalBitmap.Height; ++y) + if (enumerator.MoveFirstChild()) { - // Note that you can speed up this part of the algorithm using LockBits and unsafe code instead of GetPixel. - Color pixelColor = originalBitmap.GetPixel(x, y); - - // For each pixel that is not transparent, calculate the bounding box around it. - if (pixelColor.ToArgb() != Color.Empty.ToArgb()) - { - min.X = System.Math.Min(x, min.X); - min.Y = System.Math.Min(y, min.Y); - max.X = System.Math.Max(x, max.X); - max.Y = System.Math.Max(y, max.Y); - } + if (enumerator.Type == LayoutEntityType.Line || enumerator.Type == LayoutEntityType.Span) + result = result.IsEmpty ? enumerator.Rectangle : RectangleF.Union(result, enumerator.Rectangle); + result = CalculateVisibleRect(enumerator, result); + enumerator.MoveParent(); } - } + } while (enumerator.MoveNext()); - // Add one pixel to the width and height to avoid clipping. - return new Rectangle(min.X, min.Y, max.X - min.X + 1, max.Y - min.Y + 1); + return result; } } -} -#endif \ No newline at end of file +} \ No newline at end of file From b97fb52cf68a3f5504338284d5d8f9af82cdbdd4 Mon Sep 17 00:00:00 2001 From: vderyushev Date: Mon, 19 Aug 2024 12:04:37 +0300 Subject: [PATCH 6/6] Fixed document --- Examples/Data/Header and footer types.docx | Bin 19454 -> 16924 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Examples/Data/Header and footer types.docx b/Examples/Data/Header and footer types.docx index 38a18543914266bb67d6949137ff341f036f98a1..405f760491dab6165baaf5e6d8d3b7c3af52a455 100644 GIT binary patch delta 11351 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 delta 13892 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