java使用Spire.Doc生成的word文件去除水印(头部的警告信息)
1.需求
通过word模板和库表中数据动态生成word文档。
word操作工具本身自带word转xml(直接另存为xml即可)。
但是需求明确了,只能用word模板,也不允许用户手动从word转xml再上传。
数据动态生成使用了freemark,freemark需要一个xml或flt文件,所以结合上边的不能传xml的需求,我将word模板使用Spire.Doc将word模板转xml,在使用freemark进行xml的动态解析完成了任务
2.问题
在使用Spire.Doc的word文档产生了警告水印
(Evaluation Warning: The document was created with Spire.Doc for JAVA.)
3.问题解决
3.1. 我是先从网上找方案但是我使用第一种方法直接报错,也没找到报错原因,直接放弃,第二种因为得换包并且有长度限制,直接放弃
方法一:
//重新读取生成的文档
InputStream is = new FileInputStream("E:\\demo.docx");
XWPFDocument document = new XWPFDocument(is);
//以上Spire.Doc 生成的文件会自带警告信息,这里来删除Spire.Doc 的警告
document.removeBodyElement(0);
//输出word内容文件流,新输出路径位置
OutputStream os=new FileOutputStream("E:\\demo1.docx");
try {
document.write(os);
System.out.println("生成docx文档成功!");
} catch (Exception e) {
e.printStackTrace();
}
方法二:用free spire.Doc for Java这个是免费版,有一定限制, 导出的时候可生成的段落不能超过固定的数量,但是导出来的Word是没有警告信息的,商业版的spire.Doc for Java才会有警告信息
————————————————
版权声明:本文为CSDN博主「一纸的空白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33745005/article/details/108140983
3.2. 下面是我的解决方案
我首先想到的是解析每一行的word成数组,然后将第一行元素删除掉并且将数据输出到新的文件(我在思考word文档的格式问题怎么解决,但是我决定先试一下),当我解析出来以后我发现word文档输出出来是一行xml。于是我想到了新的解决方式:将xml中的警告直接用空字符串替换掉在输出,贴代码
下面方法我是直接对生成的word进行操作的,也可以在word转xml时直接对xml进行操作,原理和方法完全一样
//这里是根据解析出的xml抽取出的警告水印的样式及其xml标签,方便下面替换用 //如果这里只是替换文字的话会有空行,所以直接将整个标签替换 private final String WARN = "<w:p><w:pPr /><w:r><w:rPr><w:color w:val=\"FF0000\" /><w:sz w:val=\"24\" /></w:rPr><w:t xml:space=\"preserve\">Evaluation Warning: The document was created with Spire.Doc for JAVA.</w:t></w:r></w:p>"; //原文件 String docName = fileName + uuid + ".doc"; File file = new File(docPath); /** * 消除警告开始 * 创建解析对象,注意这里的包是cn.hutool.core.io.file.FileReader * 因为这里使用jdk自带的java.io.FileReader时候解析出的xml不全 */ FileReader fileReader = new FileReader(file); String str = fileReader.readString(); //替换 str = str.replaceAll(WARN,""); //输出,这里的包我就直接用的java.io,用hutool也没问题 FileWriter fileWriter = new FileWriter(file); fileWriter.write(str);//消除警告结束
下面是word转xml
//这里的包是com.spire.doc.Document Document doc = new Document(); doc.loadFromStream(inputStream, FileFormat.Doc); doc.saveToFile(xmlPath, FileFormat.Word_Xml); doc.dispose();
使用到的jar包 pom
<repositories> <repository> <id>com.e-iceblue</id> <url>http://repo.e-iceblue.cn/repository/maven-public/</url> </repository> </repositories> <dependencies> <dependency> <groupId>e-iceblue</groupId> <artifactId>spire.doc</artifactId> <version>3.7.2</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version> </dependency> </dependencies>
4.总结
word的本质其实是xml,这应该也是word存储样式的本质。
喜欢记得关注点赞~
转载请注明出处哦~
https://blog.csdn.net/L_Open2021/article/details/122506478