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的更多相关文章

  1. Java 提取Word中的文本和图片

    本文将介绍通过Java来提取或读取Word文档中文本和图片的方法.这里提取文本和图片包括同时提取文档正文当中以及页眉.页脚中的的文本和图片. 使用工具:Free Spire.Doc for Java ...

  2. Java Word中的文本、图片替换功能

    Word中的替换功能以查找指定文本然后替换为新的文本,可单个替换或全部替换.以下将要介绍的内容,除常见的以文本替换文本外,还将介绍使用不同对象进行替换的方法,具体可包括: 1. 指定字符串内容替换文本 ...

  3. 提取WORD中的所有InlineShape图片并保存成文件

    InlineShape表示的类型其实不只是图片,还包括OLE, ACTIVE X等. 下面是MSDN中的定义:Represents an object in the text layer of a d ...

  4. Java 读取Word批注中的文本和图片

    本文将介绍读取Word批注的方法,包括读取Word批注中的文本及图片.关于操作Word批注的方法还可以参考这两篇文章:Java 添加.回复.修改.删除Word批注:Java 给Word指定字符串添加批 ...

  5. Java 读取Word表格中的文本和图片

    本文通过Java程序来展示如何读取Word表格,包括读取表格中的文本和图片.下面是具体实现的步骤和方法. 1. 程序环境准备 代码编译工具:IntelliJ IDEA Jdk版本:1.8.0 测试文档 ...

  6. word中创建文本框

    word中创建文本框         在插入中点击"文本框"选项卡,例如以下图所看到的:        手工加入自己想要的文本框格式,然后选择所创建的文本框,在工具栏处会发现多了一 ...

  7. C#提取PPT文本——提取SmartArt中的文本、批注中的文本

    提取文本的情况在工作和学习中常会遇到,在前面的文章中,已经讲述了如何提取PPT中文本框里的文本,在本篇文章中,将介绍如何使用C#代码语言提取PPT文档中SmartArt和批注中的文本.同样的,程序里面 ...

  8. Java 添加、删除、替换、格式化Word中的文本(基于Spire.Cloud.SDK for Java)

    Spire.Cloud.SDK for Java提供了TextRangesApi接口可通过addTextRange()添加文本.deleteTextRange()删除文本.updateTextRang ...

  9. C# 读取Word文本框中的文本、图片和表格(附VB.NET代码)

    [概述] Word中可插入文本框,在文本框中可添加文本.图片.表格等内容.本篇文章通过C#程序代码介绍如何来读取文本框中的文本.图片和表格等内容.附VB.NET代码,有需要可作参考. [程序环境] 程 ...

随机推荐

  1. 在SpringBoot中使用Junit测试

    一:加入依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactI ...

  2. Python的range(n)的用法

    Python的range(n) 方法就是: API定义: If you do need to iterate(迭代) over a sequence(一系列) of numbers, the buil ...

  3. require.ensure和require.context

    require.ensure和require.context https://www.cnblogs.com/fantasy-zxf/p/6760390.html https://www.jiansh ...

  4. [洛谷P3806] [模板] 点分治1

    洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果m ...

  5. mac android sdk manager 无法更新(被墙)

    http://www.androiddevtools.cn/ 一句话,相见恨晚!! 想把以前的旧安卓项目拿到MAC上 环境就卡住了,以前的包是4.4的,想试试5.0的,更新不动 Android Too ...

  6. Python sorted函数详解(高级篇)

    sorted() 函数对所有可迭代的对象进行排序操作. sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作. list 的 s ...

  7. Ionic3 Demo

    本文为原创文章,转载请标明出处 最近又开源了一个小 Demo,基于 Ionic 3.9.2.注册登录功能使用的是 WildDog 野狗通信云,大家可以放心的注册登录玩.电影相关数据来源自"某 ...

  8. Linux的date用法

    显示时间是个常用的命令,在写shell脚本中也经常会用到与日期相关文件名或时间显示.无论是linux还是windows下都是date命令. Linux下date命令用法 date [OPTION]… ...

  9. 笔记: SpringBoot + VUE实现数据字典展示功能

    最近一直在写前端,写得我贼难受,从能看懂一些基础的代码到整个前端框架撸下来鬼知道我经历了啥(:´д`)ゞ 项目中所用到的下拉菜单的值全部都是有数据库中的数据字典表来提供的,显示给用户的是的清晰的意思, ...

  10. 初识SpringIOC

    初识SpringIOC 简介 IOC(Inversion of Control)控制反转.指的是获取对象方式由原来主动获取,到被动接收的转变.在Spring中,IOC就是工厂模式解耦,是Srping框 ...