使用docx4j 實現word轉pdf(linux亂碼處理)

由于系統之前使用了是itext進行轉換的,現在已經不是開源的工具了,需要收費,然后進行改造,具體處理如下。

<dependency><groupId>org.docx4j</groupId><artifactId>docx4j</artifactId><version>6.1.2</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><exclusion><groupId>xalan</groupId><artifactId>xalan</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.docx4j</groupId><artifactId>docx4j-export-fo</artifactId><version>6.0.0</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><exclusion><groupId>xalan</groupId><artifactId>xalan</artifactId></exclusion></exclusions></dependency>

以上排查一下日志,因為和自己的有沖突,所以,自己項目看情況而定。

public static void writeWordModle(String inPath, String outPath, Map<String, String> params,String rootpath) throws Exception {FileInputStream is = null;FileOutputStream targetpdf = null;WordprocessingMLPackage wordMLPackage = null;CustomXWPFDocument doc = null;ByteArrayOutputStream baos = null;InputStream inputStream = null;try {// 加載 Word 文檔File file = new File(inPath);is = new FileInputStream(file);doc = new CustomXWPFDocument(is);// 替換文本和表格中的變量WordUtils wordUtil = new WordUtils();wordUtil.replaceInPara(doc, params);    // 替換文本里面的變量wordUtil.replaceInTable(doc, params); // 替換表格里面的變量// 將 XWPFDocument 轉換為字節數組baos = new ByteArrayOutputStream();doc.write(baos);baos.flush();byte[] docBytes = baos.toByteArray();// 使用字節數組創建輸入流inputStream = new ByteArrayInputStream(docBytes);// 將輸入流轉換為 WordprocessingMLPackagewordMLPackage = WordprocessingMLPackage.load(inputStream);// 設置字體映射器IdentityPlusMapper fontMapper = new IdentityPlusMapper();//加載字體fontMapper = setFontMapper(fontMapper);//解決宋體(正文)和宋體(標題)的亂碼問題,以下是在linux的關鍵PhysicalFonts.put("PMingLiU", PhysicalFonts.get("SimSun"));PhysicalFonts.put("新細明體", PhysicalFonts.get("SimSun"));wordMLPackage.setFontMapper(fontMapper);    // 執行轉換targetpdf = new FileOutputStream(outPath);Docx4J.toPDF(wordMLPackage, targetpdf);} catch (Exception e) {e.printStackTrace();throw e;} finally {// 關閉所有流close(is);close(targetpdf);close(baos);close(inputStream);}}

因為我是通過word模版生成了流然后通過流轉換成pdf的,可以使用File docFile = new File(docxPath);替代代碼中的? ?inputStream = new ByteArrayInputStream(docBytes);

 //解決宋體(正文)和宋體(標題)的亂碼問題,以下是在linux的關鍵PhysicalFonts.put("PMingLiU", PhysicalFonts.get("SimSun"));PhysicalFonts.put("新細明體", PhysicalFonts.get("SimSun"));

這句很關鍵,我測試了很久找了很多資料,這個解決了linux環境亂碼的問題。

/** * 字體設置* @param mlPackage* @throws Exception*/private static IdentityPlusMapper setFontMapper( IdentityPlusMapper fontMapper) throws Exception {fontMapper.put("隸書", PhysicalFonts.get("LiSu"));fontMapper.put("宋體", PhysicalFonts.get("SimSun"));fontMapper.put("微軟雅黑", PhysicalFonts.get("Microsoft Yahei"));fontMapper.put("黑體", PhysicalFonts.get("SimHei"));fontMapper.put("楷體", PhysicalFonts.get("KaiTi"));fontMapper.put("新宋體", PhysicalFonts.get("NSimSun"));fontMapper.put("華文行楷", PhysicalFonts.get("STXingkai"));fontMapper.put("華文仿宋", PhysicalFonts.get("STFangsong"));fontMapper.put("仿宋", PhysicalFonts.get("FangSong"));fontMapper.put("幼圓", PhysicalFonts.get("YouYuan"));fontMapper.put("華文宋體", PhysicalFonts.get("STSong"));fontMapper.put("華文中宋", PhysicalFonts.get("STZhongsong"));fontMapper.put("等線", PhysicalFonts.get("SimSun"));fontMapper.put("等線 Light", PhysicalFonts.get("SimSun"));fontMapper.put("華文琥珀", PhysicalFonts.get("STHupo"));fontMapper.put("華文隸書", PhysicalFonts.get("STLiti"));fontMapper.put("華文新魏", PhysicalFonts.get("STXinwei"));fontMapper.put("華文彩云", PhysicalFonts.get("STCaiyun"));fontMapper.put("方正姚體", PhysicalFonts.get("FZYaoti"));fontMapper.put("方正舒體", PhysicalFonts.get("FZShuTi"));fontMapper.put("華文細黑", PhysicalFonts.get("STXihei"));fontMapper.put("宋體擴展",PhysicalFonts.get("simsun-extB"));fontMapper.put("仿宋_GB2312",PhysicalFonts.get("FangSong_GB2312"));fontMapper.put("新細明體",PhysicalFonts.get("SimSun"));return fontMapper;}

設置字體,主要是windows使用,其實不設置也沒問題。以上基本解決了代碼的問題。

linux字體環境準備及處理

1、復制windows的C:\Windows\Fonts\下的所有字體庫,放在桌面的fonts文件夾里

2、在linux目錄/usr/share/fonts/chinese 創建文件夾chinese ,如果文件夾不存在,手動創建

3、把fonts拷貝上去,并給他授權chmod -R 755 /usr/share/fonts/chinese

4、# mkfontscale (如果提示 mkfontscale: command not found,需自行安裝 # yum install mkfontscale )
# mkfontdir
# fc-cache -fv (如果提示 fc-cache: command not found,則需要安裝# yum install fontconfig?

5、到路徑vi /etc/fonts/fonts.conf 修改配置,把/usr/share/fonts/chinese添加進去

6、最后執行,fc-cache和fc-list :lang=zh??

/usr/share/fonts/chinese/simsun.ttc: SimSun\-PUA,宋體\-PUA:style=Regular
/usr/share/fonts/chinese/simsun.ttc: NSimSun,新宋體:style=Regular
/usr/share/fonts/chinese/simsunb.ttf: SimSun\-ExtB:style=Regular,Normal,oby?ejné,Standard,Κανονικ?,Normaali,Normál,Normale,Standaard,Normalny,Обычный,Normálne,Navadno,Arrunta
/usr/share/fonts/chinese/SimsunExtG.ttf: SimSun\-ExtG:style=Regular
/usr/share/fonts/chinese/simsun.ttf: SimSun,宋體:style=Regular
/usr/share/fonts/chinese/simsun.ttc: SimSun,宋體:style=Regular

出現上面的類似即表示成功。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86674.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86674.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86674.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ - vector 的相關練習

目錄 前言 1、題1 只出現一次的數字 &#xff1a; 解法一&#xff1a;遍歷 參考代碼&#xff1a; 解法二&#xff1a;按位異或 參考代碼&#xff1a; 解法三&#xff1a;哈希表 參考代碼&#xff1a; 2、題2 楊輝三角&#xff1a; 參考代碼&#xff1a; 總結 前言 …

JDK 1.8 Stream API:集合流處理深度解析

JDK 1.8 Stream API&#xff1a;集合流處理深度解析 摘要&#xff1a;Stream API 是 JDK 1.8 的革命性特性&#xff0c;它將集合操作從傳統迭代升級為聲明式函數式處理。Stream API三個階段&#xff08;創建→中間操作→終端操作&#xff09;詳解流處理機制&#xff0c;輔以代…

2025學年湖北省職業院校技能大賽 “信息安全管理與評估”賽項 樣題卷(二)

2025學年湖北省職業院校技能大賽 “信息安全管理與評估”賽項 樣題卷&#xff08;二&#xff09; 第一部分&#xff1a;第二部分&#xff1a;網絡安全事件響應、數字取證調查、應用程序安全任務書任務 1&#xff1a;應急響應&#xff08;可以培訓有答案&#xff09;任務 2&…

AiPy實戰(5):效率革命!5分鐘構建行業分析報告

在當今數字化時代&#xff0c;數據呈指數級增長&#xff0c;行業分析報告對于企業的決策制定愈發關鍵。傳統上&#xff0c;撰寫一份行業分析報告&#xff0c;需要分析師耗費大量時間從各類數據庫、新聞資訊平臺、行業報告中手動收集數據&#xff0c;再進行整理、分析和撰寫&…

docker小白自存-windows系統通過docker安裝n8n-nodes-puppeteer

n8n上直接在社區下載puppeteer節點&#xff0c;使用時會報錯說沒有chromium依賴。 找到了n8n-nodes-puppeteer的github試圖解決 根據他的docker安裝指南執行&#xff0c;運行容器時會報exec /docker-custom-entrypoint.sh: no such file or directory &#xff08;明明文件都有…

腳本shebang的作用與使用方法

#!&#xff08;稱為 shebang 或 hashbang&#xff09;是腳本文件開頭的前兩個字符&#xff0c;用于告訴操作系統應該使用哪個解釋器來執行該腳本。 核心作用&#xff1a; 指定解釋器&#xff1a; 明確告訴系統運行這個腳本時應該調用哪個程序&#xff08;解釋器&#xff09;來…

【大模型學習 | BERT 量化學習 (1)】

BERT 情感分析 一、 數據集加載與模型訓練 from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments from datasets import load_dataset import torch import numpy as np from sklearn.metrics import accuracy_score mode_na…

用低通濾波優化串口或485 通信指示燈電路

常見的通信指示燈電路就是簡單的把LED 連到TXD 和RXD 上&#xff0c;一有動靜就閃一下。問題是&#xff0c;如果波特率很高&#xff0c;一次通信時間很短&#xff0c;相當于占空比很低&#xff0c;LED 閃爍的亮度就很弱&#xff0c;不容易觀察。比如MODBUS 通信&#xff0c;波特…

【純干貨】調整word目錄中的行距以及右對齊頁碼

1.問題展現 目錄生成會遇到一些奇葩現象 所以到了展現技術力的時候了【doge】 2.解決word目錄中的行距問題 選中目錄中的文字-》段落 此時你可能勾選了圖片中的一個以上&#xff0c;把他們都取消了&#xff0c; 由于一個目錄的標題對應一個樣式&#xff0c;第一個也可以取消 …

pandas 優雅處理值類型為list的列的csv讀寫問題

文章目錄 直接存儲join list 變成字符串存儲json.dumps序列化存儲以及json.loads反序列化讀取總結 之所以分析這個問題,是因為讀者在跟第三方數據供應商對接數據的時候,老是會遇到數據加載都會出錯的問題,其中一個原因就是list類型數據沒有正確儲存,于是筆者在這篇文章里面詳細…

一種解決 OpenWrt 安裝 docker 之后局域網的設備之間無法互相訪問通信的方法

文章目錄 一、問題背景二、解決方案&#xff08;方法一&#xff09;修改全局設置的 轉發&#xff08; forward&#xff09; 為 接受&#xff08;ACCEPT&#xff09;&#xff08;方法二&#xff09;設置 net.bridge.bridge-nf-call-iptables0 并將 docker 的容器網絡設置為host …

Leetcode百題斬-貪心

貪心也是一個很有意思的專題&#xff0c;能遇到很多神奇的思路。 但這個專題&#xff0c;leetcode也沒放Hard&#xff0c;果然是怕這種玄學專題上點難度大家罩不住。那就很快了&#xff0c;直接過 763. Partition Labels[Medium] 思路&#xff1a;將字母串分組&#xff0c;相…

基于多徑信道的分集接收技術性能優化與仿真分析

基于多徑信道的分集接收技術性能優化與仿真分析 一、多徑信道建模與仿真 1. 多徑信道建模(MATLAB實現) classdef MultipathChannel < handlepropertiesSampleRate = 1e6; % 采樣率 (Hz)MaxDoppler = 100; % 最大多普勒頻移 (Hz)DelayVector = [0

LeetCode 713.乘積小于K的子數組

給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回子數組內所有元素的乘積嚴格小于 k 的連續子數組的數目。 示例 1&#xff1a; 輸入&#xff1a;nums [10,5,2,6], k 100 輸出&#xff1a;8 解釋&#xff1a;8 個乘積小于 100 的子數組分別為&#xff1a;[10]、[5…

打破網絡安全孤島:實現防御數據協作

作者&#xff1a;來自 Elastic Crossley McEwen, Oksana Abramovych 現代網絡戰場不再受組織邊界的限制。在各類防御網絡中&#xff0c;關鍵的結構化、非結構化和半結構化數據分布在不同的專業環境中&#xff0c;形成孤島 —— 從機密情報系統到作戰指揮平臺&#xff0c;再到戰…

給定一個沒有重復元素的數組,寫出生成這個數組的MaxTree的函數

題目&#xff1a; 給定一個沒有重復元素的數組arr&#xff0c;寫出生成這個數組的MaxTree的 函數&#xff0c;要求如果數組長度為N&#xff0c;則時間復雜度為O(N)、額外空間復雜度 為O(N)。 一個數組的MaxTree定義如下。 ● 數組必須沒有重復元素。 ● MaxTree是一棵二叉…

iOS 抓包實戰:時間戳偏差導致的數據同步異常排查記錄

“這條數據不是我填的”“我的更新被覆蓋了”“兩個設備顯示不一致”——這些是產品上線后最令人頭疼的反饋。 最近我們在一次用戶同步問題排查中&#xff0c;發現表面是“數據丟失”問題&#xff0c;實則是多端數據提交時間戳處理不一致&#xff0c;導致后臺認為老數據為新&a…

一款支持多日志器、多級別、多落地方式的同異步日志系統

文章目錄 簡介項目特點項目實現基礎功能模塊實現文件操作以及日期時間獲取日志等級日志信息描述 異步功能模塊實現緩沖區實現異步線程實現 核心功能模塊實現日志格式解析落地操作實現日志器實現 測試測試環境測試參數測試結果性能分析 附件 簡介 在現代軟件開發與系統運維領域…

加固筆記本在戶外勘探行業的應用:探索與科技的融合

在自然資源勘探、地質調查、石油天然氣開發、礦產資源測繪等戶外勘探行業中&#xff0c;作業環境常常復雜多變&#xff1a;風沙漫天的戈壁、雨雪交加的山區、濕熱潮濕的叢林&#xff0c;甚至是極寒與高溫并存的極端氣候條件。面對這些挑戰&#xff0c;普通的辦公設備早已無法勝…

MySQL 連接指定端口后,為什么實際仍是 3306?

文章目錄 MySQL 連接指定端口后&#xff0c;為什么實際仍是 3306&#xff1f;問題現象復現原因分析沒有指定 -h&#xff0c;默認走的是本地 Unix Socket多實例環境中未顯式指定目標地址 正確的連接方法方法一&#xff1a;添加 -h 127.0.0.1方法二&#xff1a;添加 --protocolTC…