java jacob pdf_java-使用Jacob实现office转换成pdf

注意:com的线程回收不由java垃圾回收器进行处理,因此,每new一次jacob提供的类就要分配一定大小的内存给该操作,new出来的这个com对象在使用结束之后产生的垃圾java是无法回收的,new出来的对象越来越多,内存溢出就不可避免了

参考路径:

Jacob 介绍

Jacob 是 JAVA-COM Bridge的缩写,是一个中间件,能够提供自动化访问MS系统下COM组件和Win32 libraries的功能。

MS系统提供的COM组件

COM组件

对象ID

Microsoft Word

Word.Application

Microsoft Excel

Excel.Application

Microsoft Powerpoint

Powerpoint.Application

Microsoft IE

InternetExplore.Application

WPS文字

KWPS.Aplication

WPS的Excel

KET.Application

WPS的演示文档

KWPP.Application

核心类:

JacobObject:用于Java程序MS下的COM进行通信,创建标准的API框架

ComThread:初始化COM组件线程,释放线程,对线程进行管理

Dispatch:调度处理类,封装了操作来从而操作Office,并表示不同MS级别调度对象

ActiveXComponent : 创建COM组件

Variant : 与COM通讯的参数或者返回值

ROT :Running Object Table (ROT),运行对象表将每个线程映射到所有jacobobjects,在线程创建

核心方法:

Dispatch : 可调用该自动化对象的属性或方法,具体的属性和方法要看参考文档VBA API

Dispatch.get(dispatch, String name);获取对象属性

Dispatch.put(dispatch, String name, Object value);设置对象属性

Dispatch.call(dispatch, String name, Object… args);调用对象方法

Dispatch.call部分参数解释:

Dispatch content = Dispatch.call(document, "XXX").getDispatch();

XXX所表示:

Documents:所有文档

Open:打开文档

ActiveXComponent.Visible:设置编辑器是否可见

Tables:获得所有的表格

Bookmarks:所有标签

Selection:光标所在处或选中的区域

select:选中

typeParagraph:设置为一个段落

ParagraphFormat:段落格式,用alignment设置

alignment:1、居中,2、靠右,3、靠左

Add:新建一个word文档

Close:关闭文档,0不保存,-1保存,-2弹出框确认,注意ComThread.Release();关闭整个word进程

SaveAS:另存为

save:保存

printOut:打印

Application:得到ActiveXComponent的实例

WindowState:Application的属性,表示窗口的大小,0、default,1、maximize,2、minimize

top、left、height、width:application的属性,表示窗口的位置

ActiveXComponent.Quit:关闭所有word文档,但是不退出整个word程序

Range:表示文档中的一个连续范围,由一个起始字符位置和一个终止字符位置定义,进而可以得到格式的信息

Item:得到指定的表格

Rows:得到表格的所有行

Cell:表格的一个单元格

Text:word的文本内容

InsertFile:插入文件

InsertRowsBelow:在指定的行下面插入一行

InsertAfter:在指定对象后插入

Delete:删除,可以是表格的行

Count:返回数目,比如Rows、Tables的数目

Height:返回高度,比如行高、表格行的高

Split:拆分单元格,要指定行数和列数

Merge:合并单元格

Exists:指定的对象是否存在,返回bool值

Copy:复制

Paste:粘贴

Font:字体

Name:字体的名字

Bold:字体是否为粗体

Italic:字体是否为斜体

Underline:字体是否有下划线

Color:颜色

Size:大小

Borders:指定边框,-1为上边框,-2左边框,-3为下边框,-4有右边框,-5为横向边框,-6为纵向边框,-7从左上角开始的斜线,-8从左下角开始的斜线

AutoFitBehavior:自动调整大小,1为内容自动调整大小,2为窗口自动调整大小

Content:取的内容

InLineShapes:

AddPicture:增加一张图片,需要制定路径

homeKey:光标移到开头

moveDown:光标往下一行

moveUp:光标往上一行

moveRight:光标往左一列

moveLeft:光标往右一列

find:要查找的文本

Forward:向前查找

Format:查找的文本格式

MatchCase:大小写匹配

MatchWholeWord:全字匹配

Execute:开始执行查找

参考:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importcom.itextpdf.text.Document;importcom.itextpdf.text.DocumentException;importcom.itextpdf.text.Image;importcom.itextpdf.text.PageSize;importcom.itextpdf.text.pdf.PdfWriter;importcom.jacob.activeX.ActiveXComponent;importcom.jacob.com.ComFailException;importcom.jacob.com.ComThread;importcom.jacob.com.Dispatch;importcom.jacob.com.Variant;public class JacobPDFConverter implementsPDFConverter {private static final int wdFormatPDF = 17;private static final int xlTypePDF = 0;private static final int ppSaveAsPDF = 32;public voidconvert2PDF(String inputFile, String pdfFile) {

String suffix=FileUtils.getFileSufix(inputFile);

File file= newFile(inputFile);if(!file.exists()){

System.out.println("文件不存在!");return;

}if(suffix.equals("pdf")){

System.out.println("PDF not need to convert!");return;

}boolean isImg = false;//FileUtils.isImage(inputFile);

try{

isImg=FileUtils.isImage(inputFile);

}catch(Exception ce){

}if(isImg){

img2PDF(inputFile,pdfFile);

}else if(suffix.equals("doc")||suffix.equals("docx")||suffix.equals("txt")){

word2PDF(inputFile,pdfFile);

}else if(suffix.equals("ppt")||suffix.equals("pptx")){

ppt2PDF(inputFile,pdfFile);

}else if(suffix.equals("xls")||suffix.equals("xlsx")){

excel2PDF(inputFile,pdfFile);

}else if(suffix.equals("wps")){//wps2PDF(inputFile,pdfFile);

word2PDF(inputFile,pdfFile);

}else{//System.out.println("文件格式不支持转换!");

word2PDF(inputFile,pdfFile);

}

}public voidconvert2PDF(String inputFile) {

String pdfFile= FileUtils.getFilePrefix(inputFile)+".pdf";

convert2PDF(inputFile,pdfFile);

}public voidconvert2PDF(String[] inputFiles, String[] pdfFiles) {try{for(int i = 0;i

String inputFile=inputFiles[i];

String pdfFile=pdfFiles[i];if(inputFile==null || inputFile.equals("")) continue;

convert2PDF(inputFile,pdfFile);

}

}catch(Exception ce) {

}

}public voidconvert2PDF(String[] inputFiles) {

String pdfFiles[]= newString[inputFiles.length];for(int i = 0;i

String inputFile=inputFiles[i];

String pdfFile= FileUtils.getFilePrefix(inputFile)+".pdf";

pdfFiles[i]=pdfFile;

}

convert2PDF(inputFiles,pdfFiles);

}public static voidword2PDF(String inputFile,String pdfFile){

ActiveXComponent app= null;

Dispatch doc= null;try{

ComThread.InitSTA();

app= new ActiveXComponent("Word.Application"); //打开word应用程序

app.setProperty("Visible", false); //设置word不可见

Dispatch docs = app.getProperty("Documents").toDispatch(); //获得word中所有打开的文档,返回Documents对象//调用Documents对象中Open方法打开文档,并返回打开的文档对象Document

doc =Dispatch.call(docs,"Open",

inputFile,false,true).toDispatch();

Dispatch.call(doc,"ExportAsFixedFormat",

pdfFile,

wdFormatPDF//word保存为pdf格式宏,值为17

);

}catch(ComFailException e) {

}catch(Exception e) {

}finally{if (doc != null) {

Dispatch.call(doc,"Close", false); //关闭文档

}if (app != null) {

app.invoke("Quit", 0); //关闭word应用程序

}

ComThread.Release();

}

}public static voidexcel2PDF(String inputFile,String pdfFile){

ActiveXComponent app= null;

Dispatch excel= null;try{

ComThread.InitSTA();

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

app.setProperty("Visible", false);

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

excel=Dispatch.call(excels,"Open",

inputFile,false,true).toDispatch();

Dispatch.call(excel,"ExportAsFixedFormat",

xlTypePDF,

pdfFile

);

}catch(ComFailException e) {

}catch(Exception e) {

}finally{if (excel != null) {

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

}if (app != null) {

app.invoke("Quit");

}

ComThread.Release();

}

}public static voidppt2PDF(String inputFile,String pdfFile){

ActiveXComponent app= null;

Dispatch ppt= null;try{

ComThread.InitSTA();

app= new ActiveXComponent("PowerPoint.Application");//app.setProperty("Visible", false);

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

ppt=Dispatch.call(ppts,"Open",

inputFile,true,//ReadOnly

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

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

).toDispatch();

Dispatch.call(ppt,"SaveAs",

pdfFile,

ppSaveAsPDF

);

}catch(ComFailException e) {

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

}catch(Exception e) {

}finally{if (ppt != null) {

Dispatch.call(ppt,"Close");

}if (app != null) {

app.invoke("Quit");

}

ComThread.Release();

}

}public voidwps2PDF(String inputFile,String pdfFile) {

File sFile= newFile(inputFile);

File tFile= newFile(pdfFile);

ActiveXComponent wps= null;try{

ComThread.InitSTA();

wps= new ActiveXComponent("wps.application");

ActiveXComponent doc= wps.invokeGetComponent("Documents").invokeGetComponent("Open", newVariant(sFile.getAbsolutePath()));

doc.invoke("ExportPdf", newVariant(tFile.getAbsolutePath()));

doc.invoke("Close");

doc.safeRelease();

}catch(Exception e) {

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

}finally{if (wps != null) {

wps.invoke("Terminate");

wps.safeRelease();

}

ComThread.Release();

}

}public voidimg2PDF(String inputFile,String pdfFile) {

Document doc= new Document(PageSize.A4, 20, 20, 20, 20);try{

PdfWriter.getInstance(doc,newFileOutputStream(pdfFile));

doc.open();

doc.newPage();

Image img=Image.getInstance(inputFile);float heigth =img.getHeight();float width =img.getWidth();int percent =getPercent(heigth, width);

img.setAlignment(Image.MIDDLE);

img.scalePercent(percent+3);//表示是原来图像的比例;

doc.add(img);

doc.close();

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(DocumentException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

File mOutputPdfFile= newFile(pdfFile);if (!mOutputPdfFile.exists()) {

mOutputPdfFile.deleteOnExit();return;

}

}public static int getPercent(float h, floatw) {int p = 0;float p2 = 0.0f;

p2= 530 / w * 100;

p=Math.round(p2);returnp;

}

}

View Code

例:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagenet.nblh.utils;importjava.awt.image.BufferedImage;importjava.awt.image.RenderedImage;importjava.io.File;importjava.io.IOException;importjavax.imageio.ImageIO;importorg.icepdf.core.pobjects.Document;importorg.icepdf.core.util.GraphicsRenderingHints;importcom.jacob.activeX.ActiveXComponent;importcom.jacob.com.ComFailException;importcom.jacob.com.ComThread;importcom.jacob.com.Dispatch;importcom.jacob.com.Variant;public classWord2PdfUtil {private static final int ppSaveAsPDF = 32;static final int wdDoNotSaveChanges = 0;//不保存待定的更改

static final int wdFormatPDF = 17;//word转PDF 格式

/*** 文档转pdf转png

*@paramsource 源文件*/

public static intexecuConvert(String source) {

String ext= source.substring(source.lastIndexOf("."));

String tar= source.replace(ext, ".pdf");

File file= newFile(tar);if(file.exists()) {//pdf文件已转换,直接转png

returnpdf2pngByFile(tar);

}//示例//String source = "D:\\2017\\庭审案件材料一.doc";//String target = "D:\\2018\\庭审案件材料一.pdf";

if (!checkAvailable(source,tar)) {return 0;

}//String t = setPdfType(source, target);

String suffixStr=getSuffix(source);if (".doc".equals(suffixStr) || ".docx".equals(suffixStr)) {returnword2pdf(source, tar);

}else if(".pptx".equals(suffixStr) || ".ppt".equals(suffixStr)){returnppt2pdf(source, tar);

}else if(".xls".equals(suffixStr) || ".xlsx".equals(suffixStr)){returnxls2Pdf(source, tar);

}else{

System.out.println("无法转换此文件格式");

}return 0;

}public static intword2pdf(String source, String target) {

ActiveXComponent app= null;

Dispatch doc= null;try{

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

app.setProperty("Visible", false);

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

doc= Dispatch.call(docs, "Open", source, false, true).toDispatch();

File tofile= newFile(target);

File dirPath= newFile(getPath(target));if(tofile.exists()) {

tofile.delete();

}else if (!dirPath.exists()) {

dirPath.mkdirs();

}

Dispatch.call(doc,"SaveAs", target, wdFormatPDF);//Dispatch.call(doc, "SAs", target, wdFormatPDF);

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

doc= null;

app.invoke("Quit", wdDoNotSaveChanges);

app= null;

System.out.println("pdf_ok");returnpdf2pngByFile(target);

}catch(Exception e) {return 0;

}finally{if (null !=doc) {

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

}if (app != null) {

app.invoke("Quit", wdDoNotSaveChanges);

}

}

}/*** 检查文件格式,只转换doc ,docx,ppt格式 fileName 文件名

*

*@return

*/

private static booleancheckFormat(String fileName) {if (null == fileName || "".equals(fileName)) {return false;

}if (!(fileName.substring(fileName.lastIndexOf(File.separator)).contains("."))) {

System.out.println("没有指明要转换的文件");return false;

}

String format= fileName.substring(fileName.lastIndexOf("."));if (".doc".equals(format) || ".docx".equals(format) || ".ppt".equals(format) || ".pptx".equals(format)|| ".xls".equals(format) || ".xlsx".equals(format) || ".dot".equals(format) || ".dotx".equals(format)|| ".pot".equals(format) || ".potx".equals(format) || ".xlt".equals(format) || "xltx".equals(format)) {return true;

}

System.out.println("文件格式不合符,无法转换");return false;

}/*** 检查路径是否正确

*@return

*/

public static booleancheckAvailable(String source,String target){if(isEmpty(source.trim())) {

System.out.println("源文件路径不存在");return false;

}if(!source.contains(File.separator) || !source.contains(".")){

System.out.println("请输入正确的源文件路径,以及源文件名");return false;

}if(".".equals(getSuffix(source).trim())){

System.out.println("请输入正确的源文件名");return false;

}if(isEmpty(target)){

System.out.println("目标文件路径不存在");return false;

}if(!target.contains(File.separator) || !target.contains(".")){

System.out.println("请输入正确的目标文件路径,以及目标文件名");return false;

}if(!".pdf".equals(getSuffix(target))){

System.out.println("请正确输入要生成的pdf文件名");return false;

}return true;

}/*** 截取文件全路径,不包括文件名 F:/snd/down/ceshi/*/

private staticString getPath(String fileName) {if (null != fileName || !"".equals(fileName)) {return fileName.substring(0, fileName.lastIndexOf(File.separator));

}return "";

}/*** 如果目标文件后缀名不是pdf,则强行改为pdf*/

private staticString setPdfType(String source, String target) {//目标路径包含文件名称

if (target.substring(target.lastIndexOf(File.separator)).contains(".")) {

String ext= target.substring(target.lastIndexOf("."));

String fileName= target.replace(ext, ".pdf");returnfileName;

}else{//没有文件名称,只有路径

return target + getFileName(source) + ".pdf";

}

}/*** 截取文件名 不包含后缀名

*

*@return

*/

private staticString getFileName(String fileName) {if (!isEmpty(fileName)) {return fileName.substring(fileName.lastIndexOf(File.separator), fileName.lastIndexOf("."));

}return "";

}/*** 获得后缀名

*@paramfileName

*@return

*/

private staticString getSuffix(String fileName){return fileName.substring(fileName.lastIndexOf("."));

}private static booleanisEmpty(String str) {if (null == str || "".equals(str)) {return true;

}return false;

}//ppt 转 pdf

public static intppt2pdf(String srcFilePath, String pdfFilePath) {

ActiveXComponent app= null;

Dispatch ppt= null;try{

ComThread.InitSTA();

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

Dispatch ppts= app.getProperty("Presentations").toDispatch();//因POWER.EXE的发布规则为同步,所以设置为同步发布

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

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

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

).toDispatch();

File dirPath= newFile(getPath(pdfFilePath));if (!dirPath.exists()) {

dirPath.mkdirs();

}

Dispatch.call(ppt,"SaveAs", pdfFilePath, ppSaveAsPDF); //ppSaveAsPDF为特定值32

System.out.println("pdf转换完成!");return pdf2pngByFile(pdfFilePath); //set flag true;

} catch(ComFailException e) {

System.out.println(e.toString());return 0;

}catch(Exception e) {

System.out.println(e.toString());return 0;

}finally{if (ppt != null) {

Dispatch.call(ppt,"Close");

}if (app != null) {

app.invoke("Quit");

}

ComThread.Release();

}

}//EXCEL转PDF

public static intxls2Pdf(String inFilePath, String outFilePath) {

ActiveXComponent ax= null;

Dispatch excels= null;

Dispatch excel= null;try{

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

ComThread.InitSTA();

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

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

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

File dirPath= newFile(getPath(outFilePath));if (!dirPath.exists()) {

dirPath.mkdirs();

}

excel=Dispatch

.invoke(excels,"Open", Dispatch.Method,new Object[] { inFilePath, new Variant(false), new Variant(false) }, new int[9])

.toDispatch();//转换格式

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

outFilePath, new Variant(0) }, new int[1]);//0=标准//(生成的PDF图片不会变模糊)//1=最小文件//(生成的PDF图片糊的一塌糊涂)

Dispatch.call(excel,"Close", new Variant(false));if (ax != null) {

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

ax= null;

}

System.out.println("pdf转换完成!");returnpdf2pngByFile(outFilePath);

}catch(Exception es) {

System.out.println(es.toString());return 0;

}finally{

ComThread.Release();

}

}/*** 本地pdf文件转png*/

public static intpdf2pngByFile(String target){

String filePath=target;

Document document= newDocument();//System.out.println("开始转png");

try{

document.setFile(filePath);float scale = 1.5f;//缩放比例(大图)//float scale = 0.2f;//缩放比例(小图)

float rotation = 0f;//旋转角度

int pageSize =document.getNumberOfPages();for (int i = 0; i < document.getNumberOfPages(); i++) {

BufferedImage image=(BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN,

org.icepdf.core.pobjects.Page.BOUNDARY_CROPBOX, rotation, scale);

RenderedImage rendImage=image;//try {//File file = new File("D:/fileUpload/ftpDownload/icepdf_a" + i + ".png");// //这里png作用是:格式是jpg但有png清晰度//ImageIO.write(rendImage, "png", file);//} catch (IOException e) {//e.printStackTrace();//}

try{//WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();//ServletContext servletContext = webApplicationContext.getServletContext();//File contextPath = new File(servletContext.getRealPath("/"));//项目根目录//File uploadPath = new File(//contextPath.getParentFile().getAbsoluteFile() + File.separator + "uploadFiles");//上传图片存放目录

File uploadPath = newFile(target);

String fileName=getPathWithName(target);

File file1= newFile(fileName);if (!file1.exists()) {

file1.mkdirs();

}//System.out.println("地址=" + uploadPath.getAbsolutePath() + "/icepdf_a" + i + ".png" + "\n");

File file = new File(fileName + "\\" + i + ".png");//这里png作用是:格式是jpg但有png清晰度

ImageIO.write(rendImage, "png", file);

}catch(IOException e) {

e.printStackTrace();

}

image.flush();

}

document.dispose();

System.out.println("png_ok");

System.out.println("pageSize="+pageSize);returnpageSize;

}catch(Exception e1) {

e1.printStackTrace();

}return 0;

}/*** 截取文件全路径,包括文件名,去掉后缀 F:/snd/down/ceshi/aaa*/

public staticString getPathWithName(String fileName) {if (null != fileName || !"".equals(fileName)) {return fileName.substring(0, fileName.lastIndexOf("."));

}return "";

}

}

View Code

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

false, //Untitled指定文件是否有标题(参数必须为false,设置成true,ppt转换pdf异常)

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

).toDispatch();

Dispatch.call(ppt,"SaveAs", pdfFilePath, ppSaveAsPDF); //ppSaveAsPDF为特定值32

参考地址:

你可能感兴趣的:(java,jacob,pdf)