原文鏈接: https://www.jianshu.com/p/86716c7122ef
原始需求
java-web項目某頁面,用戶可上傳word文檔,上傳后的文檔名在頁面的表格中展示,需要提供word文檔的在線預覽、下載功能。
找尋解決方式
需求點主要有三個,分別是word文件的上傳、預覽和下載,文件的上傳和下載就不多說了,主要的難點在於預覽。找資料找到了下面幾種解決方式:
利用POI把word文檔轉換為html
現在的POI對於word文檔處理是挺強大的,對於一些簡單文檔的處理問題不大,但是對於一些復雜文檔的處理就有點心累了,而且用戶上傳的文檔是相對比較復雜的文檔,除了復雜的表格外還有很多圖片,所以放棄這種方式。
利用微軟或者Google的在線文檔預覽服務
這個方法也是不可行的,使用微軟和Google的在線文檔預覽服務需要向他們提供word文檔的鏈接,而客戶的文件是需要保密,不能對外泄露的。
使用Apache OpenOffice的將word轉換為PDF
Apache OpenOffice支持多種環境,而且是開源的,我沒有使用這種方式,想了解的話可以參考:https://blog.csdn.net/a1786223749/article/details/79461070
使用apose將word轉換為PDF
apose是一個很強大的office文檔處理軟件,可以完美的實現word文檔轉換為pdf文件,缺點就是軟件是需要付費的。但是網上可以找到很多的破解版jar包,測試效果還是很不錯的,而且使用簡單,項目中使用的就是這種方式。
使用apose轉換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; // 驗證License if (!getLicense()) { LOG.error("驗證License失敗!"); return; } try { Document doc = new Document(multipartFile.getInputStream()); fileOS = new FileOutputStream(new File(pdfFilePath)); // 保存轉換的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
前端預覽PDF文件
關於前端預覽pdf文件可以使用pdf.js預覽。另推薦一個Angular2+的PDF預覽插件:https://github.com/VadimDez/ng2-pdf-viewer
遇到的問題
WORD轉PDF功能在windows下轉換正常,Linux下中文亂碼
因為轉換時需要系統里有word文檔里使用的字體,當找不到該字體的時候就會亂碼。
Linux下默認只有很少的中文字體,所以很可能會出現中文亂碼問題。
解決辦法也很簡單,只需在Linux系統中添加常用的字體即可。
1. 查看系統支持的字體
fc-list
2. 查看系統支持的中文字體
fc-list :lang=zh
3. 創建字體目錄(需要root權限,linux系統默認的字體存放路徑為/usr/share/fonts,沒有可自行創建)
cd /usr/share/fonts
mkdir windows
4. cp字體文件(將需要新增的字體文件拷貝到指定目錄中)
cd windows
cp ~/fonts/* ./
5. 目錄和字體文件設置為所有用戶可見
chmod 755 ../windows
chmod 755 ./*
6. 應用字體
mkfontscale (如果提示 mkfontscale: command not found,需自行安裝 # yum install mkfontscale )
mkfontdir
fc-cache -fv (如果提示 fc-cache: command not found,則需要安裝# yum install fontconfig )
7.再次查看系統支持的字體
fc-list
鏈接:https://www.jianshu.com/p/86716c7122ef
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。