HTML转word_怎么把docx转换成word

HTML转word_怎么把docx转换成word在做项目时,要将富文本编辑器,或是html内容导出为word。先引入文件保存js<scriptsrc=”FileSaver.js”></script>导出为Docxdocx体积更小,而且word2007也可以打开1.引用插件html-docx.js<scriptsrc=”html-docx.js”></script>2.构建完整的html内容文档varcontent='<!DOCTYPEhtml&gt

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在做项目时,要将富文本编辑器,或是html内容 导出为word。

先引入文件保存js

<script src="FileSaver.js"></script>

方法一

使用 html-docx.js、FileSaver.js 文件

导出为Docx
docx体积更小,而且word2007也可以打开

1.引用插件html-docx.js

<script src="html-docx.js"></script>

2.构建完整的html内容文档

var content = '<!DOCTYPE html><html><head><meta charset="UTF-8"></head>'+ 要导出的html信息 +'</html>

content要导出的html信息,建议在服务端自己拼接完成。

若是想从页面抓取html信息,可以用下面的方法(不建议,客户端消耗高)

html:

<div id="content">
    要导出的html信息
    <img src="xxx">
</div>
 
function convertImagesToBase64 (content) {
      var regularImages = content.querySelectorAll("img");
      var canvas = document.createElement('canvas');
      var ctx = canvas.getContext('2d');
      [].forEach.call(regularImages, function (imgElement) {
        // preparing canvas for drawing
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        canvas.width = imgElement.width;
        canvas.height = imgElement.height;
 
        ctx.drawImage(imgElement, 0, 0);
        // by default toDataURL() produces png image, but you can also export to jpeg
        // checkout function's documentation for more details
        var dataURL = canvas.toDataURL();
        imgElement.setAttribute('src', dataURL);
      })
      canvas.remove();
    }
var content = document.getElementById('#content');
convertImagesToBase64(content);//转换图片为base64
 
content = '<!DOCTYPE html><html><head><meta charset="UTF-8"></head>'+ content +'</html>'

3.利用脚本导出word

 var converted = htmlDocx.asBlob(content);
 saveAs(converted, 'test.docx');// 用 FielSaver.js里的保存方法 进行输出

方法二

导出为Doc

使用 html-docx.js、FileSaver.js 、wordexport文件

1.引入jquery和wordexport

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script src="wordexport.js"></script>

2.使用导出

$(元素).wordExport(文件名,isBase64)

isBase64 用于标识 元素中的图片是否都处理为了base64,默认为false,内置处理方法,可以去看看

注意

无论是html-docx.js还是 wordexport.js 都需要将html中的图片转为base64形式

而且,图片的宽度高,最好自己设置下,否则下载的图片会以图片原始大小下载,就会出现以下,图片在文档超出情况

HTML转word_怎么把docx转换成word

处理图片的宽高,可以采用 正则替换,这里给出两种替换参考(平时不太写正则,所以有点挫)

C#:

string reg = "<img.*? src=[\"'](.*?)['\"].*?>";
MatchCollection collections = Regex.Matches(description, reg);
if (collections.Count > 0)
{
    foreach (Match match in collections)
    {
        Regex regWidth = new Regex("width\\s*=\\s*\\S+ ");
        if (!regWidth.IsMatch(img))//img 中不存在width 
        {
            //获取其他属性进行替换
            Regex reg1 = new Regex(@"style\s*=(['""\s]?)[^'""]*?\1"); ;
            img = reg1.Replace(img, "width=\"350\" height=\"216\" ");//按黄金比例替换
        }
        else
        {
            Match mathWidth = regWidth.Match(img);
            if (mathWidth.Success)
            {
                string widh = mathWidth.Value.Substring(7).Substring(0, mathWidth.Value.Substring(7).Length - 2);//width
                if (int.Parse(widh) > 400) {//原宽超出400
                    Regex regHeight = new Regex(@"height\s*=(['""\s]?)[^'""]*?\1");
                    Match mathHeight = regHeight.Match(img);
                    if (mathHeight.Success)
                    {
                        string height = mathHeight.Value.Substring(8).Substring(0, mathHeight.Value.Substring(8).Length - 1);
                        img = regHeight.Replace(img, "height=\" " + 350 * int.Parse(height) / int.Parse(widh) + "\"");//按比例替换 高
                    }
                    img = regWidth.Replace(img, "width=\"350\"");
                }
            }
        }
    }
}

若是二进制流存储的图片数据,可以通过Bitmp来读取原始大小 ,然后按照原始比例再进行缩放


//通过二进制流 获取图片原始宽高
private int[] GetScaleImgSizeByByte(byte[] image)
{
    MemoryStream stream = new MemoryStream(image);//内存流写入
    Bitmap bmp = new Bitmap(stream);
    int width = 600;//先指定一个固定大小 和word页面边距最大宽差不多
    int height = 600;
    if (bmp.Width > 600)
    {
        height = (int)(width * ((double)bmp.Height / (double)bmp.Width));
    }
    if (height > 600 || bmp.Height > 600)
    {//调完宽后判断高 
        height = 600;
        width = (int)(height / ((double)bmp.Height / (double)bmp.Width));
    }
    return new int[] { width, height };
}

js正则替换:

 var str = htmlText.replace(/(<img[^>]*)(\/?>)/gi, function (match, capture) {
     if(match.match(/width\s*?=\s*?([‘"])[\s\S]*?\1/ig)==null)
     match = match.replace(/(<img[^>]*)(\/?>)/gi,"$1 width='350' $2")//没有宽就增加宽
     return match.replace(/style\s*?=\s*?([‘"])[\s\S]*?\1/ig, '').replace(/width\s*?=\s*?([‘"])[\s\S]*?\1/ig ,"width='350'");
});

方式三   使用poi 

经过调研使用各种方式之后发现这种方法应该是对样式复杂的报告是最切合的
提供poi封装脚手架函数 Poi-tl Documentation

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182859.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月12日 上午10:46
下一篇 2022年10月12日 上午11:00


相关推荐

  • vim 查找字符串「建议收藏」

    vim 查找字符串「建议收藏」在命令模式下输入/然后输入你需要查找的字符串即可。见下图:  可以使用n继续向下查找下一个名称为job的字符串。  可以使用N向上查找名称为job的字符串。  但每次查找完成后高亮并不会消失,可以在命令行模式输入:nohlsearch或者:noh,也可以输入:setnohlsearch,设置不用高亮查询会让你的查询不会高亮显示,如果需要高亮显示可以输入:sethlsearch。…

    2022年6月17日
    155
  • python后端开发面试常见问题 (持续更新)

    python后端开发面试常见问题 (持续更新)python 后端开发面试常见问题 大家好 我叫亓官劼 q gu nji 在 GitHub 和 CSDN 中记录学习的点滴历程 时光荏苒 未来可期 一起加油 本篇文章将在 GitHub 和 CSDN 上持续更新 主要是 Python 后端开发的一些常见问题 包括 Python 的一些基础知识 以及面试中常问的计网 数据库 数据结构等一些算法题 总体覆盖面试的大多数问题 本文的 GitHub 地址为 python development interview FAQCSDN 暂未发布 发布时再加上链接 如果有帮

    2026年3月26日
    1
  • iOS的三重缓冲和微型口吃(micro stuttering)

    iOS的三重缓冲和微型口吃(micro stuttering)Instrument中的Display模块:instrument-displayiOS中采用双重缓冲和三重缓冲一起使用,从display中就可以看出来。即:双缓冲不够用了就采用三缓冲。首先看看双重缓冲:双缓冲如上,此时双缓冲很够用,每次Vsync来到之前,上一帧的framebuffer(apple叫做surface+ID),所以帧率很高,基本在…

    2022年5月11日
    48
  • 腾讯宣布“元宝派”支持接入 OpenClaw

    腾讯宣布“元宝派”支持接入 OpenClaw

    2026年3月17日
    2
  • c语言scanf返回值被忽略,scanf返回值问题

    c语言scanf返回值被忽略,scanf返回值问题在家养病 闲着没事看 Cprimerplus 看到书中对于 scanf 输入的判断 常用如下方法 此时它将返回 1 视为我输入成功 如果不为 1 则视为输入失败 那到底 scanf 的返回值具体指的是什么呢 例子 1 voidmain inta intb intc printf 请输入三个整数 intx scanf d d d amp a amp b amp c printf

    2026年3月19日
    2
  • LaTex itemize enumerate 枚举 编号使用

    LaTex itemize enumerate 枚举 编号使用文章目录 itemizeenume itemize 命令对文本进行简单的排列 不是采用序号 而是实心圆点符号 这个命令需要和 item 配合使用 begin itemize itemHuawei itemXiaomi itemOppo end itemize begin itemize item Huawei

    2026年3月16日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号