原始需求
java-web項(xiàng)目某頁面,用戶可上傳word文檔迅诬,上傳后的文檔名在頁面的表格中展示佩谷,需要提供word文檔的在線預(yù)覽旁壮、下載功能辞做。
找尋解決方式
需求點(diǎn)主要有三個(gè),分別是word文件的上傳寡具、預(yù)覽和下載秤茅,文件的上傳和下載就不多說了,主要的難點(diǎn)在于預(yù)覽童叠。找資料找到了下面幾種解決方式:
利用POI把word文檔轉(zhuǎn)換為html
現(xiàn)在的POI對(duì)于word文檔處理是挺強(qiáng)大的框喳,對(duì)于一些簡(jiǎn)單文檔的處理問題不大,但是對(duì)于一些復(fù)雜文檔的處理就有點(diǎn)心累了厦坛,而且用戶上傳的文檔是相對(duì)比較復(fù)雜的文檔五垮,除了復(fù)雜的表格外還有很多圖片,所以放棄這種方式杜秸。
利用微軟或者Google的在線文檔預(yù)覽服務(wù)
這個(gè)方法也是不可行的放仗,使用微軟和Google的在線文檔預(yù)覽服務(wù)需要向他們提供word文檔的鏈接,而客戶的文件是需要保密撬碟,不能對(duì)外泄露的诞挨。
使用Apache OpenOffice的將word轉(zhuǎn)換為PDF
Apache OpenOffice支持多種環(huán)境,而且是開源的呢蛤,我沒有使用這種方式惶傻,想了解的話可以參考:https://blog.csdn.net/a1786223749/article/details/79461070
使用apose將word轉(zhuǎn)換為PDF
apose是一個(gè)很強(qiáng)大的office文檔處理軟件,可以完美的實(shí)現(xiàn)word文檔轉(zhuǎn)換為pdf文件其障,缺點(diǎn)就是軟件是需要付費(fèi)的银室。但是網(wǎng)上可以找到很多的破解版jar包,測(cè)試效果還是很不錯(cuò)的励翼,而且使用簡(jiǎn)單蜈敢,項(xiàng)目中使用的就是這種方式。
使用apose轉(zhuǎn)換word為PDF
import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
/**
* <b><code>Word2PdfUtil</code></b>
* <p>
* Description: word to pdf util.
* <p>
* <b>Creation Time:</b> 2018/5/15 15:10
*
* @author
* @date 2018 /5/15
* @since JDK 1.7
*/
public class Word2PdfUtil {
/**
* The constant LOG.
*
*/
private static final Logger LOG = LoggerFactory.getLogger(Word2PdfUtil.class);
/**
* 獲取license
*
* @return
*/
private static boolean getLicense() {
boolean result = false;
try {
// 憑證
String licenseStr =
"<License>\n" +
" <Data>\n" +
" <Products>\n" +
" <Product>Aspose.Total for Java</Product>\n" +
" <Product>Aspose.Words for Java</Product>\n" +
" </Products>\n" +
" <EditionType>Enterprise</EditionType>\n" +
" <SubscriptionExpiry>20991231</SubscriptionExpiry>\n" +
" <LicenseExpiry>20991231</LicenseExpiry>\n" +
" <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>\n" +
" </Data>\n" +
" <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>\n" +
"</License>";
InputStream license = new ByteArrayInputStream(licenseStr.getBytes("UTF-8"));
License asposeLic = new License();
asposeLic.setLicense(license);
result = true;
} catch (Exception e) {
LOG.error("error:", e);
}
return result;
}
/**
* Word 2 pdf.
*
* @param multipartFile the multipart file
* @param pdfFilePath the pdf file path
*/
public static void word2Pdf(MultipartFile multipartFile, String pdfFilePath) {
FileOutputStream fileOS = null;
// 驗(yàn)證License
if (!getLicense()) {
LOG.error("驗(yàn)證License失斊А抓狭!");
return;
}
try {
Document doc = new Document(multipartFile.getInputStream());
fileOS = new FileOutputStream(new File(pdfFilePath));
// 保存轉(zhuǎn)換的pdf文件
doc.save(fileOS, SaveFormat.PDF);
} catch (Exception e) {
LOG.error("error:", e);
} finally {
try {
if(fileOS != null){
fileOS.close();
}
} catch (IOException e) {
LOG.error("error:", e);
}
}
}
}
apose的Jar包和maven-pom.xml
鏈接:https://pan.baidu.com/s/19clf3JPKMkr_O9uUFF8C0Q 密碼:bbu0
遇到的問題
WORD轉(zhuǎn)PDF功能在windows下轉(zhuǎn)換正常,Linux下中文亂碼
因?yàn)檗D(zhuǎn)換時(shí)需要系統(tǒng)里有word文檔里使用的字體殊橙,當(dāng)找不到該字體的時(shí)候就會(huì)亂碼辐宾。
Linux下默認(rèn)只有很少的中文字體狱从,所以很可能會(huì)出現(xiàn)中文亂碼問題膨蛮。
解決辦法也很簡(jiǎn)單,只需在Linux系統(tǒng)中添加常用的字體即可季研。
- 查看系統(tǒng)支持的字體
fc-list
- 查看系統(tǒng)支持的中文字體
fc-list :lang=zh
- 創(chuàng)建字體目錄(需要root權(quán)限敞葛,linux系統(tǒng)默認(rèn)的字體存放路徑為/usr/share/fonts,沒有可自行創(chuàng)建)
cd /usr/share/fonts
mkdir windows
- cp字體文件(將需要新增的字體文件拷貝到指定目錄中)
cd windows
cp ~/fonts/* ./
- 目錄和字體文件設(shè)置為所有用戶可見
chmod 755 ../windows
chmod 755 ./*
- 應(yīng)用字體
mkfontscale (如果提示 mkfontscale: command not found与涡,需自行安裝 # yum install mkfontscale )
mkfontdir
fc-cache -fv (如果提示 fc-cache: command not found惹谐,則需要安裝# yum install fontconfig )
- 再次查看系統(tǒng)支持的字體
fc-list
前端預(yù)覽PDF文件
關(guān)于前端預(yù)覽pdf文件可以使用pdf.js預(yù)覽持偏。另推薦一個(gè)Angular2+的PDF預(yù)覽插件:https://github.com/VadimDez/ng2-pdf-viewer