前言:

两种方法:documents4jaspose
最开始是用documents4j,在本地使用很方便,但是部署到LINUX上面之后,抛出异常,就看了下官方文档,documents4j是使用本地的MS Office应用做的文件格式转换,Linux没有对应的MS Office应用,所以直接就废除.后来改用aspose,在本地也是测试完成,没有问题,但是服务器上就是各种中文乱码(中文小方格),跟之前使用openoffice的乱码虽然不一样,但是还是乱码.不过最终解决了问题.

一、documents4j实现格式转换

需要MS Office,官方并没有说documents4j不支持Linux下运行,但是LINUX确实没安装MS应用,我也没费工夫去研究安装MS,如果谁好了,麻烦告知一下.

依赖

<dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.1.1</version></dependency><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-transformer-msoffice-word</artifactId><version>1.1.1</version></dependency>

代码

package com.qingyu.transform.utils;import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import org.junit.jupiter.api.Test;import java.io.*;/*** @ProjectName: transform* @Package: com.qingyu.transform.utils* @ClassName: WordToPdf* @Author: qingyu* @Description:* @Date: 2020/3/19 13:46* @Version: 1.0*/
class WordToPdf {/*** 将之前对应的word文件转换成pdf,然后预览pdf文件*/public static String  wordToPdf( String suffix ){// 转换之后的pdf文件File inputWord = new File("C:/Users/Administrator/Desktop/测试.docx");File outputFile = new File("C:/Users/Administrator/Desktop/测试.pdf");try  {InputStream docxInputStream = new FileInputStream(inputWord);OutputStream outputStream = new FileOutputStream(outputFile);IConverter converter = LocalConverter.builder().build();if(suffix.equals("doc")){converter.convert(docxInputStream).as(DocumentType.DOC).to(outputStream).as(DocumentType.PDF).execute();} else if(suffix.equals("docx")){converter.convert(docxInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();} else if(suffix.equals("txt")){converter.convert(docxInputStream).as(DocumentType.TEXT).to(outputStream).as(DocumentType.PDF).execute();}outputStream.close();} catch (Exception e) {e.printStackTrace();}return null;}public static void main(String[] args) {wordToPdf("docx");}}

二、aspose实现文件转换

依赖

首先aspose是收费软件,pom依赖无法直接下载(反正我是没下载下来),我是通过下载别人分享的链接拿到的jar包。通过Project StraStructure引用进来的,在项目中直接放在lib包下面.
下面的依赖是根据jar包的pom文件写的,不是正确的,不过你可以自己上传到自己的repository中,构建一个pom,然后作为依赖加到项目中

     <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>16.8.0</version></dependency>

代码


/*** @ProjectName: transform* @Package: com.qingyu.transform.utils* @ClassName: Word2PdfUtil* @Author: qingyu* @Description:* @Date: 2020/3/20 10:47* @Version: 1.0*/
import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;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 pdfFilePath   the pdf file path*/public static void word2Pdf( String pdfFilePath) {FileOutputStream fileOS = null;// 验证Licenseif (!getLicense()) {LOG.error("验证License失败!");return;}File inputWord = new File("C:/Users/Administrator/Desktop/测试.docx");try {//此处处理乱码和小方块//如果在本地运行,此处报错,请注释这个这是字体,主要是为了解决linux环境下面运行jar时找不到中文字体的问题FontSettings.getDefaultInstance().setFontsFolders(new String[] {"/usr/share/fonts", "/usr/share/fonts/chinese"}, true);Document doc = new Document(new FileInputStream(inputWord));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);}}}public static void main(String[] args) {word2Pdf("C:/Users/Administrator/Desktop/测试.pdf");}
}

问题

  1. 本地测试正常,Linux还是乱码
    原因:
    (1)Linux服务器上没有安装对应的中文字体,参考
    (2)字体并不是被所有用户通用的
    (3)没有构建字体索引,没有刷新字体路径缓存
    解决:
    百度Linux安装中文字体,之后,运行命令看看是否能看到中文字体

  2. 安装了中文字体还是乱码
    原因:在Linux上运行Jar无法找到中文字体,可以在代码里面添加路径指向中文字体文件夹

结束

感谢这些博客:1-2-3-4-5-6
特别感谢第六篇亓亓亓亓凌的博客

记一次文件从Word转为PDF(documents4j和aspose)相关推荐

  1. word中存储矢量图,word转为PDF时矢量图不失真。以及Visio图片放入word后有大量空白

    一.使用draw.io绘制好,然后导出为vsdx 1.我们可以在Visio中绘制图形(或者使用diagrams.net:Flowchart Maker & Online Diagram Sof ...

  2. aspose将word转为pdf

    aspose文件转换功能非常方便,文件也不会出现乱码,内容丢失的情况. 相关jar和license.xml下载地址:https://download.csdn.net/download/qq_3167 ...

  3. pdf文件转word文件,word转pdf文件小程序

    在平时生活.学习中总会遇到一些文件格式的转化问题,在很多软件啊,网站都可以转换,但是都要付钱的:面对这个问题我也是经历过的,学习了python发现文件转换不就轻轻松松吗,接下来我带大家一起来学习如何进 ...

  4. java实现CAD图纸文件DWG格式转为PDF格式

    通过java代码实现CAD图纸文件DWG格式转为PDF格式 这种DWG格式转PDF功能比较少,网上资料也不多,大部分都是让你用第三方插件去做的:我自己找了一下,还是有这方面的jar的,然后整理了一下, ...

  5. java 将word转为pdf文件的两种方式【spire.doc.free】【documents4j】

    场景 如资产证明等场景下,一般要求同时生成word与pdf两种格式的证明文件,且两者格式需保持一致,可以各自单独生成,但那样可能需要维护两个模板文件,所以也可以仅定义一份word的模板文件,使用模板生 ...

  6. Java 将Word转为PDF、PNG、SVG、RTF、XPS、TXT、XML

    同一文档在不同的编译或阅读环境中,需要使用特定的文档格式来打开,通常需要通过转换文档格式的方式来实现.下面将介绍在Java程序中如何来转换Word文档为其他几种常见文档格式,如PDF.图片png.sv ...

  7. linux下将word转为PDF

    在Linux中,可以使用libreoffice来将word文档转为PDF格式. 下面是一个简单的命令行示例: libreoffice --convert-to pdf --outdir /path/t ...

  8. 如何快速实现word转为pdf

    Word2010可以直接另存为PDF格式,方便了Word和PDF之间的格式转换,但在一般默认情况下,Word直接另存为PDF时,是不创建书签信息的,这样长文档在没有书签标题导航实在不方便阅读.在Goo ...

  9. 使用java将多种类型的文件如Word、PDF、JPG汇总到一个文档中(Word或者PDF)

    // 以下为两个文件的代码: 可直接下载运行,下载页面:(http://download.csdn.net/detail/lmf462696585/8800097)执行文件是WordUtil4.jav ...

最新文章

  1. Keras【Deep Learning With Python】—使用keras-神经网络来做线性回归问题
  2. Clustered Data ONTAP Fundamentals课程第一单元学习笔记(续3)
  3. Spring在web开发中的应用
  4. web前端兼容性面试题汇总!
  5. boost::fusion::erase用法的测试程序
  6. IETF访谈: HTTP/3全球份额持续增长,QUIC前景一片光明
  7. 一步步构建大型网站架构(转)
  8. (c语言)输入一个数,将该数按原规律插入到有序数组中
  9. python批量查看邮件_python win32com批量阅读outlook电子邮件打开的项目太多
  10. Data Science With R In Visual Studio
  11. def __init__(self)是什么意思_一文搞懂什么是Python的metaclass
  12. PLC编程技术的发展及应用
  13. mac 安装淘宝镜像 cnpm
  14. linux 有道词典无法屏幕取词,有道词典怎么开启屏幕取词功能 有道词典开启屏幕取词功能方法...
  15. python飞机大战项目概述需求_飞机大战需求分析报告.doc
  16. 【luogu/字符串】多项式输出(所有情况一起处理)
  17. 利用交通实时数据和社交媒体数据对飓风疏散期间的交通需求进行预测
  18. 中庸----做人的智慧
  19. mysql删除重复记录语句的方法 作者: 字体:[增加 减小] 类型:转载 时间:2010-06-21 我要评论 查询及删除重复记录的SQL语句,虽然有点乱,但内容还是不错的。 . .
  20. 数据安全审计_使用数据级安全性对InfoSphere Guardium中的审计结果进行细粒度访问控制

热门文章

  1. azkaban 安装 使用
  2. 【MD5】什么是MD5?md5的简要描述
  3. 政府机构安装什么SSL证书可以保证网站安全?
  4. MySQL安全性:防止攻击和保护数据
  5. 业务单据进行领域驱动设计的最佳实践
  6. qq android平板电脑,QQ(Pad版)
  7. 淘宝微信如何进入微信推广?
  8. ajax java web_在java Web中如何用Ajax实现用户名已存在
  9. illegal cyclic reference involving object InterfaceAudience
  10. 在Windows10下下载编译历史版本chromium