一、前言 在項目中有需要對word進行操作的,可以看看哈,本次使用比較強大的spire組件來對word進行操作,免費版支持三頁哦,對於不止三頁的word文件,可以購買收費版,官網:https://www.e-iceblue.cn/tutorials.html#,也可使用其他組件實現,如poi、doc ...
一、前言
在項目中有需要對word進行操作的,可以看看哈,本次使用比較強大的spire組件來對word進行操作,免費版支持三頁哦,對於不止三頁的word文件,可以購買收費版,官網:https://www.e-iceblue.cn/tutorials.html#,也可使用其他組件實現,如poi、docx4j等,我將代碼整理成工具類了,大家可以拿下來直接使用哈,一起努力吧。
二、Spire的使用
1、引入pom.xml
<!-- 免費版 .free 只支持前三頁轉化 -->
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.office.free</artifactId>
<version>5.3.1</version>
</dependency>
2、AddStampUtils
工具類
/**
* @Author:wk
* @Slogan:無論風雨,和自己一決勝負吧
* @Create:2022/7/15/9:30
* @Description:TODO Word文件操作工具類
* @Version:1.0
*/
@Slf4j
public class AddStampUtils {
// 轉換目標文件地址
// public static String WORD_OLD_URL = "src/main/resources/word/20200429宋體伺服器同步版.doc";
// 轉換後文件存放地址
// public static String WORD_NEW_URL = "src/main/resources/word/20200429宋體伺服器同步版2.doc";
// WORD轉PDF存放位置
// public static String PDF_NEW_URL = "src/main/resources/pdf/20200429宋體伺服器同步版2.pdf";
// 電子印章圖片地址
// public static String STAMP_IMG_URL = "src/main/resources/word/stamp.png";
/**
* 1、自定義位置添加電子印章
* 2、替換書簽名位置文本內容 bookmarkName傳參為null,則不進行書簽替換操作
* @param wordOldUrl word文件路徑
* @param wordNewUrl 新word文件路徑
* @param stampImgUrl 電子印章圖片路徑
* @param horizontal 電子印章水平位置 (當前文件推薦260f)
* @param vertical 電子印章垂直位置 (當前推薦455f)
* @param stampWidth 電子印章寬度(推薦120)
* @param stampHeight 電子印章高度(推薦120)
* @param bookmarkName 書簽名,通過名稱尋找書簽文本所在位置
* @param newBookmarkText 替換的文本新內容
*/
public void addStamp(
String wordOldUrl,String wordNewUrl,String stampImgUrl,
Float horizontal,Float vertical,Float stampWidth,
Float stampHeight,String bookmarkName,String newBookmarkText
) {
// 載入文檔
Document document = new Document();
document.loadFromFile(wordOldUrl);
// 獲取指定段落
Section section = document.getSections().get(0);
// 獲取段落總數
int count = section.getParagraphs().getCount();
log.info("獲取文檔內容段落總數{}",count);
Paragraph paragraph = section.getParagraphs().get(0);
// 判斷是否需要替換書簽位置文本內容
if (StringUtils.isNotEmpty(bookmarkName)) {
replaceBookmarkContent(document,bookmarkName,newBookmarkText);
}
// 添加電子印章
DocPicture docPicture = paragraph.appendPicture(stampImgUrl);
// 指定電子章位置
// 水平位置
docPicture.setHorizontalPosition(horizontal);
// 垂直位置
docPicture.setVerticalPosition(vertical);
// 設置電子章大小
docPicture.setWidth(stampWidth);
docPicture.setHeight(stampHeight);
// 設置圖片位於文字頂層
docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text);
// 保存添加電子章的Word文檔
document.saveToFile(wordNewUrl);
document.dispose();
log.info("文檔添加電子印章結束,新WORD文檔地址:{}",wordNewUrl);
}
/**
* 1、根據關鍵詞位置添加電子印章
* 2、替換書簽名位置文本內容 bookmarkName傳參為null,則不進行書簽替換操作
* @param wordOldUrl word文件路徑
* @param wordNewUrl 新word文件路徑
* @param stampImgUrl 電子印章圖片路徑
* @param keyWord 關鍵字 (自定義)
* @param keyWordIndex 關鍵字索引 (-1)
* @param horizontal 電子印章水平位置 (260f)
* @param vertical 電子印章垂直位置 (-55f)
* @param stampWidth 電子印章寬度 (推薦120)
* @param stampHeight 電子印章高度(推薦120)
* @param bookmarkName 書簽名,通過名稱尋找書簽文本所在位置
* @param newBookmarkText 替換的文本新內容
*/
public void addKeyWordStamp(
String wordOldUrl,String wordNewUrl,String stampImgUrl,
String keyWord,Integer keyWordIndex,Float horizontal,
Float vertical,Float stampWidth,Float stampHeight,
String bookmarkName,String newBookmarkText
) {
// 載入文檔
Document document = new Document();
document.loadFromFile(wordOldUrl);
// 判斷是否需要替換書簽位置文本內容
if (StringUtils.isNotEmpty(bookmarkName)) {
replaceBookmarkContent(document,bookmarkName,newBookmarkText);
}
// 獲取關鍵字位置
TextSelection[] textSelections = document.findAllString(keyWord, false, false);
if (ObjectUtils.isNotEmpty(textSelections)) {
Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph();
// 添加電子印章
DocPicture docPicture = paragraph.appendPicture(stampImgUrl);
// 設置圖片位於文字頂層
docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text);
// 指定電子章位置
// 水平位置
docPicture.setHorizontalPosition(horizontal);
// 垂直位置
docPicture.setVerticalPosition(vertical);
// 設置電子章大小
docPicture.setWidth(stampWidth);
docPicture.setHeight(stampHeight);
}
// 保存添加電子章的Word文檔
document.saveToFile(wordNewUrl);
document.dispose();
log.info("文檔添加電子印章結束,新WORD文檔地址:{}",wordNewUrl);
}
/**
* 替換書簽名位置文本內容
* @param document word文檔對象
* @param bookmarkName 書簽名
* @param newBookmarkText 新文本內容
*/
public void replaceBookmarkContent(Document document,String bookmarkName,String newBookmarkText) {
//定位到指定書簽位置
BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document);
bookmarksNavigator.moveToBookmark(bookmarkName);
//用文本內容替換原有書簽位置的文本,新替換的內容與原文格式一致
bookmarksNavigator.replaceBookmarkContent(newBookmarkText,true);
}
/**
* 替換書簽名位置文本內容為圖片
* @param document word文檔對象
* @param bookmarkName 書簽名
* @param newImgUrl 圖片地址
*/
public void replaceBookmarkContentToImg(Document document,String bookmarkName,String newImgUrl) {
//定位到指定書簽位置
BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document);
bookmarksNavigator.moveToBookmark(bookmarkName);
//添加圖片,替換原有書簽內容
Paragraph para= new Paragraph(document);
para.appendPicture(newImgUrl);
TextBodyPart bodyPart = new TextBodyPart(document);
bodyPart.getBodyItems().add(para);
bookmarksNavigator.replaceBookmarkContent(bodyPart);
}
/**
* 替換書簽名位置文本內容為表格
* @param document word文檔對象
* @param bookmarkName 書簽名
*/
public void replaceBookmarkContentToTable(Document document,String bookmarkName) {
//聲明數組內容
String[][] data =
{
new String[]{"分類", "等級", "編號"},
new String[]{"A", "一級", "01A"},
new String[]{"B", "二級", "02B"},
new String[]{"C", "三級", "03C"},
};
//創建表格
Table table = new Table(document, true);
table.resetCells(4, 3);
for (int i = 0; i < data.length; i++) {
TableRow dataRow = table.getRows().get(i);
for (int j = 0; j < data[i].length; j++) {
TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]);
range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
range.getCharacterFormat().setFontName("楷體");
dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center);
dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle);
}
}
//創建TextBodyPart對象
TextBodyPart bodyPart= new TextBodyPart(document);
bodyPart.getBodyItems().add(table);
//定位到指定書簽位置
BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document);
bookmarkNavigator.moveToBookmark(bookmarkName);
//使用表格替換原書簽的內容
bookmarkNavigator.replaceBookmarkContent(bodyPart);
}
/**
* word轉PDF
* @param wordNewUrl word文件路徑
* @param pdfNewUrl 存儲新PDF文件路徑
*/
public void wordToPdf(String wordNewUrl, String pdfNewUrl) {
// 將新Word文檔轉換為PDF文件
Document document = new Document();
document.loadFromFile(wordNewUrl);
document.saveToFile(pdfNewUrl, FileFormat.PDF);
document.dispose();
log.info("文檔轉換結束,新PDF文檔地址:{}",pdfNewUrl);
}
}
3、測試
Main主函數測試
public static void main(String[] args) {
// 目標文件地址
String wordOldUrl = "src/main/resources/word/20200429宋體伺服器同步版.doc";
// 添加電子印章後文件存放地址
String wordNewUrl = "src/main/resources/word/20200429宋體伺服器同步版2.doc";
// WORD轉PDF存放位置
String pdfNewUrl = "src/main/resources/pdf/20200429宋體伺服器同步版2.pdf";
// 電子印章圖片地址
String stampImgUrl = "src/main/resources/word/stamp.png";
// word文檔內容關鍵字
String keyWord = "蓋章";
// 索引,預設就填-1即可
Integer keyWordIndex = -1;
// 電子印章水平位置
float horizontal = 260f;
// 電子印章垂直位置
float vertical = -55f;
// 電子印章寬度
float stampWidth = 120;
// 電子印章高度
float stampHeight = 120;
// 書簽名
String bookmarkName = "ZWSTTCJKBH";
// 書簽位置文本替換新內容
String newBookmarkText = "公開";
AddStampUtils addStampUtils = new AddStampUtils();
// 獲取關鍵字位置並加蓋印章並替換書簽名位置文本內容
addStampUtils.addKeyWordStamp(wordOldUrl,wordNewUrl,stampImgUrl,keyWord,keyWordIndex,horizontal,vertical,stampWidth,stampHeight,bookmarkName,newBookmarkText);
// 將新word轉化為pdf文件
addStampUtils.wordToPdf(wordNewUrl,pdfNewUrl);
}
4、效果展示
Before
舊書簽位置內容
文檔蓋章地方:
After
5、註意事項
將word轉化為PDF時,打開pdf,發現頂部多了一條橫線,如下:
這條橫線的由來:傳說這條橫線是由於word文件的頁眉導致的,經過我的證實,發現將滑鼠移動至頁面頂端,並且雙擊進入了頁眉編輯狀態,退出時有時就會在留下一根頁眉橫線(即使啥都不輸入),由此得出傳說也可信。哈哈哈,心情愉悅一下
處理方法:
第一種方法:首先將點擊頁眉,進入頁眉編輯狀態,並將游標置於頁眉處。然後單擊“開始”,找到“樣式”裡面的“正文”樣式,輕鬆刪除。
第二種方法(推薦):將游標置於頁眉處,同時按住鍵盤上的:Ctrl+Shift+N,頁眉橫線立即消失,再按ESC鍵退出頁眉編輯即可。
無論風雨,和自己一決勝負吧