百度富文本编辑器UEditor配置及功能实现详解

2023-11-20

当前功能基于PHP,其它语言流程大抵相同。

大概流程:

1. 将docx文件上传到服务器中

2. 使用PHPoffice/PHPword实现将word转换为HTML

3. 将HTML代码返回并赋值到编辑器中

1 编辑器配置修改

1.1 新增上传word json配置

在ueditor\php\config.json中新增如下配置:

    /* 上传word配置 */

    "wordActionName": "wordupload", /* 执行上传视频的action名称 */

    "wordFieldName": "upfile", /* 提交的视频表单名称 */

    "wordPathFormat": "/public/uploads/word/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */

    "wordMaxSize": 102400000, /* 上传大小限制,单位B,默认100MB */

    "wordAllowFiles": [".docx"] /* 仅支持docx格式的word */

1.2 修改编辑器配置文件

1.2.1 在工具栏上新增按钮

在ueditor\ueditor.config.js文件中,新增按钮名称"wordupload",并添加鼠标悬浮提示,如下所示:

        //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义

        , toolbars: [[

            'fullscreen', 'source', '|', 'undo', 'redo', '|',

            'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|',

            'rowspacingtop', 'rowspacingbottom', 'lineheight', '|',

            'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|',

            'directionalityltr', 'directionalityrtl', 'indent', '|',

            'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|',

            'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|',

            'simpleupload', 'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', 'template', 'background', '|',

            'horizontal', 'date', 'time', 'spechars', 'snapscreen', 'wordimage', '|',

            'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|',

            'print', 'preview', 'searchreplace', 'drafts', 'help', 'wordupload'

        ]]

        //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准

        ,labelMap:{

           'wordupload': '上传word文件',

        }

在ueditor\themes\default\images\目录下新增按钮图标"word_upload.png":

在ueditor\themes\default\css\ueditor.css文件中新增按钮样式:

.edui-for-wordupload .edui-icon {

    width: 16px;

    height: 16px;

    background: url(../images/word_upload.png) no-repeat 2px 2px !important;

}

最后在ueditor\ueditor.all.js文件中editorui["simpleupload"] = function (editor){}后面添加如下代码:

/* word上传 */

    editorui["wordupload"] = function (editor) {

        var name = 'wordupload',

            ui = new editorui.Button({

                className:'edui-for-' + name,

                title:editor.options.labelMap[name] || editor.getLang("labelMap." + name) || '',

                onclick:function () {},

                theme:editor.options.theme,

                showText:false

            });

        editorui.buttons[name] = ui;

        editor.addListener('ready', function() {

            var b = ui.getDom('body'),

                iconSpan = b.children[0];

            editor.fireEvent('worduploadbtnready', iconSpan);

        });

        editor.addListener('selectionchange', function (type, causeByUi, uiReady) {

            var state = editor.queryCommandState(name);

            if (state == -1) {

                ui.setDisabled(true);

                ui.setChecked(false);

            } else {

                if (!uiReady) {

                    ui.setDisabled(false);

                    ui.setChecked(state);

                }

            }

        });

        return ui;

    };

最终样式如下:

1.2.2 新增语言配置

在ueditor\lang\zh-cn\zh-cn.js文件中在"simpleupload"配置下方新增以下配置:

'simpleupload':{

        'exceedSizeError': '文件大小超出限制',

        'exceedTypeError': '文件格式不允许',

        'jsonEncodeError': '服务器返回格式错误',

        'loading':"正在上传...",

        'loadError':"上传错误",

        'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'

    },

    'wordupload':{

        'exceedSizeError': '文件大小超出限制',

        'exceedTypeError': '文件格式不允许',

        'jsonEncodeError': '服务器返回格式错误',

        'loading':"正在上传...",

        'loadError':"上传错误",

        'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'

    },

在ueditor\lang\zh-cn\en.js文件中在"simpleupload"配置下方新增以下配置:

'simpleupload':{

        'exceedSizeError': 'File Size Exceed',

        'exceedTypeError': 'File Type Not Allow',

        'jsonEncodeError': 'Server Return Format Error',

        'loading':"loading...",

        'loadError':"load error",

        'errorLoadConfig': 'Server config not loaded, upload can not work.',

    },

    'wordupload':{

        'exceedSizeError': 'File Size Exceed',

        'exceedTypeError': 'File Type Not Allow',

        'jsonEncodeError': 'Server Return Format Error',

        'loading':"loading...",

        'loadError':"load error",

        'errorLoadConfig': 'Server config not loaded, upload can not work.',

    },

1.2.3 修改过滤配置

由于导入word时,编辑器会自动过滤掉图片等样式,所以需取消过滤

在ueditor\ueditor.config.js文件中修改如下配置:

// xss 过滤是否开启,inserthtml等操作

,xssFilterRules: false

//input xss过滤

,inputXssFilter: false

//output xss过滤

,outputXssFilter: false

在ueditor\ueditor.all.js文件中,修改UE.plugins[‘defaultfilter’],新增return ;如下所示:

// plugins/defaultfilter.js

///import core

///plugin 编辑器默认的过滤转换机制

UE.plugins['defaultfilter'] = function () {

    return;

    var me = this;

    me.setOpt({

        'allowDivTransToP':true,

        'disabledTableInTable':true

    });

……

2 添加相关功能

2.1 安装PHPword

composer require phpoffice/phpword

1

2.2 自定义文件转换类

实现上传文件,并将文件转换为HTML

直接将ueditor自带的上传文件"ueditor\php\Uploader.class.php"类复制到自定义类相同目录下

自定义WordToHtmlController.class.php文件:

<?php

class WordToHtmlController

{

    public function index()

    {

        require 'vendor/autoload.php';

        $base64 = "upload";

        $config = array(

            "pathFormat" => '/public/uploads/word/{yyyy}{mm}{dd}/{time}{rand:6}',

            "maxSize" => 102400000,

            "allowFiles" => [".docx"]

        );

        $fieldName = 'upfile';

        include 'Uploader.class.php';

        $up = new Uploader($fieldName, $config, $base64);

        $path = ltrim($up->getFileInfo()['url'], '/');

//        $phpWord = \PhpOffice\PhpWord\IOFactory::load('public/uploads/word/20211029/test.docx');

        $phpWord = \PhpOffice\PhpWord\IOFactory::load($path);

        // 直接输出到页面显示

//        $phpWord->save('php://output', 'HTML');

        $xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'HTML');

        header("Content-Type:text/html; charset=utf-8");

        exit($this->replaceImageSrc($xmlWriter->getContent()));

//        exit($xmlWriter->getContent());

    }

    /**

     * 将HTML代码中的所有图片地址替换

     * @param $content string 要查找的内容

     * @return string

     */

    private function replaceImageSrc($content)

    {

        $preg = '/(\s+src\s?\=)\s?[\'|"]([^\'|"]*)/is'; // 匹配img标签的正则表达式

        preg_match_all($preg, $content, $allImg); // 匹配所有的img

        if (!$allImg)

            return $content;

        foreach ($allImg[0] as $k => $v) {

            $old = ltrim($v, '" src=');

            preg_match('/^(data:\s*image\/(\w+);base64,)/', $old, $temp);

            $tempType = $temp[2];   // 获取类型

            // 判断目录是否存在,不存在时创建

            $tempFilePath = 'public/uploads/word_images/' . date('Y-m-d', time());

            if (!file_exists($tempFilePath))

                mkdir($tempFilePath);

            // 拼接完整路径

            $tempFileName = $tempFilePath . '/word_image_' . time() . $k . '.' . $tempType;

            $base64 = str_replace($temp[1], '', $old);

            file_put_contents($tempFileName, base64_decode($base64));

            // 替换路径字符串

            $content = str_replace($old, $tempFileName, $content);

        }

        return $content;

    }

}

2.3 编辑器实现导入操作

在ueditor\ueditor.all.js文件中UE.plugin.register('simpleupload', function (){})下方新增如下方法:

/**

 * @description

 * word上传:点击按钮,直接选择文件上传

 */

UE.plugin.register('wordupload', function (){

    var me = this,

        isLoaded = false,

        containerBtn;

    function initUploadBtn(){

        var w = containerBtn.offsetWidth || 20,

            h = containerBtn.offsetHeight || 20,

            btnIframe = document.createElement('iframe'),

            btnStyle = 'display:block;width:' + w + 'px;height:' + h + 'px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;';

        domUtils.on(btnIframe, 'load', function(){

            var timestrap = (+new Date()).toString(36),

                wrapper,

                btnIframeDoc,

                btnIframeBody;

            btnIframeDoc = (btnIframe.contentDocument || btnIframe.contentWindow.document);

            btnIframeBody = btnIframeDoc.body;

            wrapper = btnIframeDoc.createElement('div');

            wrapper.innerHTML = '<form id="edui_form_' + timestrap + '" target="edui_iframe_' + timestrap + '" method="POST" enctype="multipart/form-data" action="' + me.getOpt('serverUrl') + '" ' +

                'style="' + btnStyle + '">' +

                '<input id="edui_input_' + timestrap + '" type="file" accept="application/msword" name="' + me.options.wordFieldName + '" ' +

                'style="' + btnStyle + '">' +

                '</form>' +

                '<iframe id="edui_iframe_' + timestrap + '" name="edui_iframe_' + timestrap + '" style="display:none;width:0;height:0;border:0;margin:0;padding:0;position:absolute;"></iframe>';

            wrapper.className = 'edui-' + me.options.theme;

            wrapper.id = me.ui.id + '_iframeupload';

            btnIframeBody.style.cssText = btnStyle;

            btnIframeBody.style.width = w + 'px';

            btnIframeBody.style.height = h + 'px';

            btnIframeBody.appendChild(wrapper);

            if (btnIframeBody.parentNode) {

                btnIframeBody.parentNode.style.width = w + 'px';

                btnIframeBody.parentNode.style.height = w + 'px';

            }

            var form = btnIframeDoc.getElementById('edui_form_' + timestrap);

            var input = btnIframeDoc.getElementById('edui_input_' + timestrap);

            var iframe = btnIframeDoc.getElementById('edui_iframe_' + timestrap);

            domUtils.on(input, 'change', function(){

                if(!input.value) return;

                var loadingId = 'loading_' + (+new Date()).toString(36);

                var allowFiles = me.getOpt('wordAllowFiles');

                me.focus();

                me.execCommand('inserthtml', '<img class="loadingclass" id="' + loadingId + '" src="' + me.options.themePath + me.options.theme +'/images/spacer.gif" title="' + (me.getLang('wordupload.loading') || '') + '" >');

                function callback(){

                    try{

                        // 获取到内容

                        var body = (iframe.contentDocument || iframe.contentWindow.document).body;

                        // 获取加载中图片并关闭

                        var loader = me.document.getElementById(loadingId);

                        loader.removeAttribute('id');

                        domUtils.removeClasses(loader, 'loadingclass');

                        // 向编辑器赋值

                        me.setContent(body.innerHTML, false);

                        // me.execCommand('insertHtml', body.innerHTML);

                    }catch(er){

                        showErrorLoader && showErrorLoader(me.getLang('wordupload.loadError'));

                    }

                    form.reset();

                    domUtils.un(iframe, 'load', callback);

                }

                function showErrorLoader(title){

                    if(loadingId) {

                        var loader = me.document.getElementById(loadingId);

                        loader && domUtils.remove(loader);

                        me.fireEvent('showmessage', {

                            'id': loadingId,

                            'content': title,

                            'type': 'error',

                            'timeout': 4000

                        });

                    }

                }

                /* 判断后端配置是否没有加载成功 */

                if (!me.getOpt('wordActionName')) {

                    errorHandler(me.getLang('autoupload.errorLoadConfig'));

                    return;

                }

                // 判断文件格式是否错误

                var filename = input.value,

                    fileext = filename ? filename.substr(filename.lastIndexOf('.')):'';

                if (!fileext || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) {

                    showErrorLoader(me.getLang('wordupload.exceedTypeError'));

                    return;

                }

                domUtils.on(iframe, 'load', callback);

                // 上传操作

                // form.action = utils.formatUrl(imageActionUrl + (imageActionUrl.indexOf('?') == -1 ? '?':'&') + params);

                // 替换请求地址为框架后台地址

                form.action = "/admin.php?m=fwordToHtml&a=index"

                form.method = "post"

                form.submit();

            });

            var stateTimer;

            me.addListener('selectionchange', function () {

                clearTimeout(stateTimer);

                stateTimer = setTimeout(function() {

                    var state = me.queryCommandState('wordupload');

                    if (state == -1) {

                        input.disabled = 'disabled';

                    } else {

                        input.disabled = false;

                    }

                }, 400);

            });

            isLoaded = true;

        });

        btnIframe.style.cssText = btnStyle;

        containerBtn.appendChild(btnIframe);

    }

    return {

        bindEvents:{

            'ready': function() {

                //设置loading的样式

                utils.cssRule('loading',

                    '.loadingclass{display:inline-block;cursor:default;background: url(\''

                    + this.options.themePath

                    + this.options.theme +'/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n' +

                    '.loaderrorclass{display:inline-block;cursor:default;background: url(\''

                    + this.options.themePath

                    + this.options.theme +'/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' +

                    '}',

                    this.document);

            },

            /* 初始化word上传按钮 */

            'worduploadbtnready': function(type, container) {

                containerBtn = container;

                me.afterConfigReady(initUploadBtn);

            }

        },

        outputRule: function(root){

            utils.each(root.getNodesByTagName('img'),function(n){

                if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) {

                    n.parentNode.removeChild(n);

                }

            });

        },

        commands: {

            'wordupload': {

                queryCommandState: function () {

                    return isLoaded ? 0:-1;

                }

            }

        }

    }

});

然后在同文件下的btnCmds变量中添加上自定义的按钮:

    //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起

    var btnCmds = ['undo', 'redo', 'formatmatch',

        'bold', 'italic', 'underline', 'fontborder', 'touppercase', 'tolowercase',

        'strikethrough', 'subscript', 'superscript', 'source', 'indent', 'outdent',

        'blockquote', 'pasteplain', 'pagebreak',

        'selectall', 'print','horizontal', 'removeformat', 'time', 'date', 'unlink',

        'insertparagraphbeforetable', 'insertrow', 'insertcol', 'mergeright', 'mergedown', 'deleterow',

        'deletecol', 'splittorows', 'splittocols', 'splittocells', 'mergecells', 'deletetable', 'drafts', 'wordupload'];

更多详细资料可以参考这篇文章:

http://blog.ncmem.com/wordpress/2019/08/12/ueditor-word%E5%9B%BE%E7%89%87%E8%BD%AC%E5%AD%98%E4%BA%A4%E4%BA%92/

技术交流可以入群一起讨论:223813913

至此,配置完成,结果示意图:

示例下载,下载前选择合适的语言版本:

wordpaster-vue3-cli-ueditor1.5: 泽优Word一键粘贴控件(WordPaster)是由荆门泽优软件有限公司开发的一个支持多平台(Windows,macOS,Linux)的简化Word内容发布的组件。适用于政府门户,集约化平台,CMS,OA,博客,文档管理系统,微信公众号,微博,自媒体,传媒,在线教育等领域。主要帮助用户解决Word文档图片一键粘贴,PowerPoint一键导入,PDF一键导入的问题,微信公众号内容一键转发,

wordpaster-vue-ueditor1.5: 泽优Word一键粘贴控件(WordPaster)是由荆门泽优软件有限公司开发的一个支持多平台(Windows,macOS,Linux)的简化Word内容发布的组件。适用于政府门户,集约化平台,CMS,OA,博客,文档管理系统,微信公众号,微博,自媒体,传媒,在线教育等领域。主要帮助用户解决Word文档图片一键粘贴,PowerPoint一键导入,PDF一键导入的问题,微信公众号内容一键转发,

wordpaster-asp.net-ueditor1.5x: 泽优Word一键粘贴控件(WordPaster)是由荆门泽优软件有限公司开发的一个支持多平台(Windows,macOS,Linux)的简化Word内容发布的组件。适用于政府门户,集约化平台,CMS,OA,博客,文档管理系统,微信公众号,微博,自媒体,传媒,在线教育等领域。主要帮助用户解决Word文档图片一键粘贴,PowerPoint一键导入,PDF一键导入的问题,微信公众号内容一键转发,

wordpaster-php-ueditor1x: 泽优Word一键粘贴控件(WordPaster)是由荆门泽优软件有限公司开发的一个支持多平台(Windows,macOS,Linux)的简化Word内容发布的组件。适用于政府门户,集约化平台,CMS,OA,博客,文档管理系统,微信公众号,微博,自媒体,传媒,在线教育等领域。主要帮助用户解决Word文档图片一键粘贴,PowerPoint一键导入,PDF一键导入的问题,微信公众号内容一键转发,

wordpaster-jsp-ueditor1x: 泽优Word一键粘贴控件(WordPaster)是由荆门泽优软件有限公司开发的一个支持多平台(Windows,macOS,Linux)的简化Word内容发布的组件。适用于政府门户,集约化平台,CMS,OA,博客,文档管理系统,微信公众号,微博,自媒体,传媒,在线教育等领域。主要帮助用户解决Word文档图片一键粘贴,PowerPoint一键导入,PDF一键导入的问题,微信公众号内容一键转发,

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

百度富文本编辑器UEditor配置及功能实现详解 的相关文章

  • 分了很多节的word文档,使用尾注插入的参考文献,最后怎么在参考文献之后加入致谢?

    转自 点击打开链接 需要设置一下 1 设置尾注的位置 引用 脚注 按这个功能区分组右下角的功能展开按钮 调出 脚注和尾注 设置对话框 在 位置 下 尾注 后选择 节的结尾 2 从第一节开始分别取消各节的 尾注 直到 参考文献 这节 页面布局
  • 百度AI加速器-百度智能云千帆大模型平台专项首期开营

    9月2日 3日 百度AI加速器 百度智能云千帆大模型平台专项计划第一期加速营在百度大厦举办 经过为期一个月的招募 上海烯牛信息 北京谷器数据 北京烽火万家 上海知潜等15家AI创业企业入选并参与首期开营仪式 入营企业将获得百度智能云提供的一
  • 在cms以及kindeditor中插入百度动态地图的方法

    想在网页中插入动态地图不难 直接打开网址http api map baidu com lbsapi creatmap 然后按照提示操作 最终生成脚本 放到html文件中即可 而在kindeditor中插入动态地图就更简单了 最新版的kind
  • Apollo项目坐标系研究

    声明 本文系作者davidhopper原创 未经允许 不得转载 百度Apollo项目用到了多种坐标系 其中帮助文档提及的坐标系包括 全球地理坐标系 The Global Geographic coordinate system 局部坐标系
  • Endnote 与word关联

    适用于endnotex7 endnotex8 endnotex9和office2019 office2021 第一步 打开Word 选择 选项 单击转到下一页 第二步 选择 加载项 COM加载项 转到 进入下一页 第三步 添加 可用加载项
  • Python 进阶(七): Word 基本操作

    1 概述 Word 是一个十分常用的文字处理工具 通常我们都是手动来操作它 本节我们来看一下如何通过 Python 来操作 Python 提供了 python docx 库 该库就是为 Word 文档量身定制的 安装使用 pip insta
  • python 实现百度关键字自动爬虫

    coding utf 8 In 3 import requests from lxml import etree import re from sqlalchemy import create engine engine create en
  • Java将PDF文件转为Word文档

    Java将PDF文件转为Word文档 一 创建Springboot Maven项目 二 导入依赖信息
  • 适用于 Windows 11/1 0电脑的 8 款最佳免费数据恢复软件

    在这个数字办公时代 我们总是在电脑前工作 处理海量数据 存储重要文件 然而 系统崩溃 病毒攻击或人为错误都会导致极度绝望的数据丢失 此时 专业的数据备份和恢复工具就是不幸者的救命稻草 因此 这篇文章将向您介绍适用于Windows 11 10
  • 百度智能云千帆大模型三连击:接入LLaMA2等33个模型、上线插件功能和103个Prompt模板

    作为全球首个一站式企业级大模型平台 百度智能云 千帆大模型平台 在提供包括文心一言在内的大模型服务及第三方大模型服务的同时 还提供大模型开发和应用的整套工具链 帮助企业解决大模型从训练到开发过程中的全链条问题 自2023年3月发布以来 千帆
  • Java准确获取Word/Excel/PPT/PDF的页数(附Word页数读不准的处理办法)

    Java准确获取Word Excel PPT PDF的页数 附Word页数读不准的处理办法 1 需求背景 2 环境准备工作 2 1 JACOB介绍及安装 2 2 Microsoft Office Word的设置 3 代码 3 1 代码示例
  • CSS中设置表格TD宽度的问题

    CSS布局 表格宽度不听使唤的实例 想把表格第一例宽度设为20 其他自适应 但CSS中宽度是等宽的 只设这一行也不起作用 但是在实际应用中总是等宽处理 并不按照样式来走 XML HTML代码
  • 爬虫与反爬虫技术简介

    互联网的大数据时代的来临 网络爬虫也成了互联网中一个重要行业 它是一种自动获取网页数据信息的爬虫程序 是网站搜索引擎的重要组成部分 通过爬虫 可以获取自己想要的相关数据信息 让爬虫协助自己的工作 进而降低成本 提高业务成功率和提高业务效率
  • Air Video

    http baike baidu com view 8552809 htm 1 百度首页 登录注册 新闻网页贴吧知道MP3图片视频地图百科文库 帮助 首页 自然 文化 地理 历史 生活 社会 艺术 人物 经济 科技 体育 图片 数字博物馆
  • 使用Spring Boot实现在服务器上在线打开、编辑和保存Word文档

    使用Spring Boot实现在服务器上在线打开 编辑和保存Word文档 在本文中 我们将探讨如何使用Spring Boot框架实现在服务器上实现在线打开 编辑和保存Word文档的功能 为此 我们将使用pageOffice插件来实现这一目标
  • Java Word转PDF

    两种方式 documents4j groupdocs 一 documents4j 1 添加依赖
  • POI实现Word文件转PDF

    需求 采用spire doc生成word文件后 需要加一个预览PDF的功能 可以直接采用POI对docx文件进行转换处理 public static void main String args throws Exception String
  • word添加字体库

    1001 Fonts Free Fonts Baby 51044 free fonts in 28637 families Free licenses for commercial use Direct font downloads Mac
  • Python-docx 深入word源码 自定义页码页脚以动态显示总页数和当前页数

    代码和效果图 先上能够正常显示页码页脚的Python代码和效果图 之后再解释原理和思路 from docx import Document from docx shared import Pt from docx oxml import O
  • 使用Python将Word文档转换为PDF的方法

    摘要 文介绍了如何使用Python编程语言将Word文档转换为PDF格式的方法 我们将使用python docx和pywin32库来实现这个功能 这些库提供了与Microsoft Word应用程序的交互能力 正文 在现实生活和工作中 我们可

随机推荐

  • openwrt 进入failsafe模式

    OpenWrt固件通过reset键恢复出厂设置方法 此方式适用于 忘记 OpenWrt 登入密码 配错路由器IP地址导致无法访问路由器 配错firewall或路由表导致无法登入路由器甚至无法ping路由器 操作步骤 1 把电脑的IP地址设为
  • 利用jmeter模拟手机接口测试

    利用jmeter模拟手机接口测试 由于批量上传图片不方便 可以到博主网站查阅原版博客 https blog zhenglin work jmeter use jmeter test app html 本文示例是从网上找到的月光茶人APP程序
  • 微信小程序支付完成后如何跳转指定页面

    很多人说使用reLaunch方式来跳转 此方法在 IOS 正常跳转 而在 Android 报错 relaunch fail can not invoka lelaunch in background 是因为支付成功后就会立马试图执行rela
  • Ubuntu下安装Android Studio

    Ubuntu下安装Android Studio 作者 gaolei xj更新于 05月18日访问 1568 评论 11 大晚上的睡不着 最近老失眠 索性玩玩Android Studio 我电脑的环境是Ubuntu 12 04 64位 And
  • C++包管理器vcpkg安装Opencv

    转载自 https www cnblogs com ttweixiao IT program p 12419876 html 电脑配置 window10 电脑型号 HUAWEI MateBook D 64位操作系统 基于x64的处理器 Mi
  • 磁盘调度算法笔记和练习题

    磁盘调度算法 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 练习题 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 它是一次只响应一个方向上的请求 这个方向上的请求都响应完了 再掉头处理另一个方向上的 有点
  • Centos7 安装Redis详细教程

    本文主要介绍如果在Centos7下安装Redis 1 安装依赖 redis是由C语言开发 因此安装之前必须要确保服务器已经安装了gcc 可以通过如下命令查看机器是否安装 gcc v 如果没有安装则通过以下命令安装 yum install y
  • 【C语言】 文本文件读取中文汉字出现乱码问题的解决方法

    include
  • 手把手教你如何写一个三子棋/N子棋的小游戏

    这里写目录标题 第一步 游戏进入界面 第二步 初始化棋盘 第三步 打印棋盘 第四步 玩家和电脑下棋 第五步 判断输赢 三子棋或者N子棋怎么写 让我们先来玩一把 再来看看怎么写 程序运行界面 1为玩游戏 2为清屏 0为退出游戏 我们选1 然后
  • 前端多个参数传参js

    function getparm 返回当前 URL 的查询部分 问号 之后的部分 var urlParameters location search 声明并初始化接收请求参数的对象 var requestParameters new Obj
  • PPTP中的PAC 和PNS

    http blog csdn net galdys article details 6682298 网络服务器 PNS 访问集线器 PAC PAC 可编程自动化控制器 的概念是由ARC咨询集团的高级研究员Craig Resnick提出的 在
  • rostcm6情感分析案例分析_基于情感词典的情感分析方法

    上节课我们介绍了基于SnowNLP快速进行评论数据情感分析的方法 本节课老shi将介绍基于情感词典的分析方法 基于情感词典的分析方法是情感挖掘分析方法中的一种 其普遍做法是 首先对文本进行情感词匹配 然后汇总情感词进行评分 最后得到文本的情
  • LeetCode -- 1833. 雪糕的最大数量

    使用的算法 计数排序 贪心算法 计数排序 1 基于比较的排序算法 2 在对一定范围内的整数排序时 它的复杂度为 n k 其中k是整数的范围 快于任何比较排序算法 当O k gt O nlog n 的时候其效率反而不如基于比较的排序 基于比较
  • Kali Linux进阶篇:Nmap扫描网络空间存活主机技巧

    课前声明 1 本分享仅做学习交流 请自觉遵守法律法规 2 搜索 Kali与编程 学习更多网络攻防干货 一 背景介绍 nmap是一个网络连接端扫描软件 用来扫描网上电脑开放的网络连接端 确定哪些服务运行在哪些连接端 并且推断计算机运行哪个操作
  • Java对象的快速复制的几种方式

    浅拷贝 深度复制 BeanUtils copyProperties 对象的克隆是指创建一个新的对象 且新的对象的状态与原始对象的状态相同 当对克隆的新对象进行修改时 不会影响原始对象的状态 注释 clone 是object类的protect
  • Makefile中的include命令详解

    转载地址 点击打开链接 关于Makefile中的include命令 网上有很多介绍 比较普遍的说法是 Makefile中的include命令与C语言中的include命令类似 命令include file dep 即把file dep文件在
  • 最流行的五大数据模型工具

    当今的商业决策对基于天的数据依赖越来越强烈 然而 正确而连贯的数据流对商业用户做出快速 灵活的决策起到决定性的作用 建立正确的数据流和数据结构才能保证最好的结果 这个过程叫做数据建模 为了避免认为错误并且加快进度 我们需要使用专业的软件来帮
  • CUBLAS变量解释(1)

    变量类型 cublasOperation t 解释 该类型表明输入的密集矩阵的形式 其值有 CUBLAS OP N 非转置 CUBLAS OP T 转置 CUBLAS OP C 共轭转置 该函数对应于BLAS FORTRAN版 的变量字符
  • C++文本文件,二进制文件,write(),read(),map容器,seekg(),seekp(),tellg(),tellp()函数

    include
  • 百度富文本编辑器UEditor配置及功能实现详解

    当前功能基于PHP 其它语言流程大抵相同 大概流程 1 将docx文件上传到服务器中 2 使用PHPoffice PHPword实现将word转换为HTML 3 将HTML代码返回并赋值到编辑器中 1 编辑器配置修改 1 1 新增上传wor