1.如何把视频里的文字提取出来,做成WORD格式的
整体处理流程docx文档格式简介首先,为你大致介绍下docx文档格式。
docx其实是一个压缩格式文件,手工将后缀修改为zip后,即可解压该文件。通常主要的内容结构都在解压后的word/document.xml 文件中。
例如,下图是一个最简单的word文档,正文只有“你好”两个字:docx示例文档将该文档后缀修改为.zip后,解压该文档,会看到word/document.xml的主要内容如下<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 你好 从上面文件可以大致看出word文档基本构造:是段落是段落中的行是行样式信息是文本内容docx4j库的基本逻辑与上述xml组织结构是对应的:将上述xml的内容,转换为对应的java对象及方法,实现文档生成、编辑等功能。docx4j文档操作接下来基于docx4j库,实现word文档操作。
首先,引入docx4j依赖:org.docx4jdocx4j-JAXB-ReferenceImpl8.1.6首先,我们要将每个视频文件的对话记录,生成如下模式的表格:内容表格示例对应表格的处理逻辑是:// 创建表头Tbl tbl = Context.getWmlObjectFactory().createTbl();//设置表格基本样式,包括边框等String strTblPr = "" + "" + "" + "" + "";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.(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 { imagePart = .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.("Title", THOMAS_DOCX_NAME);//取出第一行,作为章节名称mainDocumentPart.("Heading1", taskInfo.getTaskName());生成目录也很简单://生成目录,该段内容要放到最后面Toc.setTocHeadingText("目录");TocGenerator tocGenerator = new TocGenerator(wordPackage);tocGenerator.generateToc(5, " TOC \\o \"1-3\" \\h \\z \\u ", true);需要提醒的是,generateToc方法中的第一个参数是将目录入到文档中的位置,上述代码是将目录插入到第五个位置。文档结构组装完成后,直接的save方法即可保存文档。
最后至此,我。