CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

手把手帮你视频转文本(3-导出word)-永久免费的源码丞旭猿

你好,这是系列文章的最后一篇,我们将实现把文本记录导出到一个格式规整的word文档中,方便阅读和分享。同样,相关代码均在gitee开源(https://gitee.com/coolpine/thomas)

整体架构

本篇处于整体转换流程中第三步,具体如下图所示:

整体处理流程

docx文档格式简介

首先,为你大致介绍下docx文档格式。docx其实是一个压缩格式文件,手工将后缀修改为zip后,即可解压该文件。通常主要的内容结构都在解压后的word/document.xml 文件中。

例如,下图是一个最简单的word文档,正文只有你好两个字:

docx示例文档

将该文档后缀修改为.zip后,解压该文档,会看到word/document.xml的主要内容如下

<w:documentxmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"mc:Ignorable="w14 w15 w16se w16cid w16 w16cex wp14"><w:body><w:pw14:paraId="6D5AFF05"w14:textId="678C6FAC"w:rsidR="000933A6"w:rsidRDefault="008D746B"><w:r><w:rPr><w:rFontsw:hint="eastAsia"/>w:rPr><w:t>你好w:t>w:r>w:p>w:body>w:document>

从上面文件可以大致看出word文档基本构造:

  • 是段落
  • 是段落中的行
  • 是行样式信息
  • 是文本内容

docx4j库的基本逻辑与上述xml组织结构是对应的:将上述xml的内容,转换为对应的java对象及方法,实现文档生成、编辑等功能。

docx4j文档操作

接下来基于docx4j库,实现word文档操作。

首先,引入docx4j依赖:

<groupId>org.docx4jgroupId><artifactId>docx4j-JAXB-ReferenceImplartifactId><version>8.1.6version>

首先,我们要将每个视频文件的对话记录,生成如下模式的表格:

内容表格示例

对应表格的处理逻辑是:

// 创建表头Tbl tbl = Context.getWmlObjectFactory().createTbl();//设置表格基本样式,包括边框等String strTblPr ="+ Namespaces.W_NAMESPACE_DECLARATION
        +">"+""+""+""+"";try{
    TblPr tblPr = (TblPr) XmlUtils.unmarshalString(strTblPr);
    tbl.setTblPr(tblPr);
}catch(JAXBException e) {
    log.error("基于XML解析生成TblPr出错", e);
}// 设置标题行Tr hearTr = Context.getWmlObjectFactory().createTr();
tbl.getContent().add(hearTr);
geneTblHearderCell(hearTr,"D9D9D9",2629, docPart.createParagraphOfText("时间"));
geneTblHearderCell(hearTr,"D9D9D9",5667, docPart.createParagraphOfText("内容"));// 设置内容行taskResultRepo.findByTaskIdEqualsOrderByBeginTimeAsc(taskId).forEach(result -> {
    Tr tr = Context.getWmlObjectFactory().createTr();
    tbl.getContent().add(tr);//创建第一个单元格Tc tc1 = Context.getWmlObjectFactory().createTc();
    tc1.getContent().add(docPart.createParagraphOfText(formatSecond(result.getBeginTime())));//创建第二个单元格Tc tc2 = Context.getWmlObjectFactory().createTc();
    tc2.getContent().add(docPart.createParagraphOfText(result.getWords()));//将单元格加入到表格中tr.getContent().addAll(Arrays.asList(tc1, tc2));
});//将表格加入到文档中docPart.getContent().add(tbl);//增加分页符docPart.getContent().add(createNextPage());

有一点特别提醒下,建议尽量不要使用XmlUtils.unmarshalString来生成对象,除了上述参考官方示例在创建表头TblPr外,本项目所有其他结构,均是采用java对象来构建。原因是直接基于xml解析,很容易出现命名空间的错误。

docx4j还支持将图片插入到文档中,例如:

//将图片写入到word文档中Inline inline =null;try{
    BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordPackage,
            Files.readAllBytes(Paths.get("doc\\thomas-gitee.png")));
    inline = imagePart.createImageInline("开源工程地址","二维码图片",1,2,false);
}catch(Exception e) {
    log.error("创建图片对象出现异常", e);
}

ObjectFactory factory = Context.getWmlObjectFactory();
P p = factory.createP();
R r = factory.createR();
p.getContent().add(r);
Drawing drawing = factory.createDrawing();
r.getContent().add(drawing);
drawing.getAnchorOrInline().add(inline);

以下是设置标题及章节,分别将内容样式设置为Title和Heading1即可:

//设置文档标题mainDocumentPart.addStyledParagraphOfText("Title", THOMAS_DOCX_NAME);//取出第一行,作为章节名称mainDocumentPart.addStyledParagraphOfText("Heading1", taskInfo.getTaskName());

生成目录也很简单:

//生成目录,该段内容要放到最后面Toc.setTocHeadingText("目录");
TocGenerator tocGenerator =newTocGenerator(wordPackage);
tocGenerator.generateToc(5," TOC \\o \"1-3\" \\h \\z \\u ",true);

需要提醒的是,generateToc方法中的第一个参数是将目录插入到文档中的位置,上述代码是将目录插入到第五个位置。

文档结构组装完成后,直接WordprocessingMLPackage的save方法即可保存文档。

最后

至此,我们终于完成将MP4视频中的对话,最终转化为文字,并且输出为一个格式规范的word文档,实现过程如有有错漏之处,敬请反馈,谢谢。

本系列采用《托马斯和朋友》动画视频作为素材,起源是孩子们特别喜欢这个动画节目,特别喜欢听托马斯的故事,为了更好的给孩子们讲托马斯睡前故事,一时兴起实现了这些功能,希望对你也有帮助

声明:本文部分素材转载自互联网,如有侵权立即删除 。

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容