Java實現(xiàn)word轉(zhuǎn)pdf并在關鍵字位置插入圖片
java word轉(zhuǎn)pdf、word中關鍵字位置插入圖片 工具類
1.pom依賴
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.15</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.15</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.15</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>ooxml-schemas</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.15</version>
2.依賴jar包
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>15.8.0</version>
<scope>system</scope>
<systemPath>${pom.basedir}/src/main/webapp/WEB-INF/lib/aspose-words-15.8.0-jdk16.jar</systemPath>
</dependency>
aspose-words是需要在我們項目中引入的,并且使用時要在resouces目錄下導入license.xml文件,否則生成的文件抬頭會有紅色的license信息。
3.工具類
import com.aspose.words.*;
import com.aspose.words.Document;
import org.apache.poi.xwpf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* @author dume
* @ClassName WordToPdf
* @description: TODO
* @date 2024年07月02日
* @version: 1.0
*/
public class WordUtils {
private static Logger logger = LoggerFactory.getLogger(WordUtils.class);
private static final String BASE_PATH = WordUtils.class.getClassLoader().getResource("").getPath();
/**
* Word轉(zhuǎn)Pdf
* @param sourcePath 原路徑
* @param targetPath 轉(zhuǎn)出路徑
* @return
*/
public static boolean WordToPdf(String sourcePath,String targetPath){
FileOutputStream os = null;
try{
// 驗證License 若不驗證則轉(zhuǎn)化出的pdf文檔會有水印產(chǎn)生
if (!getLicense()) {
logger.info("license驗證失敗");
return false;
}
File file = new File(targetPath);
os = new FileOutputStream(file);
FontSettings.setFontsFolder(BASE_PATH, true);
FontSettings.setDefaultFontName("STFANGSO");
Document doc = new Document(sourcePath);
doc.save(os, SaveFormat.PDF);
os.flush();
os.close();
}catch (Exception e){
e.printStackTrace();
logger.error(e.getMessage());
return false;
}finally {
if(os!=null){
try{
os.close();
}catch (Exception e){
}
}
}
return true;
}
/**
* word中插入圖片方法
* @param sourcePath word路徑
* @param imgPath 圖片路徑
* @param keyWords 關鍵字
* @return 插入是否成功
*/
public static boolean InsertImg(String sourcePath,String imgPath,String keyWords){
try{
// 驗證License 若不驗證則轉(zhuǎn)化出的pdf文檔會有水印產(chǎn)生
if (!getLicense()) {
logger.info("license驗證失敗");
return false;
}
Document doc = new Document(sourcePath);
DocumentBuilder builder = new DocumentBuilder(doc);
//插入圖片的方法
NodeCollection runs = doc.getChildNodes(NodeType.PARAGRAPH, true);
for (int i = 0; i < runs.getCount(); i++) {
Node r = runs.get(i);
String text = r.getText();
//獲取鍵
if(text.contains(keyWords)){
//鎖定到當前段落即實現(xiàn)頁面變換
builder.moveTo(r);
builder.insertImage(imgPath, RelativeHorizontalPosition.PAGE, 205, RelativeVerticalPosition.PAGE, 0, 20, 7, WrapType.INLINE);
break;
}
}
doc.save(sourcePath);
}catch (Exception e){
e.printStackTrace();
logger.error(e.getMessage());
return false;
}
return true;
}
public static boolean getLicense() {
boolean result = false;
try {
FileInputStream is = new FileInputStream (BASE_PATH+"license.xml");
License asposeLicense = new License();
asposeLicense.setLicense(is);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/***
* @Description :替換段落文本
* @param document docx解析對象
* @param textMap 需要替換的信息集合
* @return void
*/
public static void changeText(XWPFDocument document, Map<String, Object> textMap) {
// 獲取段落集合
Iterator<XWPFParagraph> iterator = document.getParagraphsIterator();
XWPFParagraph paragraph = null;
while (iterator.hasNext()) {
paragraph = iterator.next();
// 判斷此段落是否需要替換
if (checkText(paragraph.getText())) {
replaceValue(paragraph, textMap);
}
}
}
/***
* @Description :替換表格內(nèi)的文字
* @param document
* @param data
* @return void
*/
public static void changeTableText(XWPFDocument document, Map<String, Object> data) {
// 獲取文件的表格
Iterator<XWPFTable> tableList = document.getTablesIterator();
XWPFTable table;
List<XWPFTableRow> rows;
List<XWPFTableCell> cells;
// 循環(huán)所有需要進行替換的文本,進行替換
while (tableList.hasNext()) {
table = tableList.next();
if (checkText(table.getText())) {
rows = table.getRows();
// 遍歷表格,并替換模板
for (XWPFTableRow row : rows) {
cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
// 判斷單元格是否需要替換
if (checkText(cell.getText())) {
List<XWPFParagraph> paragraphs = cell.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
replaceValue(paragraph, data);
}
}
}
}
}
}
}
/***
* @Description :檢查文本中是否包含指定的字符(此處為“$”)
* @param text
* @return boolean
*/
public static boolean checkText(String text) {
boolean check = false;
if (text.contains("$")) {
check = true;
}
return check;
}
/***
* @Description :替換內(nèi)容
* @param paragraph
* @param textMap
* @return void
*/
public static void replaceValue(XWPFParagraph paragraph, Map<String, Object> textMap) {
XWPFRun run, nextRun;
String runsText;
List<XWPFRun> runs = paragraph.getRuns();
for (int i = 0; i < runs.size(); i++) {
run = runs.get(i);
runsText = run.getText(0);
if (runsText.contains("${") || (runsText.contains("$") && runs.get(i + 1).getText(0).substring(0, 1).equals("{"))) {
while (!runsText.contains("}")) {
nextRun = runs.get(i + 1);
runsText = runsText + nextRun.getText(0);
//刪除該節(jié)點下的數(shù)據(jù)
paragraph.removeRun(i + 1);
}
Object value = changeValue(runsText, textMap);
//判斷key在Map中是否存在
String replaceText = runsText.replace("${", "").replace("}", "");
if (textMap.containsKey(replaceText)) {
run.setText(value.toString(), 0);
} else {
//如果匹配不到,則不修改
run.setText(runsText, 0);
}
}
}
}
/***
* @Description :匹配參數(shù)
* @param value
* @param textMap
* @return java.lang.Object
*/
public static Object changeValue(String value, Map<String, Object> textMap) {
Object valu = "";
for (Map.Entry<String, Object> textSet : textMap.entrySet()) {
// 匹配模板與替換值 格式${key}
String key = textSet.getKey();
if (value.contains(key)) {
valu = textSet.getValue();
}
}
return valu;
}
}以上就是Java實現(xiàn)word轉(zhuǎn)pdf并在關鍵字位置插入圖片的詳細內(nèi)容,更多關于Java word轉(zhuǎn)pdf的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot2開發(fā)從0開始Spring?Initailizr初始化
這篇文章主要為大家介紹了SpringBoot2從0開始lombok、devtools、Spring?Initailizr的開發(fā)技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
JavaWeb項目web.xml中出現(xiàn)Element xxx is not al
這篇文章主要介紹了JavaWeb項目web.xml中出現(xiàn)Element xxx is not allowed here問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
springboot利用aspose預覽office文件的實現(xiàn)過程
這篇文章主要給大家介紹了關于springboot利用aspose預覽office文件的相關資料,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考價值,需要的朋友可以參考下2021-06-06
Spring Cloud實現(xiàn)跨語言微服務通信的三種方案
本文深入探討Spring Cloud實現(xiàn)跨語言微服務通信的三大核心方案: Sidecar模式:通過代理非Java服務,性能提升5倍,延遲從150ms降至30ms ASM+MSE方案:結合阿里云服務網(wǎng)格,吞吐量提升3倍至2400TPS Feign+自定義序列化,需要的朋友可以參考下2026-05-05

