Skip to content

Commit f211bc2

Browse files
committed
fix: image renderer should work for header and footer document part
1 parent 26c330d commit f211bc2

File tree

5 files changed

+33
-18
lines changed

5 files changed

+33
-18
lines changed

DocxTemplater.Markdown/MarkdownToOpenXmlRenderer.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-

2-
using DocumentFormat.OpenXml;
1+
using DocumentFormat.OpenXml;
32
using DocumentFormat.OpenXml.Packaging;
43
using DocumentFormat.OpenXml.Wordprocessing;
54
using DocxTemplater.Markdown.Renderer;
@@ -33,7 +32,8 @@ public MarkdownToOpenXmlRenderer(Paragraph parentElement,
3332
IImageService imageService)
3433
{
3534
// extract style from target run element
36-
m_targetRunProperties = ((Run)target.Parent).RunProperties;
35+
TargetText = target;
36+
m_targetRunProperties = ((Run)TargetText?.Parent)?.RunProperties;
3737
m_formatStack.Push(new Format(false, false, null, false));
3838
m_containingParagraphFromTemplate = parentElement;
3939
CurrentParagraph = parentElement;
@@ -48,7 +48,7 @@ public MarkdownToOpenXmlRenderer(Paragraph parentElement,
4848
ObjectRenderers.Add(new HtmlBlockRenderer());
4949
if (imageService != null)
5050
{
51-
ObjectRenderers.Add(new ImageInlineRenderer(mainDocumentPart, imageService));
51+
ObjectRenderers.Add(new ImageInlineRenderer(imageService));
5252
}
5353

5454

@@ -60,6 +60,8 @@ public MarkdownToOpenXmlRenderer(Paragraph parentElement,
6060

6161
public Paragraph CurrentParagraph { get; private set; }
6262

63+
public Text TargetText { get; }
64+
6365
public bool CurrentParagraphWasCreatedByMarkdown => CurrentParagraph != m_containingParagraphFromTemplate;
6466

6567
#if DEBUG

DocxTemplater.Markdown/Renderer/Inlines/ImageInlineRenderer.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using DocumentFormat.OpenXml.Packaging;
2-
using Markdig.Syntax.Inlines;
1+
using Markdig.Syntax.Inlines;
32
using System;
43
using System.Linq;
54
using DocumentFormat.OpenXml;
@@ -12,12 +11,10 @@ namespace DocxTemplater.Markdown.Renderer.Inlines
1211
{
1312
internal sealed class ImageInlineRenderer : OpenXmlObjectRenderer<LinkInline>
1413
{
15-
private readonly MainDocumentPart m_mainDocumentPart;
1614
private readonly IImageService m_imageService;
1715

18-
public ImageInlineRenderer(MainDocumentPart mainDocumentPart, IImageService imageService)
16+
public ImageInlineRenderer(IImageService imageService)
1917
{
20-
m_mainDocumentPart = mainDocumentPart;
2118
m_imageService = imageService;
2219
}
2320

@@ -28,7 +25,7 @@ protected override void Write(MarkdownToOpenXmlRenderer renderer, LinkInline obj
2825
return;
2926
}
3027

31-
var root = m_mainDocumentPart.RootElement;
28+
var root = renderer.TargetText.GetRoot();
3229
byte[] imageBytes;
3330

3431
try

DocxTemplater.Test/MarkdownRendererTest.cs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,9 @@ public void MarkdownWithBase64ImageWithoutImageFormatter()
275275
{
276276
{ "MyMarkdown", new ValueWithMetadata(markdownTextAndPic, new ValueMetadata("md")) },
277277
{ "MyOtherMarkdown", new ValueWithMetadata(markdownTextAndPic, new ValueMetadata("md")) },
278-
{ "MyNextMarkdown", new ValueWithMetadata(markdownTextAndPic, new ValueMetadata("md")) }
278+
{ "MyNextMarkdown", new ValueWithMetadata(markdownTextAndPic, new ValueMetadata("md")) },
279+
{ "Header", new ValueWithMetadata(markdownTextAndPic, new ValueMetadata("md")) },
280+
{ "Footer", new ValueWithMetadata(markdownTextAndPic, new ValueMetadata("md")) }
279281
});
280282

281283
var result = docTemplate.Process();
@@ -284,7 +286,7 @@ public void MarkdownWithBase64ImageWithoutImageFormatter()
284286
result.SaveAsFileAndOpenInWord();
285287
result.Position = 0;
286288
var document = WordprocessingDocument.Open(result, false);
287-
Assert.That(TestHelper.ComputeSha256Hash(document.MainDocumentPart.Document.Body.InnerXml), Is.EqualTo("80cefc6cbda5140f0196de9df6812c9db046bf7a59cee756e34348f4fba1b8d4"));
289+
Assert.That(TestHelper.ComputeSha256Hash(document.MainDocumentPart.Document.Body.InnerXml), Is.EqualTo("f53a467b63e86c7f766b1697a44e9a2965351d52dfb1c02bdc0b1b3118b20658"));
288290
}
289291

290292
[Test]
@@ -316,7 +318,9 @@ public void MarkdownWithBase64ImageShouldRenderPicture()
316318
{
317319
{ "MyMarkdown", new ValueWithMetadata(markdownTextAndPic, new ValueMetadata("md")) },
318320
{ "MyOtherMarkdown", new ValueWithMetadata(markdownPicOnly, new ValueMetadata("md")) },
319-
{ "MyNextMarkdown", new ValueWithMetadata(markdownTableAndPic, new ValueMetadata("md")) }
321+
{ "MyNextMarkdown", new ValueWithMetadata(markdownTableAndPic, new ValueMetadata("md")) },
322+
{ "Header", new ValueWithMetadata(markdownTextAndPic, new ValueMetadata("md")) },
323+
{ "Footer", new ValueWithMetadata(markdownTextAndPic, new ValueMetadata("md")) }
320324
});
321325

322326
var result = docTemplate.Process();
@@ -325,12 +329,24 @@ public void MarkdownWithBase64ImageShouldRenderPicture()
325329
result.SaveAsFileAndOpenInWord();
326330
result.Position = 0;
327331
var document = WordprocessingDocument.Open(result, false);
328-
var drawings = document.MainDocumentPart.Document.Body.Descendants<Drawing>();
329-
int imageCount = drawings
332+
var mainDrawings = document.MainDocumentPart.Document.Body.Descendants<Drawing>();
333+
int mainImageCount = mainDrawings
330334
.Select(d => d.Descendants<GraphicData>()
331335
.Any(gd => gd.Uri == "http://schemas.openxmlformats.org/drawingml/2006/picture"))
332336
.Count(b => b);
333-
Assert.That(imageCount, Is.EqualTo(10), "Expected 10 images in the document, but found a different number.");
337+
var headerDrawings = document.MainDocumentPart.HeaderParts.Single().Header.Descendants<Drawing>();
338+
int headerImageCount = headerDrawings
339+
.Select(d => d.Descendants<GraphicData>()
340+
.Any(gd => gd.Uri == "http://schemas.openxmlformats.org/drawingml/2006/picture"))
341+
.Count(b => b);
342+
var footerDrawings = document.MainDocumentPart.FooterParts.Single().Footer.Descendants<Drawing>();
343+
int footerImageCount = footerDrawings
344+
.Select(d => d.Descendants<GraphicData>()
345+
.Any(gd => gd.Uri == "http://schemas.openxmlformats.org/drawingml/2006/picture"))
346+
.Count(b => b);
347+
Assert.That(mainImageCount, Is.EqualTo(10), "Expected 10 images in the document, but found a different number.");
348+
Assert.That(headerImageCount, Is.EqualTo(1), "Expected 10 images in the document, but found a different number.");
349+
Assert.That(footerImageCount, Is.EqualTo(1), "Expected 10 images in the document, but found a different number.");
334350
}
335351

336352
[Test]
Binary file not shown.

DocxTemplater/DocxTemplate.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,12 @@ public Stream Process()
9999
return m_stream;
100100
}
101101
Processed = true;
102-
foreach (var header in m_wpDocument.MainDocumentPart.HeaderParts)
102+
foreach (var header in m_wpDocument.MainDocumentPart.HeaderParts.ToList())
103103
{
104104
ProcessNode(header.Header);
105105
}
106106
ProcessNode(m_wpDocument.MainDocumentPart.RootElement);
107-
foreach (var footer in m_wpDocument.MainDocumentPart.FooterParts)
107+
foreach (var footer in m_wpDocument.MainDocumentPart.FooterParts.ToList())
108108
{
109109
ProcessNode(footer.Footer);
110110
}

0 commit comments

Comments
 (0)