在 HTML 块中使用 OpenXML 嵌入对象
Embedding Objects with OpenXML in HTML chunks
我正在努力完成一些我什至不知道是否可行的非常具体的事情。
情况是:
我有一个 html 内容,除了格式化文本外,它还显示 link 我自己服务器中的不同文件(pdf、docx 等)。
我想使用 OpenXML 将此 html 内容导出到一个 docx 文件,但不是 links 到服务器,必须下载这些文件并作为对象嵌入到文件中。
我目前取得的成绩:
将外部文件作为 OLE 对象嵌入,使用 OpenXML 的 EmbeddedObjectPart 然后从文档的段落中引用它。
正在文档中插入 html 内容,使用 "altchunks".
我试过:
- 引用来自 html link.
的嵌入式对象二进制文件(包内)
- 使用 html 标签,例如 "embed"
None 这些方法对我有用。我不知道这是否是正确的方法,也不知道我做的是否正确。我不想做的是,将这些文件嵌入到 html 内容之后或之前,因为它们是其中的一部分。
提前致谢。
我终于找到了适合我目的的解决方案。我会与你分享:
要插入的 html 代码不是很复杂:它来自 SharePoint 的完全启用html 的富文本字段,但用户仅使用 Sharepoint 的 OOTB该字段的编辑器,所以没有 css,等等
因此,我决定不将 html 内容作为 AlternativeFormatImportPart (altChunk) 插入,而是先对其进行解析并将其作为纯 OpenXml 插入。
为了执行转换,我使用 html2openxml 库作为基础。我扩展了它重载 .Parse(...) 方法,如下所示:
- 如果找到 "a href=..." 标签,我们会分析 href 值以确定它是否是我们内部服务器的 link。
- 如果 href 指向我们的服务器,我们会将 "a href" 标记替换为包含文件 url 和图标图像 url 的特殊序列化 class。
- 我们让原始的 .Parse 方法执行转换。
- 我们分析原始的 .Parse 函数返回的 IList 以找到 OpenXml 的文本元素,其内容是我们特殊序列化的 class 包含 links.
- 我们将包含这些文本元素的每个 OpenXml 运行 元素替换为 运行 元素,该元素使用每个文件的二进制内容和包含图标图像的形状引用嵌入对象。
我在这里也分享了一个代码存根,这样你就可以知道我是如何扩展功能的,如果有人对完整的解决方案感兴趣,请告诉我。
/// <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;
}
我正在努力完成一些我什至不知道是否可行的非常具体的事情。
情况是:
我有一个 html 内容,除了格式化文本外,它还显示 link 我自己服务器中的不同文件(pdf、docx 等)。
我想使用 OpenXML 将此 html 内容导出到一个 docx 文件,但不是 links 到服务器,必须下载这些文件并作为对象嵌入到文件中。
我目前取得的成绩:
将外部文件作为 OLE 对象嵌入,使用 OpenXML 的 EmbeddedObjectPart 然后从文档的段落中引用它。
正在文档中插入 html 内容,使用 "altchunks".
我试过:
- 引用来自 html link. 的嵌入式对象二进制文件(包内)
- 使用 html 标签,例如 "embed"
None 这些方法对我有用。我不知道这是否是正确的方法,也不知道我做的是否正确。我不想做的是,将这些文件嵌入到 html 内容之后或之前,因为它们是其中的一部分。
提前致谢。
我终于找到了适合我目的的解决方案。我会与你分享:
要插入的 html 代码不是很复杂:它来自 SharePoint 的完全启用html 的富文本字段,但用户仅使用 Sharepoint 的 OOTB该字段的编辑器,所以没有 css,等等
因此,我决定不将 html 内容作为 AlternativeFormatImportPart (altChunk) 插入,而是先对其进行解析并将其作为纯 OpenXml 插入。
为了执行转换,我使用 html2openxml 库作为基础。我扩展了它重载 .Parse(...) 方法,如下所示:
- 如果找到 "a href=..." 标签,我们会分析 href 值以确定它是否是我们内部服务器的 link。
- 如果 href 指向我们的服务器,我们会将 "a href" 标记替换为包含文件 url 和图标图像 url 的特殊序列化 class。
- 我们让原始的 .Parse 方法执行转换。
- 我们分析原始的 .Parse 函数返回的 IList 以找到 OpenXml 的文本元素,其内容是我们特殊序列化的 class 包含 links.
- 我们将包含这些文本元素的每个 OpenXml 运行 元素替换为 运行 元素,该元素使用每个文件的二进制内容和包含图标图像的形状引用嵌入对象。
我在这里也分享了一个代码存根,这样你就可以知道我是如何扩展功能的,如果有人对完整的解决方案感兴趣,请告诉我。
/// <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;
}