使用openxml提取word中的文本和图片并转为Html
C# Net Core openxml 提取 提出 取 word 文本 图片 Html Text Drawing
C# Net Core openxml 提取 提出 取 word 文本 图片 Html Text Drawing
注:只支持内嵌,不支持公式
------------------------------------------------
---------------文章最后为效果------------
------------------------------------------------
加入包:OpenXml
创建文件:Read.cs
复制下面全部代码到文件 Read.cs
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Xsl; namespace YCBX.Office.WordXml
{
public class WordRead
{
public static List<string> ReadToHtml(string wordPathStr)
{
return ReadToHtml(new FileStream(wordPathStr, FileMode.Open));
} public static List<string> ReadToHtml(Stream wordStream)
{
using (WordprocessingDocument doc = WordprocessingDocument.Open(wordStream, false))
{
//XmlWriterSettings settings = new XmlWriterSettings() { OmitXmlDeclaration = true, ConformanceLevel = ConformanceLevel.Auto,DoNotEscapeUriAttributes=true};
List<string> paragraphHtmls = new List<string>(); MainDocumentPart mainPart = doc.MainDocumentPart;
Body body = doc.MainDocumentPart.Document.Body; //段落
foreach (var paragraph in body.Elements<Paragraph>())
{
StringBuilder paragraphHtml = new StringBuilder();
//块
foreach (var run in paragraph.ChildElements)
{
if (run is Run)
{
foreach (OpenXmlElement openXmlElement in run.Elements())
{
//软回车
if (openXmlElement is Break br)
{
paragraphHtmls.Add(paragraphHtml.ToString());
paragraphHtml = new StringBuilder();
}
//文字块
else if (openXmlElement is Text text)
{
paragraphHtml.Append(text.Text);
}
//图像块
else if (openXmlElement is Drawing drawing)
{
//得到图像的内嵌ID(外嵌没做处理)
var inline = drawing.Inline;
var extent = inline.Extent;
var pic = inline.Graphic.GraphicData.GetFirstChild<DocumentFormat.OpenXml.Drawing.Pictures.Picture>();
var embed = pic.BlipFill.Blip.Embed.Value; //得到图像流
var part = mainPart.GetPartById(embed);
var stream = part.GetStream(); //流转2进制
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length); //2进制转base64
string imgHtml = $"<img width='{ImageExtent.EMU_TO_PX((decimal)extent.Cx.Value).ToString("0.")}' height='{ImageExtent.EMU_TO_PX((decimal)extent.Cy.Value).ToString("0.")}' src='data:{part.ContentType};base64," + Convert.ToBase64String(bytes) + "' />";
paragraphHtml.Append(imgHtml);
}
}
}
//else if(run is DocumentFormat.OpenXml.Math.OfficeMath math)
//{
// var x = new XmlDocument();
// x.LoadXml(math.OuterXml);
// using var ms = ConvertToMatchMl(x, settings);
// paragraphHtml.Append(ConvertToLatex(settings, ms));
//}
} paragraphHtmls.Add(paragraphHtml.ToString());
} return paragraphHtmls;
} } /// <summary>
/// 合并文档
/// </summary>
/// <param name="finalFile"></param>
/// <param name="files"></param>
public static void Combine(string finalFile, List<string> files)
{
if (files.Count < 2)
{
return;
}
File.Copy(files[0], finalFile, true);
using (WordprocessingDocument doc = WordprocessingDocument.Open(finalFile, true))
{
Body b = doc.MainDocumentPart.Document.Body;
for (int i = 1; i < files.Count; i++)
{
using (WordprocessingDocument doc1 = WordprocessingDocument.Open(files[i], true))
{
foreach (var inst in doc1.MainDocumentPart.Document.Body.Elements())
{
b.Append(inst.CloneNode(true));
}
}
}
}
} private string ConvertToLatex(XmlWriterSettings settings, Stream ms)
{
var latexTransform = new XslCompiledTransform();
latexTransform.Load(Path.Combine(AppContext.BaseDirectory, "xsltml", "mmltex.xsl"), new XsltSettings(true,true),new XmlUrlResolver() );
using var la = new MemoryStream();
latexTransform.Transform(new XmlTextReader(ms), XmlWriter.Create(la, settings));
la.Seek(0, SeekOrigin.Begin);
StreamReader sr = new StreamReader(la, Encoding.UTF8);
return sr.ReadToEnd();
} private Stream ConvertToMatchMl(XmlDocument xmlDocument, XmlWriterSettings settings)
{
var ms = new MemoryStream();
var xslTransform = new XslCompiledTransform();
xslTransform.Load(Path.Combine(AppContext.BaseDirectory, "xsltml", "OMML2MML.XSL"));
xslTransform.Transform(xmlDocument, XmlWriter.Create(ms, settings));
ms.Seek(0, SeekOrigin.Begin);
return ms;
}
}
}
创建文件:ImageExtent.cs
复制下面全部代码到文件 ImageExtent.cs
using System;
using System.Collections.Generic;
using System.Text; namespace YCBX.Office.WordXml
{
/// <summary>
/// 图像长度单位转换
/// </summary>
public class ImageExtent
{
private const decimal CM_TO_PX = 96M;
private const decimal INCH_TO_CM = 2.54M;
/// <summary>
/// 厘米到EMU(English Metric Unit)
/// </summary>
private const decimal CM_TO_EMU = 360000M; /// <summary>
/// EMU(English Metric Unit) 到像素(px)
/// </summary>
/// <param name="EMU"></param>
public static decimal EMU_TO_PX(decimal EMU)
{
return EMU / CM_TO_EMU / INCH_TO_CM * CM_TO_PX;
}
}
}
调用方法:
var sss = new Read().ParagraphHtmlAll("1.docx");
word文件中为:

创建一个test.html,将代码放在<body></body>中,查看效果为:

完成
使用openxml提取word中的文本和图片并转为Html的更多相关文章
- Java 提取Word中的文本和图片
本文将介绍通过Java来提取或读取Word文档中文本和图片的方法.这里提取文本和图片包括同时提取文档正文当中以及页眉.页脚中的的文本和图片. 使用工具:Free Spire.Doc for Java ...
- Java Word中的文本、图片替换功能
Word中的替换功能以查找指定文本然后替换为新的文本,可单个替换或全部替换.以下将要介绍的内容,除常见的以文本替换文本外,还将介绍使用不同对象进行替换的方法,具体可包括: 1. 指定字符串内容替换文本 ...
- 提取WORD中的所有InlineShape图片并保存成文件
InlineShape表示的类型其实不只是图片,还包括OLE, ACTIVE X等. 下面是MSDN中的定义:Represents an object in the text layer of a d ...
- Java 读取Word批注中的文本和图片
本文将介绍读取Word批注的方法,包括读取Word批注中的文本及图片.关于操作Word批注的方法还可以参考这两篇文章:Java 添加.回复.修改.删除Word批注:Java 给Word指定字符串添加批 ...
- Java 读取Word表格中的文本和图片
本文通过Java程序来展示如何读取Word表格,包括读取表格中的文本和图片.下面是具体实现的步骤和方法. 1. 程序环境准备 代码编译工具:IntelliJ IDEA Jdk版本:1.8.0 测试文档 ...
- word中创建文本框
word中创建文本框 在插入中点击"文本框"选项卡,例如以下图所看到的: 手工加入自己想要的文本框格式,然后选择所创建的文本框,在工具栏处会发现多了一 ...
- C#提取PPT文本——提取SmartArt中的文本、批注中的文本
提取文本的情况在工作和学习中常会遇到,在前面的文章中,已经讲述了如何提取PPT中文本框里的文本,在本篇文章中,将介绍如何使用C#代码语言提取PPT文档中SmartArt和批注中的文本.同样的,程序里面 ...
- Java 添加、删除、替换、格式化Word中的文本(基于Spire.Cloud.SDK for Java)
Spire.Cloud.SDK for Java提供了TextRangesApi接口可通过addTextRange()添加文本.deleteTextRange()删除文本.updateTextRang ...
- C# 读取Word文本框中的文本、图片和表格(附VB.NET代码)
[概述] Word中可插入文本框,在文本框中可添加文本.图片.表格等内容.本篇文章通过C#程序代码介绍如何来读取文本框中的文本.图片和表格等内容.附VB.NET代码,有需要可作参考. [程序环境] 程 ...
随机推荐
- 虚拟环境(virtualenv)
为什么需要虚拟环境: 到目前位置,我们所有的第三方包安装都是直接通过pip install xx的方式进行安装的,这样安装会将那个包安装到你的系统级的Python环境中.但是这样有一个问题,就是如果你 ...
- 实战_1:在Eclipse中新建RCP项目
(1)file => New => Plug-in Project (2) 指定项目名称 => next source folder: 源码路径 Output folder:编译后 ...
- python语法基础-面向对象-进阶-长期维护
############### @property定义属性 ############## # 所以对于定义属性你有好几种方式了和种类了,# 静态属性,动态属性, # property # ...
- sshd启动故障“Failed to start OpenSSH Server daemon ”解决方法
- Spring MVC及与structs MVC对比
一.Spring MVC MVC: Model + View + Controller(数据模型+视图+控制器) 三层架构: Presentation tier + Application tier ...
- Jeninks远程部署war包
主体上看别人的脚本,然后和开发协商,做出符合自己的生产脚本................................ 脚本一: #!/bin/bash DATE=`date +%F-%H-%M` ...
- WEB前端资源集(二)
在上一篇为大家整理出了一些资源网站,接下来给大家整理了一些开发中常用的工具. 开发工具篇 开发工具集 Sublime Text 3:SublimeText 3是一个代码编辑器,也是HTML和散文先进的 ...
- RabbitMQ(1)——基础入门
本文章写在了CSDN :https://blog.csdn.net/qq_30348181/article/details/87911398
- 吴裕雄--天生自然HTML学习笔记:HTML 布局
网页布局对改善网站的外观非常重要. 请慎重设计您的网页布局. <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- 最简化的DirectX 11开发环境的配置 VS2010
转载自:http://blog.csdn.net/zhmxy555/article/details/7672101 在编写基于DirectX 11的应用程序之前,我们当然需要在IDE中加入Direct ...