100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Java 使用jacob实现各类办公文档(ppt Excel word text imge)转换成PDF

Java 使用jacob实现各类办公文档(ppt Excel word text imge)转换成PDF

时间:2019-04-11 05:15:06

相关推荐

Java 使用jacob实现各类办公文档(ppt Excel word text imge)转换成PDF

//代码中都有注释,使用注解的地方大家可以略过

package com.frank.mon.util;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.UUID;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.mongodb.core.query.Criteria;

import org.springframework.data.mongodb.core.query.Query;

import org.springframework.data.mongodb.gridfs.GridFsTemplate;

import org.ponent;

import com.jacob.activeX.ActiveXComponent;

import .ComThread;

import .Dispatch;

import .Variant;

import com.lowagie.text.Document;

import com.lowagie.text.DocumentException;

import com.lowagie.text.Image;

import com.lowagie.text.Rectangle;

import com.lowagie.text.pdf.PdfWriter;

import com.mongodb.gridfs.GridFSDBFile;

@Component

public class FlieToPdfUtil {

@Autowired

private GridFsTemplate fileRepository;

private static final int wdFormatPDF = 17;

private static final int xlTypePDF = 0;

private static final int ppSaveAsPDF = 32;

// 记录日志信息

private static Logger logger = LoggerFactory.getLogger(FlieToPdfUtil.class);

public ByteArrayOutputStream fileToPdf(String fileId) throws Exception {

GridFSDBFile gridFSDBFile = fileRepository.findOne(new Query(Criteria.where("_id").is(fileId)));

if (null != gridFSDBFile) {

String type = this.getFileSufix(gridFSDBFile.getFilename());

String folder = System.getProperty("java.io.tmpdir");

if (type.equalsIgnoreCase("doc") || type.equalsIgnoreCase("docx") || type.equalsIgnoreCase("txt") || type.equalsIgnoreCase("wps")) {

StringBuffer filePath = new StringBuffer();

String name = this.generateToken();

filePath.append(folder);

filePath.append(name);

filePath.append("." + type);

this.readFile(gridFSDBFile, filePath.toString());

StringBuffer pdfPath = new StringBuffer();

pdfPath.append(folder);

pdfPath.append(name);

pdfPath.append(".pdf");

this.wordToPDF(filePath.toString(), pdfPath.toString());

this.deleteFile(filePath.toString());

return this.getBytes(pdfPath.toString());

} else if (type.equalsIgnoreCase("ppt") || type.equalsIgnoreCase("pptx")) {

StringBuffer filePath = new StringBuffer();

String name = this.generateToken();

filePath.append(folder);

filePath.append(name);

filePath.append("." + type);

this.readFile(gridFSDBFile, filePath.toString());

StringBuffer pdfPath = new StringBuffer();

pdfPath.append(folder);

pdfPath.append(name);

pdfPath.append(".pdf");

this.pptToPDF(filePath.toString(), pdfPath.toString());

this.deleteFile(filePath.toString());

return this.getBytes(pdfPath.toString());

} else if (type.equalsIgnoreCase("xls") || type.equalsIgnoreCase("xlsx")) {

StringBuffer filePath = new StringBuffer();

String name = this.generateToken();

filePath.append(folder);

filePath.append(name);

filePath.append("." + type);

this.readFile(gridFSDBFile, filePath.toString());

StringBuffer pdfPath = new StringBuffer();

pdfPath.append(folder);

pdfPath.append(name);

pdfPath.append(".pdf");

this.excelToPDF(filePath.toString(), pdfPath.toString());

this.deleteFile(filePath.toString());

return this.getBytes(pdfPath.toString());

} else if (type.equalsIgnoreCase("jpg") || type.equalsIgnoreCase("png") || type.equalsIgnoreCase("jpeg") || type.equalsIgnoreCase("gif")) {

StringBuffer filePath = new StringBuffer();

String name = this.generateToken();

filePath.append(folder);

filePath.append(name);

filePath.append("." + type);

this.readFile(gridFSDBFile, filePath.toString());

StringBuffer pdfPath = new StringBuffer();

pdfPath.append(folder);

pdfPath.append(name);

pdfPath.append(".pdf");

this.imgToPDF(filePath.toString(), pdfPath.toString());

this.deleteFile(filePath.toString());

return this.getBytes(pdfPath.toString());

} else {

InputStream is = gridFSDBFile.getInputStream();

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int len;

while ((len = is.read(buffer)) > -1) {

baos.write(buffer, 0, len);

}

is.close();

baos.flush();

return baos;

}

} else {

throw new Exception("文件不存在!");

}

}

/**

* 删除单个文件

*

* @param sPath

*被删除文件的文件名

* @return 单个文件删除成功返回true,否则返回false

*/

public boolean deleteFile(String sPath) {

boolean flag = false;

File file = new File(sPath);

// 路径为文件且不为空则进行删除

if (file.isFile() && file.exists()) {

file.delete();

flag = true;

}

return flag;

}

/**

* 写入当前文件

*/

public void readFile(GridFSDBFile gridFSDBFile, String filePath) throws Exception {

InputStream is = gridFSDBFile.getInputStream();

FileOutputStream os = new FileOutputStream(filePath);

int index = 0;

while ((index = is.read()) != -1) {

os.write(index);

}

is.close();

os.close();

}

/**

* 获取pdf文件输出流

*/

public ByteArrayOutputStream getBytes(String filePath) {

File file = new File(filePath);

ByteArrayOutputStream out = null;

try {

FileInputStream in = new FileInputStream(file);

out = new ByteArrayOutputStream();

byte[] b = new byte[1024];

while ((in.read(b)) != -1) {

out.write(b, 0, b.length);

}

out.close();

in.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

this.deleteFile(filePath.toString());

return out;

}

/**

* 获取随机名称

*/

public String generateToken() throws Exception {

return UUID.randomUUID().toString().replace("-", "");

}

/***

* 判断文件类型

*

* @param fileName

* @return

*/

public String getFileSufix(String fileName) {

int splitIndex = fileName.lastIndexOf(".");

return fileName.substring(splitIndex + 1);

}

/**

* Word转PDF

*/

private void wordToPDF(String inputFile, String pdfFile) {

logger.info("启动 Word...");

long start = System.currentTimeMillis();

ActiveXComponent app = null;

Dispatch doc = new Dispatch();

try {

logger.info("进入转换PDF程序");

app = new ActiveXComponent("Word.Application");

Dispatch xlo = (Dispatch) (app.getObject());

try {

logger.info("version=" + app.getProperty("Version"));

logger.info("version=" + Dispatch.get(xlo, "Version"));

} catch (Exception e) {

e.printStackTrace();

}

app.setProperty("Visible", new Variant(false));

Dispatch docs = app.getProperty("Documents").toDispatch();

doc = Dispatch.call(docs, "Open", inputFile).toDispatch();

logger.info("打开文档..." + inputFile);

logger.info("转换文档到 PDF..." + pdfFile);

File tofile = new File(pdfFile);

if (tofile.exists()) {

tofile.delete();

}

Dispatch.call(doc, "SaveAs", pdfFile, // FileName

wdFormatPDF);

long end = System.currentTimeMillis();

logger.info("转换完成..用时:" + (end - start) + "ms.");

} catch (Exception e) {

logger.info("========Error:文档转换失败:" + e.getMessage());

} finally {

Dispatch.call(doc, "Close", false);

System.out.println("关闭文档");

if (app != null)

app.invoke("Quit", new Variant[] {});

// 如果没有这句话,winword.exe进程将不会关闭

ComThread.Release();

}

}

/**

* Excel转化成PDF

*/

private void excelToPDF(String inputFile, String pdfFile) {

ActiveXComponent ax = null;

Dispatch excel = null;

try {

ComThread.InitSTA(true);

logger.info("进入转换PDF程序");

ax = new ActiveXComponent("KET.Application");

logger.info("开始转换Excel为PDF...");

long start = System.currentTimeMillis();

ax.setProperty("Visible", false);

ax.setProperty("AutomationSecurity", new Variant(3)); // 禁用宏

Dispatch excels = ax.getProperty("Workbooks").toDispatch();

excel = Dispatch.invoke(excels, "Open", Dispatch.Method, new Object[] { inputFile, new Variant(false), new Variant(false) }, new int[9]).toDispatch();

Dispatch sheet;

// 横向打印设置 多个Sheet

Dispatch sheets = Dispatch.get(excel, "Sheets").toDispatch();

// 获得几个sheet

int count = Dispatch.get(sheets, "Count").getInt();

System.out.println(count);

if (1 < count) {

sheet = Dispatch.invoke(sheets, "Item", Dispatch.Get, new Object[] { new Integer(2) }, new int[1]).toDispatch();

} else {

sheet = Dispatch.get(excel, "ActiveSheet").toDispatch();

}

Dispatch pageSetup = Dispatch.get(sheet, "PageSetup").toDispatch();

Dispatch.put(pageSetup, "Orientation", new Variant(2)); // Variant(2)横向打印

// 设置边距

Dispatch.put(pageSetup, "CenterVertically", true);

// Dispatch.put(pageSetup, "LeftMargin", 0);

// Dispatch.put(pageSetup, "RightMargin", 0);

Dispatch.put(pageSetup, "TopMargin", 10);

Dispatch.put(pageSetup, "BottomMargin", 10);

Dispatch.put(pageSetup, "PrintGridlines", true);

// 设置打印纸张

// Dispatch.put(pageSetup, "PaperSize", 8);

// 设置缩放

// Dispatch.put(pageSetup, "Zoom", 49);

// 转换格式

Dispatch.invoke(excel, "ExportAsFixedFormat", Dispatch.Method, new Object[] { new Variant(0), // PDF格式=0

pdfFile, new Variant(xlTypePDF) // 0=标准 (生成的PDF图片不会变模糊)

// 1=最小文件

// (生成的PDF图片糊的一塌糊涂)

}, new int[1]);

long end = System.currentTimeMillis();

logger.info("转换完成..用时:" + (end - start) + "ms.");

} catch (Exception e) {

// TODO: handle exception

logger.info("========Error:文档转换失败:" + e.getMessage());

} finally {

Dispatch.call(excel, "Close", new Variant(false));

if (ax != null) {

ax.invoke("Quit", new Variant[] {});

ax = null;

}

ComThread.Release();

}

}

/**

* ppt转化成PDF

*/

private void pptToPDF(String inputFile, String pdfFile) {

ActiveXComponent app = null;

Dispatch ppt = new Dispatch();

try {

logger.info("进入转换PDF程序");

ComThread.InitSTA(true);

app = new ActiveXComponent("KWPP.Application");

// app.setProperty("Visible", false);

logger.info("开始转化PPT为PDF...");

long start = System.currentTimeMillis();

Dispatch ppts = app.getProperty("Presentations").toDispatch();

ppt = Dispatch.call(ppts, "Open", inputFile, true, // ReadOnly

// false, // Untitled指定文件是否有标题

false// WithWindow指定文件是否可见

).toDispatch();

Dispatch.invoke(ppt, "SaveAs", Dispatch.Method, new Object[] { pdfFile, new Variant(ppSaveAsPDF) }, new int[1]);

long end = System.currentTimeMillis();

logger.info("转换完成..用时:" + (end - start) + "ms.");

} catch (Exception e) {

// TODO: handle exception

logger.info("========Error:文档转换失败:" + e.getMessage());

} finally {

Dispatch.call(ppt, "Close");

if (app != null)

app.invoke("Quit", new Variant[] {});

// 如果没有这句话,winword.exe进程将不会关闭

ComThread.Release();

}

}

private void imgToPDF(String imgFilePath, String pdfFilePath) {

File file = new File(imgFilePath);

if (file.exists()) {

Document document = null;

FileOutputStream fos = null;

try {

// 读取一个图片

Image image = Image.getInstance(imgFilePath);

float imageHeight = image.getScaledHeight();

float imageWidth = image.getScaledWidth();

int i = 0;

while (imageHeight > 500 || imageWidth > 500) {

image.scalePercent(100 - i);

i++;

imageHeight = image.getScaledHeight();

imageWidth = image.getScaledWidth();

}

image.setAlignment(Image.ALIGN_CENTER);

// 文档页面宽高为图片宽高

Rectangle rect = new Rectangle(imageWidth, imageHeight);

document = new Document(rect);

// 读取文件流,创建可读写的文件

fos = new FileOutputStream(pdfFilePath);

PdfWriter.getInstance(document, fos);

// 设置文档边距

document.setMargins(0, 0, 0, 0);

// 打开文档

document.open();

// 插入一个图片

document.add(image);

} catch (DocumentException de) {

System.out.println(de.getMessage());

} catch (IOException ioe) {

System.out.println(ioe.getMessage());

}

document.close();

try {

fos.flush();

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。