C# 在HTML块中嵌入带有OpenXML的对象

C# 在HTML块中嵌入带有OpenXML的对象,c#,html,ms-word,openxml,ole,C#,Html,Ms Word,Openxml,Ole,我试图完成一些非常具体的事情,我甚至不知道这是否可能 情况是: 我有一个html内容,除了格式化文本外,它还显示指向我自己服务器中不同文件(pdf、docx等)的链接 我希望使用OpenXML将此html内容导出到docx文件,但这些文件必须下载并作为对象嵌入到文件中,而不是指向服务器的链接 我目前取得了以下成就: 将外部文件作为OLE对象嵌入,使用OpenXML的EmbeddedObjectPart,然后从文档的一段引用它 使用“altchunks”在文档中插入html内容 我试图:

我试图完成一些非常具体的事情,我甚至不知道这是否可能

情况是:

  • 我有一个html内容,除了格式化文本外,它还显示指向我自己服务器中不同文件(pdf、docx等)的链接

  • 我希望使用OpenXML将此html内容导出到docx文件,但这些文件必须下载并作为对象嵌入到文件中,而不是指向服务器的链接

我目前取得了以下成就:

  • 将外部文件作为OLE对象嵌入,使用OpenXML的EmbeddedObjectPart,然后从文档的一段引用它

  • 使用“altchunks”在文档中插入html内容

我试图:

  • 从html链接中引用嵌入的对象二进制(包内)
  • 使用html标记,如“嵌入”
这些方法都不适合我。我不知道这是不是正确的方法,也不知道我做得是否正确。我不想做的是,在html内容之后或之前嵌入这些文件,因为它们是html内容的一部分


提前感谢。

我终于找到了一个符合我目的的解决方案。我将与您分享:

  • 要插入的html代码并不十分复杂:它来自SharePoint的支持html的完整富文本字段,但用户仅使用SharePoint的OOTB编辑器来编辑该字段,因此没有css,等等

  • 因此,我决定不将html内容作为可选的FormatImportPart(altChunk)插入,而是先解析它,然后作为纯OpenXml插入

  • 要执行转换,我使用库作为基础。我通过重载.Parse(…)方法对其进行了如下扩展:

  • 如果找到“a href=…”标记,我们将分析href值以确定它是否是指向内部服务器的链接
  • 如果href指向我们的服务器,我们将用包含文件url和图标图像url的特殊序列化类替换“a href”标记
  • 我们让原始的.Parse方法执行转换
  • 我们分析original的.Parse函数返回的IList,以查找OpenXml的文本元素,其内容是包含链接的特殊序列化类
  • 我们将包含这些文本元素的每个OpenXml的Run元素替换为一个Run元素,该元素使用每个文件的二进制内容和包含图标图像的形状引用嵌入对象
我在这里还分享了一个代码存根,这样你就可以知道我是如何扩展功能的。如果有人对完整的解决方案感兴趣,请告诉我

        /// <summary>
    /// Replaces anchor hrefs to documents on server with embedded OLE objects 
    /// Start the parse processing
    /// </summary>
    /// <param name="html"></param>
    /// <param name="embeddServerLinksAsObjects"></param>
    /// <returns></returns>
    public IList<OpenXmlCompositeElement> Parse(string html, bool embeddServerLinksAsObjects)
    {
        try
        {
            if (embeddServerLinksAsObjects)
            {
                html = ReplaceAnchorLinksByOXMLLinks(html, this.serverRoot);                 
            }

            IList<OpenXmlCompositeElement> oceList = base.Parse(html);

            if (embeddServerLinksAsObjects)
            {
                oceList = ReplaceOXMLLinksByOLEObjects(oceList, this.mainDocumentPart, this.serverRoot);
            }

            return oceList;

        }
        catch (Exception ex)
        {

        }

        return null;
    }
//
///用嵌入的OLE对象替换服务器上文档的锚定HREF
///启动解析处理
/// 
/// 
/// 
/// 
公共IList解析(字符串html、bool EmbeddedServerLinksAsObjects)
{
尝试
{
if(EmbeddedServerLinksAsObjects)
{
html=ReplaceAnchorLinksByOXMLLinks(html,this.serverRoot);
}
IList oceList=base.Parse(html);
if(EmbeddedServerLinksAsObjects)
{
oceList=ReplaceOXMLLinksByOLEObjects(oceList,this.mainDocumentPart,this.serverRoot);
}
返回列表;
}
捕获(例外情况除外)
{
}
返回null;
}