diff --git a/itext.tests/itext.svg.tests/itext/svg/utils/TransformUtilsTest.cs b/itext.tests/itext.svg.tests/itext/svg/utils/TransformUtilsTest.cs index 6f14531b1..0acd05cd1 100644 --- a/itext.tests/itext.svg.tests/itext/svg/utils/TransformUtilsTest.cs +++ b/itext.tests/itext.svg.tests/itext/svg/utils/TransformUtilsTest.cs @@ -21,6 +21,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ using System; +using iText.Commons.Utils; using iText.Kernel.Geom; using iText.Svg.Exceptions; using iText.Test; @@ -173,5 +174,29 @@ public virtual void MixedWhiteSpace() { AffineTransform expected = AffineTransform.GetTranslateInstance(2.25, 0); NUnit.Framework.Assert.AreEqual(expected, actual); } + + [NUnit.Framework.Test] + public virtual void ParseInvalidRotateTest() { + Exception e = NUnit.Framework.Assert.Catch(typeof(SvgProcessingException), () => TransformUtils.ParseTransform + ("rotate(text)")); + NUnit.Framework.Assert.AreEqual(MessageFormatUtil.Format(SvgExceptionMessageConstant.INVALID_TRANSFORM_VALUE + , "text"), e.Message); + } + + [NUnit.Framework.Test] + public virtual void ParseInvalidSkewXTest() { + Exception e = NUnit.Framework.Assert.Catch(typeof(SvgProcessingException), () => TransformUtils.ParseTransform + ("skewX(text)")); + NUnit.Framework.Assert.AreEqual(MessageFormatUtil.Format(SvgExceptionMessageConstant.INVALID_TRANSFORM_VALUE + , "text"), e.Message); + } + + [NUnit.Framework.Test] + public virtual void ParseInvalidSkewYTest() { + Exception e = NUnit.Framework.Assert.Catch(typeof(SvgProcessingException), () => TransformUtils.ParseTransform + ("skewY(text)")); + NUnit.Framework.Assert.AreEqual(MessageFormatUtil.Format(SvgExceptionMessageConstant.INVALID_TRANSFORM_VALUE + , "text"), e.Message); + } } } diff --git a/itext/itext.svg/itext/svg/exceptions/SvgExceptionMessageConstant.cs b/itext/itext.svg/itext/svg/exceptions/SvgExceptionMessageConstant.cs index e577af0ef..5d7e1c199 100644 --- a/itext/itext.svg/itext/svg/exceptions/SvgExceptionMessageConstant.cs +++ b/itext/itext.svg/itext/svg/exceptions/SvgExceptionMessageConstant.cs @@ -56,6 +56,8 @@ public sealed class SvgExceptionMessageConstant { public const String INVALID_TRANSFORM_DECLARATION = "Transformation declaration is not formed correctly."; + public const String INVALID_TRANSFORM_VALUE = "Invalid transformation value: {0}"; + public const String LINE_TO_EXPECTS_FOLLOWING_PARAMETERS_GOT_0 = "(x y)+ parameters are expected for lineTo operator. Got: {0}"; public const String MOVE_TO_EXPECTS_FOLLOWING_PARAMETERS_GOT_0 = "(x y)+ parameters are expected for moveTo operator. Got: {0}"; diff --git a/itext/itext.svg/itext/svg/utils/TransformUtils.cs b/itext/itext.svg/itext/svg/utils/TransformUtils.cs index 47fd03a38..1c32992bc 100644 --- a/itext/itext.svg/itext/svg/utils/TransformUtils.cs +++ b/itext/itext.svg/itext/svg/utils/TransformUtils.cs @@ -203,7 +203,7 @@ private static AffineTransform CreateSkewYTransformation(IList values) { if (values.Count != 1) { throw new SvgProcessingException(SvgExceptionMessageConstant.TRANSFORM_INCORRECT_NUMBER_OF_VALUES); } - double tan = Math.Tan(MathUtil.ToRadians((float)CssDimensionParsingUtils.ParseFloat(values[0]))); + double tan = Math.Tan(MathUtil.ToRadians(ParseTransformationValue(values[0]))); //Differs from the notation in the PDF-spec for skews return new AffineTransform(1, tan, 0, 1, 0, 0); } @@ -215,7 +215,7 @@ private static AffineTransform CreateSkewXTransformation(IList values) { if (values.Count != 1) { throw new SvgProcessingException(SvgExceptionMessageConstant.TRANSFORM_INCORRECT_NUMBER_OF_VALUES); } - double tan = Math.Tan(MathUtil.ToRadians((float)CssDimensionParsingUtils.ParseFloat(values[0]))); + double tan = Math.Tan(MathUtil.ToRadians(ParseTransformationValue(values[0]))); //Differs from the notation in the PDF-spec for skews return new AffineTransform(1, 0, tan, 1, 0, 0); } @@ -227,7 +227,7 @@ private static AffineTransform CreateRotationTransformation(IList values if (values.Count != 1 && values.Count != 3) { throw new SvgProcessingException(SvgExceptionMessageConstant.TRANSFORM_INCORRECT_NUMBER_OF_VALUES); } - double angle = MathUtil.ToRadians((float)CssDimensionParsingUtils.ParseFloat(values[0])); + double angle = MathUtil.ToRadians(ParseTransformationValue(values[0])); if (values.Count == 3) { float centerX = CssDimensionParsingUtils.ParseAbsoluteLength(values[1]); float centerY = CssDimensionParsingUtils.ParseAbsoluteLength(values[2]); @@ -294,5 +294,16 @@ private static IList GetValuesFromTransformationString(String transforma String numbers = transformation.JSubstring(transformation.IndexOf('(') + 1, transformation.IndexOf(')')); return SvgCssUtils.SplitValueList(numbers); } + + private static float ParseTransformationValue(String valueStr) { + float? valueParsed = CssDimensionParsingUtils.ParseFloat(valueStr); + if (valueParsed == null) { + throw new SvgProcessingException(MessageFormatUtil.Format(SvgExceptionMessageConstant.INVALID_TRANSFORM_VALUE + , valueStr)); + } + else { + return (float)valueParsed; + } + } } } diff --git a/port-hash b/port-hash index 9c06efa54..31eca6a60 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -13be9701c7d28b13ec07d9b6244825b95f6e62a3 +8d4fbb6308e2126af33891bf5ad981ec9f2fd81b