使用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代码,有需要可作参考. [程序环境] 程 ...
随机推荐
- P2967 [USACO09DEC]视频游戏的麻烦Video Game Troubles
冲刺阶段的首篇题解! 题目链接:P2967 [USACO09DEC]视频游戏的麻烦Video Game Troubles: 题目概述: 总共N个游戏平台,金额上限V元,给出每个游戏平台的价钱和其上游戏 ...
- Swiper中文网
http://3.swiper.com.cn/api/Slides_grid/2014/1215/24.html slidesPerView :2, 即设置slider容器能够同时显示的slide ...
- 前端-css-长期维护
############### CSS简介 ################ # CSS # HTML是骨架 # CSS是样式 # JS是动作 # css和html是分成两个文件编写的,这 ...
- mysql中造3千条数据(3种方法)
方法一:存储过程 1.存储过程如下: delimiter $$ DROP PROCEDURE IF EXISTS data CREATE PROCEDURE data(in i int) BEGIN ...
- MOOC(7)- case依赖、读取json配置文件进行多个接口请求-测试类中调用封装的mock(10)
封装mock后,在单元测试中调用 # -*- coding: utf-8 -*- # @Time : 2020/2/11 8:35 # @File : test_class_10.py.py # @A ...
- _Random和_RandomString的使用区别
__Random 函数介绍 作用:生成随机数 使用格式:${__Random(5,30,myResult_Random)},其中 第一个参数5,表示希望生成的数字最小的值,必填 第二个参数30,表示希 ...
- 【React.js小书】动手实现 React-redux(五):Provider - 方志
我们要把 context 相关的代码从所有业务组件中清除出去,现在的代码里面还有一个地方是被污染的.那就是 src/index.js 里面的 Index: 1234567891011121314151 ...
- SpringMVC学习笔记二:参数接受
该项目用来介绍SpringMVC对参数接受的方法: 项目目录树:在前一个项目上修改添加 新添加了Student类和Group类,用来测试整体参数接受 Student.java package com. ...
- Nginx笔记总结十九:nginx + fancy实现漂亮的索引目录
编译:./configure --prefix=/usr/local/nginx --add-module=../ngx-fancyindex-master 配置: location / { fanc ...
- 吴裕雄--python学习笔记:通过sqlite3 进行文字界面学生管理
import sqlite3 conn = sqlite3.connect('E:\\student.db') print("Opened database successfully&quo ...