1. 程式人生 > 其它 >java使用Spire.Doc生成的word檔案去除水印(頭部的警告資訊)

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

轉載請註明原文連結:https://www.cnblogs.com/yuanyuzhou/p/15809136.html

個人網站:www.dianjilingqu.com