使用 xslt 模板将多个图像添加到 docx 文件

Posted

技术标签:

【中文标题】使用 xslt 模板将多个图像添加到 docx 文件【英文标题】:Adding multiple images to a docx file using xslt template 【发布时间】:2021-04-10 11:05:42 【问题描述】:

所以我需要生成一个 docx 文件用于报告目的。该报告包含文本、表格和大量图像。 到目前为止,我设法添加了文本和表格(并使用 xslt 转换根据我的 xml 内容填充它)。 但是,我坚持添加图像。我找到了一些如何使用 C# 添加图像的示例,但我认为这不是我需要的。我需要使用我的 xslt 格式化文档并将图像添加到正确的位置(例如在表格单元格中)。是否可以使用 xslt 添加一个容器,该容器使用文件路径来显示/嵌入类似于 html 中的<img> 标记的图像? 我知道 docx 格式基本上是一个包含文件结构的 zip,要嵌入图像,我也应该将它添加到这个文件结构中。

感谢任何示例或参考。

让您了解我的代码:

XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(xsltFile);

StringWriter stringWriter = new StringWriter();
XmlWriter xmlWriter = XmlWriter.Create(stringWriter);

transform.Transform(xmlFile, xmlWriter);

XmlDocument newWordContent = new XmlDocument();
newWordContent.LoadXml(stringWriter.ToString());

File.Copy(docXtemplate, outputFilename, true);

using (WordprocessingDocument myDoc = WordprocessingDocument.Open(outputFilename, true))

    MainDocumentPart mainPart = myDoc.MainDocumentPart;

    Body body = new Body(newWordContent.DocumentElement.InnerXml);
    DocumentFormat.OpenXml.Wordprocessing.Document document = new DocumentFormat.OpenXml.Wordprocessing.Document(body);
    document.Save(mainPart);

它基本上替换了现有 docx 文件的正文。这使我能够使用所有格式等。 xslt文件是通过调整docx中的document.xml文件生成的。

更新

好的,所以我想出了如何将图像添加到 docx 文件目录,见下文

using (WordprocessingDocument myDoc = WordprocessingDocument.Open(outputFilename, true))

    MainDocumentPart mainPart = myDoc.MainDocumentPart;

    ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Png);
    using (FileStream stream = new FileStream(imageFile, FileMode.Open))
    
       imagePart.FeedData(stream);
    

    Body body = new Body(newWordContent.DocumentElement.InnerXml);
    DocumentFormat.OpenXml.Wordprocessing.Document document = new 
    DocumentFormat.OpenXml.Wordprocessing.Document(body);
    document.Save(mainPart);

这会将图像添加到 docx 结构中。我还检查了关系,这存在于“document.xml.rels”文件中。当我使用这个 id 并在我的 xslt 中使用它来将图像添加到文档中(用于测试)时,我确实看到了使用 Word 打开时图像应该位于的区域,但是它说:无法显示带有红十字的图像。 我注意到的一个区别是原始docx中的图像保存在“word\media”中,而带有上述代码的添加图像被添加到“media”中。不确定这是不是问题

【问题讨论】:

这能回答你的问题吗? Inserting images from XML to XSL document 不,这不能回答我的问题。他们正在创建一个 html 页面,我想创建一个 *.docx 文件。 【参考方案1】:

好吧,我想我想通了。

XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(xsltFile);

StringWriter stringWriter = new StringWriter();
XmlWriter xmlWriter = XmlWriter.Create(stringWriter);

transform.Transform(xmlFile, xmlWriter);

XmlDocument newWordContent = new XmlDocument();
newWordContent.LoadXml(stringWriter.ToString());

using (WordprocessingDocument myDoc = WordprocessingDocument.Open(outputFilename, true))

    MainDocumentPart mainPart = myDoc.MainDocumentPart;

    ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Png, "imgId");
    using (FileStream stream = new FileStream(imageFile, FileMode.Open))
    
       imagePart.FeedData(stream);
    

    Body body = new Body(newWordContent.DocumentElement.InnerXml);
    DocumentFormat.OpenXml.Wordprocessing.Document document = new 
    DocumentFormat.OpenXml.Wordprocessing.Document(body);
    document.Save(mainPart);

上面的代码会在你的 docx 文件结构中添加一个带有特定 id 的图像。您可以使用此 id 在您的 xsl 转换中引用。在我的问题的代码示例中,我没有设置 ID,而是使用了生成的 ID。但是,每次运行此代码时,图像都会以新的 id 添加到文件中,从而导致“无法显示”错误。不是我最敏锐的时刻之一;-)。

对于我的用例,我必须将多个图像添加到一个大文档中,以便代码会有所不同,但我认为基于上述代码可以实现。

【讨论】:

以上是关于使用 xslt 模板将多个图像添加到 docx 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用XSLT将图像添加到Excel

无法使用 pypandoc 将图像从 docx 文件添加到 html 文件

XSLT 如何组合模板并将现有字段添加到某些元素

将多个具有相似匹配项的 XSLT 模板组合起来

超简单Python将指定数据插入到docx模板指定位置渲染并保存

是否有可用于将 WordprocessingML 转换为 RTF 的 XSLT