Skip to content

Commit 257efc2

Browse files
ar3emiText-CI
authored andcommitted
SVG: Add possibility to customize renderers for text chunks
DEVSIX-5428 Autoported commit. Original commit hash: [9a0af2f67]
1 parent 9cbd170 commit 257efc2

File tree

6 files changed

+89
-2
lines changed

6 files changed

+89
-2
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
using System;
2+
using iText.Kernel.Colors;
3+
using iText.Kernel.Geom;
4+
using iText.Kernel.Pdf;
5+
using iText.Kernel.Pdf.Canvas;
6+
using iText.Kernel.Pdf.Xobject;
7+
using iText.Kernel.Utils;
8+
using iText.StyledXmlParser.Node;
9+
using iText.Svg;
10+
using iText.Svg.Converter;
11+
using iText.Svg.Processors.Impl;
12+
using iText.Svg.Renderers;
13+
using iText.Svg.Renderers.Factories;
14+
using iText.Svg.Renderers.Impl;
15+
using iText.Test;
16+
17+
namespace iText.Svg.Customization {
18+
public class CustomizeTextLeafSvgNodeRendererTest : SvgIntegrationTest {
19+
public static readonly String SOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext
20+
.CurrentContext.TestDirectory) + "/resources/itext/svg/customization/CustomizeTextLeafSvgNodeRendererTest/";
21+
22+
public static readonly String DESTINATION_FOLDER = NUnit.Framework.TestContext.CurrentContext.TestDirectory
23+
+ "/test/itext/svg/customization/CustomizeTextLeafSvgNodeRendererTest/";
24+
25+
[NUnit.Framework.OneTimeSetUp]
26+
public static void BeforeClass() {
27+
ITextTest.CreateDestinationFolder(DESTINATION_FOLDER);
28+
}
29+
30+
[NUnit.Framework.Test]
31+
public virtual void TestCustomizeTextLeafSvgNodeRenderer() {
32+
String pdfFilename = "customizeTextLeafSvgNodeRenderer.pdf";
33+
PdfDocument doc = new PdfDocument(new PdfWriter(DESTINATION_FOLDER + pdfFilename));
34+
doc.AddNewPage();
35+
SvgConverterProperties properties = new SvgConverterProperties();
36+
properties.SetRendererFactory(new CustomizeTextLeafSvgNodeRendererTest.CustomTextLeafOverridingSvgNodeRendererFactory
37+
());
38+
String svg = "<svg viewBox=\"0 0 240 80\" xmlns=\"http://www.w3.org/2000/svg\">\n" + " <text x=\"20\" y=\"35\" class=\"small\">Hello world</text>\n"
39+
+ "</svg>";
40+
PdfFormXObject form = SvgConverter.ConvertToXObject(svg, doc, properties);
41+
new PdfCanvas(doc.GetPage(1)).AddXObjectFittedIntoRectangle(form, new Rectangle(100, 100, 240, 80));
42+
doc.Close();
43+
NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(DESTINATION_FOLDER + pdfFilename, SOURCE_FOLDER
44+
+ "cmp_" + pdfFilename, DESTINATION_FOLDER, "diff_"));
45+
}
46+
47+
private class CustomTextLeafOverridingSvgNodeRendererFactory : DefaultSvgNodeRendererFactory {
48+
public override ISvgNodeRenderer CreateSvgNodeRendererForTag(IElementNode tag, ISvgNodeRenderer parent) {
49+
if (SvgConstants.Tags.TEXT_LEAF.Equals(tag.Name())) {
50+
return new CustomizeTextLeafSvgNodeRendererTest.CustomTextLeafSvgNodeRenderer();
51+
}
52+
else {
53+
return base.CreateSvgNodeRendererForTag(tag, parent);
54+
}
55+
}
56+
}
57+
58+
private class CustomTextLeafSvgNodeRenderer : TextLeafSvgNodeRenderer {
59+
public override ISvgNodeRenderer CreateDeepCopy() {
60+
CustomizeTextLeafSvgNodeRendererTest.CustomTextLeafSvgNodeRenderer copy = new CustomizeTextLeafSvgNodeRendererTest.CustomTextLeafSvgNodeRenderer
61+
();
62+
DeepCopyAttributesAndStyles(copy);
63+
return copy;
64+
}
65+
66+
protected internal override void DoDraw(SvgDrawContext context) {
67+
if (this.attributesAndStyles != null && this.attributesAndStyles.ContainsKey(SvgConstants.Attributes.TEXT_CONTENT
68+
)) {
69+
PdfCanvas currentCanvas = context.GetCurrentCanvas();
70+
currentCanvas.SetFillColor(ColorConstants.RED);
71+
currentCanvas.MoveText(context.GetTextMove()[0], context.GetTextMove()[1]);
72+
String initialText = this.attributesAndStyles.Get(SvgConstants.Attributes.TEXT_CONTENT);
73+
String amendedText = "_" + initialText + "_";
74+
currentCanvas.ShowText(amendedText);
75+
}
76+
}
77+
}
78+
}
79+
}

itext/itext.svg/itext/svg/SvgConstants.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,9 @@ public sealed class Tags {
330330
/// <since>7.1.2</since>
331331
public const String TEXT = "text";
332332

333+
/// <summary>Phantom tag for text leaf.</summary>
334+
public const String TEXT_LEAF = ":text-leaf";
335+
333336
/// <summary>Tag defining a path on which text can be drawn.</summary>
334337
public const String TEXT_PATH = "textPath";
335338

itext/itext.svg/itext/svg/processors/impl/DefaultSvgProcessor.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ source product.
4444
using System.Collections.Generic;
4545
using iText.StyledXmlParser.Css;
4646
using iText.StyledXmlParser.Node;
47+
using iText.StyledXmlParser.Node.Impl.Jsoup.Node;
4748
using iText.Svg;
4849
using iText.Svg.Css.Impl;
4950
using iText.Svg.Exceptions;
@@ -234,7 +235,10 @@ private void ProcessText(ITextNode textNode) {
234235
if (parentRenderer is TextSvgBranchRenderer) {
235236
String wholeText = textNode.WholeText();
236237
if (!"".Equals(wholeText) && !SvgTextUtil.IsOnlyWhiteSpace(wholeText)) {
237-
TextLeafSvgNodeRenderer textLeaf = new TextLeafSvgNodeRenderer();
238+
IElementNode textLeafElement = new JsoupElementNode(new iText.StyledXmlParser.Jsoup.Nodes.Element(iText.StyledXmlParser.Jsoup.Parser.Tag
239+
.ValueOf(SvgConstants.Tags.TEXT_LEAF), ""));
240+
ISvgTextNodeRenderer textLeaf = (ISvgTextNodeRenderer)this.rendererFactory.CreateSvgNodeRendererForTag(textLeafElement
241+
, parentRenderer);
238242
textLeaf.SetParent(parentRenderer);
239243
textLeaf.SetAttribute(SvgConstants.Attributes.TEXT_CONTENT, wholeText);
240244
((TextSvgBranchRenderer)parentRenderer).AddChild(textLeaf);

itext/itext.svg/itext/svg/renderers/factories/DefaultSvgNodeRendererMapper.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public virtual IDictionary<String, Type> GetMapping() {
8888
result.Put(SvgConstants.Tags.TEXT, typeof(TextSvgBranchRenderer));
8989
result.Put(SvgConstants.Tags.TSPAN, typeof(TextSvgTSpanBranchRenderer));
9090
result.Put(SvgConstants.Tags.USE, typeof(UseSvgNodeRenderer));
91+
result.Put(SvgConstants.Tags.TEXT_LEAF, typeof(TextLeafSvgNodeRenderer));
9192
return result;
9293
}
9394

port-hash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
e1a23805224ab56798adce94240ba5958890c466
1+
9a0af2f6776cbf324e0d7d108e64cc32e8b65187

0 commit comments

Comments
 (0)