項目背景:開發中需要實現word、ppt等文件的在線預覽,而瀏覽器無法打開此類文件,於是需要上傳文件的時候轉PDF文件存儲。
下面是具體操作步驟:
一、OpenOffice是跨平臺的免費軟件套件,下載地址:http://www.openoffice.org/。
下載完成後,進行傻瓜式安裝
二、下載 jodconverter-2.2.2.zip,MAVEN導入jodconverter-2.2.2.jar
失敗,需要手動建立依賴包。
地址:https://sourceforge.net/projects/jodconverter/files/JODConverter/
注意:如果使用2.2.1這個包無法操作docx、pptx文件
三、 安裝完之後,在安裝目錄的program文件下cmd執行命令
D:\Program Files (x86)\OpenOffice 4\program> soffice -headless -accept=“socket,host=127.0.0.1,port=8100;urp;” -nofirststartwizard
四、項目的pom.xml文件下maven配置
五、編寫測試類。
office類文檔轉換爲pdf(word,excel,ppt,txt)
import java.io.File;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
/**
* @description: office類文檔轉換爲pdf
* @author: guoxu
* @create: 2020-11-03 17:02
**/
public class OfficeToPDF {
private static String beforeUrl = "D:\\opt\\upFiles\\beforeConvert\\test10.odg";
private static String afterUrl = "D:\\opt\\upFiles\\afterConvert\\test10.pdf";
public static void main(String[] args) {
new JavaCallOpenoffice();
fileTwoPdf(beforeUrl, afterUrl);
new DistorySoffice();
}
/**
* 使用openoffice 文件轉換爲pdf格式
*
* @param sourceFilePath 源文件
* @param destFilePath 目標文件
*/
public static void fileTwoPdf(String sourceFilePath, String destFilePath) {
File inputFile = new File(sourceFilePath);
// 找不到源文件, 則返回false
if (!inputFile.exists()) {
System.err.println("文件不存在!");
}
// 如果目標路徑不存在, 則新建該路徑
File outputFile = new File(destFilePath);
if (!outputFile.getParentFile().exists()) {
outputFile.getParentFile().mkdirs();
}
// 如果目標文件存在,則刪除
if (outputFile.exists()) {
outputFile.delete();
}
try {
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
connection.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
if (inputFile.exists()) {
// 進行PDF格式的轉換
converter.convert(inputFile, outputFile);
}
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
圖片類文件轉換爲pdf(png,jpg)
import java.io.FileOutputStream;
import java.io.IOException;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfWriter;
/**
* @description: 圖片類文件轉換爲pdf
* @author: guoxu
* @create: 2020-11-03 17:49
**/
public class ImageToPDF {
private static String beforeUrl = "D:\\opt\\upFiles\\beforeConvert\\test08.jpg";
private static String afterUrl = "D:\\opt\\upFiles\\afterConvert\\test08.pdf";
public static void main(String[] args) {
convert(beforeUrl, afterUrl);
}
public static void convert(String source, String target) {
Document document = new Document();
// 設置文檔頁邊距
document.setMargins(0, 0, 0, 0);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(target);
PdfWriter.getInstance(document, fos);
// 打開文檔
document.open();
// 獲取圖片的寬高
Image image = Image.getInstance(source);
float imageHeight = image.getScaledHeight();
float imageWidth = image.getScaledWidth();
// 設置頁面寬高與圖片一致
Rectangle rectangle = new Rectangle(imageWidth, imageHeight);
document.setPageSize(rectangle);
// 圖片居中
image.setAlignment(Image.ALIGN_CENTER);
// 新建一頁添加圖片
document.newPage();
document.add(image);
} catch (Exception ioe) {
System.out.println(ioe.getMessage());
} finally {
// 關閉文檔
document.close();
try {
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
附註:
win10 自動啓動 OpenOffice 和 關閉
import java.io.File;
import java.io.FileWriter;
/**
* @description: 啓動服務
* @author: guoxu
* @create: 2020-11-04 09:13
**/
public class JavaCallOpenoffice {
/**
* 將啓動程序定義在構造函數中,直接生成該類對象,即可啓動openoffice服務
*/
public JavaCallOpenoffice() {
Runtime rn = Runtime.getRuntime();
Process p = null;
try {
File file=new File("D:\\Develop\\openoffice\\openoprenoffice.bat");
if (false==file.exists()) {
System.out.println("。。。。。。。。。。");
FileWriter writer = new FileWriter("D:\\Develop\\openoffice\\openoprenoffice.bat ");
writer.write("@echo off ");
writer.write("\r\n ");
writer.write(">nul 2>&1 \"%SYSTEMROOT%\\system32\\cacls.exe\" \"%SYSTEMROOT%\\system32\\config\\system\"");
writer.write("\r\n ");
writer.write("if '%errorlevel%' NEQ '0' (");
writer.write("\r\n ");
writer.write("goto UACPrompt");
writer.write("\r\n ");
writer.write(") else ( goto gotAdmin )");
writer.write("\r\n ");
writer.write(":UACPrompt");
writer.write("\r\n ");
writer.write("echo Set UAC = CreateObject^(\"Shell.Application\"^) > \"%temp%\\getadmin.vbs\"");
writer.write("\r\n ");
writer.write("echo UAC.ShellExecute \"%~s0\", \"\", \"\", \"runas\", 1 >> \"%temp%\\getadmin.vbs\"");
writer.write("\r\n ");
writer.write("\"%temp%\\getadmin.vbs\"");
writer.write("\r\n ");
writer.write("exit /B");
writer.write("\r\n ");
writer.write(":gotAdmin");
writer.write("\r\n ");
writer.write("if exist \"%temp%\\getadmin.vbs\" ( del \"%temp%\\getadmin.vbs\" )");
writer.write("\r\n ");
writer.write("C:");
writer.write("\r\n ");
//D:\\Program Files\\OpenOffice 4\\program: openoffice的安裝路徑路徑
writer.write("cd C:\\Program Files (x86)\\OpenOffice 4\\program");
writer.write("\r\n ");
writer.write("soffice -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard");
writer.write("\r\n ");
writer.write("@echo on ");
writer.close();
}
p = rn.exec("cmd.exe /C D:\\Develop\\openoffice\\openoprenoffice.bat");
}
catch (Exception e1) {
e1.printStackTrace();
}
}
}
import java.io.IOException;
import java.util.Scanner;
/**
* @description: 關閉Soffice 進程
* @author: guoxu
* @create: 2020-11-04 09:15
**/
public class DistorySoffice {
private Process process=null;
/**
* 構造方法,實現關閉soffice進程
*/
public DistorySoffice() {
try {
//顯示進程
process=Runtime.getRuntime().exec("tasklist");
Scanner in=new Scanner(process.getInputStream());
while (in.hasNextLine()) {
String processString=in.nextLine();
if (processString.contains("soffice.exe")) {
//關閉soffice進程的命令
String cmd="taskkill /f /im soffice.exe";
process=Runtime.getRuntime().exec(cmd);
System.out.println("openoffice正常關閉.......");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}