zoukankan      html  css  js  c++  java
  • Java平台下利用aspose转word为PDF实现文档在线预览

    原文链接: 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>
    " +
                        "  <Data>
    " +
                        "    <Products>
    " +
                        "      <Product>Aspose.Total for Java</Product>
    " +
                        "      <Product>Aspose.Words for Java</Product>
    " +
                        "    </Products>
    " +
                        "    <EditionType>Enterprise</EditionType>
    " +
                        "    <SubscriptionExpiry>20991231</SubscriptionExpiry>
    " +
                        "    <LicenseExpiry>20991231</LicenseExpiry>
    " +
                        "    <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
    " +
                        "  </Data>
    " +
                        "  <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
    " +
                        "</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
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    NYOJ 10 skiing DFS+DP
    51nod 1270 数组的最大代价
    HDU 4635 Strongly connected
    HDU 4612 Warm up
    POJ 3177 Redundant Paths
    HDU 1629 迷宫城堡
    uva 796
    uva 315
    POJ 3180 The Cow Prom
    POJ 1236 Network of Schools
  • 原文地址:https://www.cnblogs.com/oxsir/p/12275955.html
Copyright © 2011-2022 走看看