记⼀次⽂件从Word转为PDF(documents4j和aspose)
前⾔:
两种⽅法:documents4j和aspose
最开始是⽤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 ansform.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: ansform.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")){
}else if(suffix.equals("docx")){
}else if(suffix.equals("txt")){
}
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: ansform.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 = Logger(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/2IRfqwnPf8itN8aF ZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>\n"+
"</License>";
InputStream license =new Bytes("UTF-8"));
License asposeLic =new License();
asposeLic.setLicense(license);
result =true;
}catch(Exception e){
<("error:", e);
}
return result;
}
/**
* Word 2 pdf.
*
* @param pdfFilePath the pdf file path
*/
public static void word2Pdf( String pdfFilePath){
FileOutputStream fileOS = null;
// 验证License
if(!getLicense()){
<("验证License失败!");
return;
}
File inputWord =new File("C:/Users/Administrator/Desktop/测试.docx");
try{
//此处处理乱码和⼩⽅块
//如果在本地运⾏,此处报错,请注释这个这是字体,主要是为了解决linux环境下⾯运⾏jar时不到中⽂字体的问题 DefaultInstance().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){
<("error:", e);
}finally{
try{
if(fileOS != null){
fileOS.close();
}
}catch(IOException e){
<("error:", e);
}
}
}
public static void main(String[] args){
word2Pdf("C:/Users/Administrator/Desktop/测试.pdf");
}
}
问题
1. 本地测试正常,Linux还是乱码
原因:
(1)Linux服务器上没有安装对应的中⽂字体
(2)字体并不是被所有⽤户通⽤的
(3)没有构建字体索引,没有刷新字体路径缓存
解决:
百度Linux安装中⽂字体,之后,运⾏命令看看是否能看到中⽂字体
transform和convert的区别
2. 安装了中⽂字体还是乱码
原因:在Linux上运⾏Jar⽆法到中⽂字体,可以在代码⾥⾯添加路径指向中⽂字体⽂件夹
结束
感谢这些博客:-----
特别感谢第六篇的博客
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论