diff --git a/itext.tests/itext.svg.tests/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest.cs b/itext.tests/itext.svg.tests/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest.cs index d3382693c2..91eb1c836c 100644 --- a/itext.tests/itext.svg.tests/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest.cs +++ b/itext.tests/itext.svg.tests/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest.cs @@ -179,6 +179,12 @@ public virtual void TSpanTextAnchorFunctionalTest() { ConvertAndCompare(SOURCE_FOLDER, DESTINATION_FOLDER, "textspan-textAnchor"); } + //Text-anchor test using transform attribute for X position + [NUnit.Framework.Test] + public virtual void TSpanTextAnchorTransformFunctionalTest() { + ConvertAndCompare(SOURCE_FOLDER, DESTINATION_FOLDER, "textspan-textAnchor-transform"); + } + [NUnit.Framework.Test] //TODO: update after DEVSIX-2507 and DEVSIX-3005 fix [LogMessage(iText.StyledXmlParser.Logs.StyledXmlParserLogMessageConstant.UNKNOWN_ABSOLUTE_METRIC_LENGTH_PARSED diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/cmp_textspan-textAnchor-transform.pdf b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/cmp_textspan-textAnchor-transform.pdf new file mode 100644 index 0000000000..8f9b14570b Binary files /dev/null and b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/cmp_textspan-textAnchor-transform.pdf differ diff --git a/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/textspan-textAnchor-transform.svg b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/textspan-textAnchor-transform.svg new file mode 100644 index 0000000000..31dcbc59f5 --- /dev/null +++ b/itext.tests/itext.svg.tests/resources/itext/svg/renderers/impl/TSpanNodeRendererIntegrationTest/textspan-textAnchor-transform.svg @@ -0,0 +1,144 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> + +<svg + xmlns="http://www.w3.org/2000/svg" + width="300" + height="600" + version="1.1"> + <defs> + <g id="originLines"> + <line x1="-1" y1="1" x2="1" y2="-1" stroke-width="0.2" stroke="blue"/> + <line x1="-1" y1="-1" x2="1" y2="1" stroke-width="0.2" stroke="blue"/> + + <line x2="30" y2="10" stroke-width="0.2" stroke="blue"/> + <circle cx="30" cy="10" r="0.5" fill="none" stroke="blue" stroke-width="0.2"/> + + <line x2="30" y2="20" stroke-width="0.2" stroke="blue"/> + <circle cx="30" cy="20" r="0.5" fill="none" stroke="blue" stroke-width="0.2"/> + + <line x2="30" y2="30" stroke-width="0.2" stroke="blue"/> + <circle cx="30" cy="30" r="0.5" fill="none" stroke="blue" stroke-width="0.2"/> + + <line x2="30" y2="40" stroke-width="0.2" stroke="blue"/> + <circle cx="30" cy="40" r="0.5" fill="none" stroke="blue" stroke-width="0.2"/> + </g> + <g id="verticalOriginLines"> + <line x1="-1" y1="1" x2="1" y2="-1" stroke-width="0.2" stroke="blue"/> + <line x1="-1" y1="-1" x2="1" y2="1" stroke-width="0.2" stroke="blue"/> + + <line x2="30" y2="10" stroke-width="0.2" stroke="blue"/> + <circle cx="30" cy="10" r="0.5" fill="none" stroke="blue" stroke-width="0.2"/> + + <line x2="40" y2="30" stroke-width="0.2" stroke="blue"/> + <circle cx="40" cy="30" r="0.5" fill="none" stroke="blue" stroke-width="0.2"/> + + <line x2="50" y2="50" stroke-width="0.2" stroke="blue"/> + <circle cx="50" cy="50" r="0.5" fill="none" stroke="blue" stroke-width="0.2"/> + + <line x2="60" y2="70" stroke-width="0.2" stroke="blue"/> + <circle cx="60" cy="70" r="0.5" fill="none" stroke="blue" stroke-width="0.2"/> + </g> + <g id="doubleOriginLines"> + <line x1="-1" y1="1" x2="1" y2="-1" stroke-width="0.2" stroke="blue"/> + <line x1="-1" y1="-1" x2="1" y2="1" stroke-width="0.2" stroke="blue"/> + + <line x2="60" y2="20" stroke-width="0.2" stroke="blue"/> + <circle cx="60" cy="20" r="0.5" fill="none" stroke="blue" stroke-width="0.2"/> + + <line x2="60" y2="40" stroke-width="0.2" stroke="blue"/> + <circle cx="60" cy="40" r="0.5" fill="none" stroke="blue" stroke-width="0.2"/> + + <line x2="60" y2="60" stroke-width="0.2" stroke="blue"/> + <circle cx="60" cy="60" r="0.5" fill="none" stroke="blue" stroke-width="0.2"/> + + <line x2="60" y2="80" stroke-width="0.2" stroke="blue"/> + <circle cx="60" cy="80" r="0.5" fill="none" stroke="blue" stroke-width="0.2"/> + </g> + </defs> + <rect width="300" height="600" stroke="red" fill="none"/> + <!-- On text elements --> + <g transform="translate(30,0)"> + <use href="#originLines"/> + <text font-size="10" font-family="Arial" + transform="translate(30,10)">no text anchor + </text> + <text font-size="10" font-family="Arial" + transform="translate(30,20)" + text-anchor="start">start text anchor + </text> + <text font-size="10" font-family="Arial" + transform="translate(30,30)" + text-anchor="middle">middle text anchor + </text> + <text font-size="10" font-family="Arial" + transform="translate(30,40)" + text-anchor="end">end text anchor + </text> + </g> + <!-- Text elements with rotational transformation --> + <g transform="translate(30,50)"> + <use href="#verticalOriginLines"/> + <text font-size="10" font-family="Arial" + transform="translate(30,10) rotate(90)">no text anchor + </text> + <text font-size="10" font-family="Arial" + transform="translate(40,30) rotate(90)" + text-anchor="start">start text anchor + </text> + <text font-size="10" font-family="Arial" + transform="translate(50,50) rotate(90)" + text-anchor="middle">middle text anchor + </text> + <text font-size="10" font-family="Arial" + transform="translate(60,70) rotate(90)" + text-anchor="end">end text anchor + </text> + </g> + <!-- Text elements with scaling transformation --> + <g transform="translate(30,150)"> + <use href="#originLines"/> + <text font-size="10" font-family="Arial" + transform="translate(30,10) scale(0.5)">no text anchor + </text> + <text font-size="10" font-family="Arial" + transform="translate(30,20) scale(0.5)" + text-anchor="start">start text anchor + </text> + <text font-size="10" font-family="Arial" + transform="translate(30,30) scale(0.5)" + text-anchor="middle">middle text anchor + </text> + <text font-size="10" font-family="Arial" + transform="translate(30,40) scale(0.5)" + text-anchor="end">end text anchor + </text> + </g> + <!-- Why not both? --> + <g transform="translate(30,200)"> + <use href="#doubleOriginLines"/> + <text font-size="10" font-family="Arial" + transform="translate(30,10)" + x="30" + y="10">no text anchor + </text> + <text font-size="10" font-family="Arial" + transform="translate(30,20)" + text-anchor="start" + x="30" + y="20">start text anchor + </text> + <text font-size="10" font-family="Arial" + transform="translate(30,30)" + text-anchor="middle" + x="30" + y="30">middle text anchor + </text> + <text font-size="10" font-family="Arial" + transform="translate(30,40)" + text-anchor="end" + x="30" + y="40" + >end text anchor + </text> + </g> +</svg> diff --git a/itext/itext.svg/itext/svg/renderers/impl/TextSvgBranchRenderer.cs b/itext/itext.svg/itext/svg/renderers/impl/TextSvgBranchRenderer.cs index 920d62b0d1..7e58ec672c 100644 --- a/itext/itext.svg/itext/svg/renderers/impl/TextSvgBranchRenderer.cs +++ b/itext/itext.svg/itext/svg/renderers/impl/TextSvgBranchRenderer.cs @@ -411,15 +411,11 @@ internal virtual float GetTextAnchorAlignmentCorrection(float childContentLength String textAnchorValue = this.GetAttribute(SvgConstants.Attributes.TEXT_ANCHOR); // Middle if (SvgConstants.Values.TEXT_ANCHOR_MIDDLE.Equals(textAnchorValue)) { - if (xPos != null && xPos.Length > 0) { - textAnchorXCorrection -= childContentLength / 2; - } + textAnchorXCorrection -= childContentLength / 2; } // End if (SvgConstants.Values.TEXT_ANCHOR_END.Equals(textAnchorValue)) { - if (xPos != null && xPos.Length > 0) { - textAnchorXCorrection -= childContentLength; - } + textAnchorXCorrection -= childContentLength; } } return textAnchorXCorrection;