搜尋
首頁web前端html教學使用jacob调用Windows的com对象,转换Office文件为pdf、html等_html/css_WEB-ITnose

1、介绍


     Jacob 是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。至于什么是COM组件,大家自己Google吧。

2、安装和配置

    Jacob是一个开源软件,它的官方站点是: http://danadler.com/jacob/ 大家可以到上面下载源代码研究,也可以直接下载编译后的二进制文件。

    下载包jacob_x.x.zip,解压后有几个文件:jacob.jar、jacob-x.x-M2-x86.dll
    把jacob-x.x-M2-x86.dll拷贝到%JAVA_HOME% 下的 bin 目录下,其中,%JAVA_HOME%就是JDK的安装目录。接着直接在java IDE中引用jacob.jar就可以使用了。
     

3、转换word为pdf、html、txt 的示例

package com.shanhy.demo.windowsoffice;import java.io.File;import com.jacob.activeX.ActiveXComponent;import com.jacob.com.ComThread;import com.jacob.com.Dispatch;import com.jacob.com.Variant;/** * * 将jacob.dll放入JDK的bin目录下 * 把jacob.jar放入项目的buildPath中(web项目放到WEB-INF\lib目录下) *  * @author 单红宇 * */public class ConvertToPdf {	// WORD 转换文档格式参数值:17为pdf,8为html,2为txt(支持的格式不限与此,其他格式暂为列出)	static final int wdFormatPDF = 17;// PDF 格式	static final int wdFormatHTML = 8;// HTML 格式	static final int wdFormatTXT = 2;// TXT 格式	/**	 * Word文档转换	 * 	 * @param fromfileName	 * @param toFileName	 * @author SHANHY	 */	public void wordConvert(String fromfileName, String toFileName) {		System.out.println("启动Word...");		ComThread.InitSTA();  				long start = System.currentTimeMillis();		ActiveXComponent app = null;		Dispatch doc = null;		try {			app = new ActiveXComponent("Word.Application");//创建一个word对象			app.setProperty("Visible", new Variant(false)); //不可见打开word			app.setProperty("AutomationSecurity", new Variant(3)); //禁用宏			Dispatch docs = app.getProperty("Documents").toDispatch();//获取文挡属性						System.out.println("打开文档 >>> " + fromfileName);			//Object[]第三个参数是表示“是否只读方式打开”			doc = Dispatch.invoke(docs, "Open", Dispatch.Method, 					new Object[] { fromfileName, new Variant(false), new Variant(true) }, new int[1]).toDispatch();			File tofile = new File(toFileName);			if (tofile.exists()) {				tofile.delete();			}			int formatValue = -1;			if(toFileName.toLowerCase().endsWith(".pdf")){				formatValue = wdFormatPDF;			}else if(toFileName.toLowerCase().endsWith(".html")){				formatValue = wdFormatHTML;			}else if(toFileName.toLowerCase().endsWith(".txt")){				formatValue = wdFormatTXT;			}else{				formatValue = -1;			}			if(formatValue != -1){				System.out.println("转换文档 ["+fromfileName+"] >>> ["+toFileName+"]"); 				Dispatch.invoke(doc, "SaveAs", Dispatch.Method, 						new Object[] { toFileName, new Variant(formatValue) }, new int[1]);			}else{				System.out.println("转换文件到目标文档不被支持!["+fromfileName+"] >>> ["+toFileName+"]"); 			}						long end = System.currentTimeMillis();						System.out.println("用时:" + (end - start) + "ms.");		} catch (Exception e) {			e.printStackTrace();			System.out.println("========Error:文档转换失败:" + e.getMessage());		} finally {			Dispatch.call(doc, "Close", false);			System.out.println("关闭文档");			if (app != null)				app.invoke("Quit", new Variant[] {});		}		// 如果没有这句话,winword.exe进程将不会关闭		ComThread.Release();          ComThread.quitMainSTA();  	}		/**	 * PPT(PowerPoint)文档转换	 * 	 * @param fromfileName	 * @param toFileName	 * @author SHANHY	 */	public void pptConvert(String fromfileName, String toFileName) {		System.out.println("启动PPT...");		ComThread.InitSTA();  				long start = System.currentTimeMillis();		ActiveXComponent app = null;		Dispatch doc = null;		try {			app = new ActiveXComponent("Word.Application");//创建一个word对象			app.setProperty("Visible", new Variant(false)); //不可见打开word			app.setProperty("AutomationSecurity", new Variant(3)); //禁用宏			Dispatch docs = app.getProperty("Documents").toDispatch();//获取文挡属性						System.out.println("打开文档 >>> " + fromfileName);			//Object[]第三个参数是表示“是否只读方式打开”			doc = Dispatch.invoke(docs, "Open", Dispatch.Method, 					new Object[] { fromfileName, new Variant(false), new Variant(true) }, new int[1]).toDispatch();			File tofile = new File(toFileName);			if (tofile.exists()) {				tofile.delete();			}			int formatValue = -1;			if(toFileName.toLowerCase().endsWith(".pdf")){				formatValue = wdFormatPDF;			}else if(toFileName.toLowerCase().endsWith(".html")){				formatValue = wdFormatHTML;			}else if(toFileName.toLowerCase().endsWith(".txt")){				formatValue = wdFormatTXT;			}else{				formatValue = -1;			}			if(formatValue != -1){				System.out.println("转换文档 ["+fromfileName+"] >>> ["+toFileName+"]"); 				Dispatch.invoke(doc, "SaveAs", Dispatch.Method, 						new Object[] { toFileName, new Variant(formatValue) }, new int[1]);			}else{				System.out.println("转换文件到目标文档不被支持!["+fromfileName+"] >>> ["+toFileName+"]"); 			}						long end = System.currentTimeMillis();						System.out.println("用时:" + (end - start) + "ms.");		} catch (Exception e) {			e.printStackTrace();			System.out.println("========Error:文档转换失败:" + e.getMessage());		} finally {			Dispatch.call(doc, "Close", false);			System.out.println("关闭文档");			if (app != null)				app.invoke("Quit", new Variant[] {});		}		// 如果没有这句话,winword.exe进程将不会关闭		ComThread.Release();  		ComThread.quitMainSTA();  	}	public static void main(String[] args) {		ConvertToPdf d = new ConvertToPdf();		d.wordConvert("g:\\test.docx", "g:\\test.pdf");	}}

读、写Word的简单示例

import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Variant; import com.jacob.com.Dispatch; public class Word {     String strDir = "c:jacob_1.9";     String strInputDoc = strDir + "file_in.doc";     String strOutputDoc = strDir + "file_out.doc";     String strOldText = "[label:import:1]";     String strNewText =             "I am some horribly long sentence, so long that [insert anything]";     boolean isVisible = true;     boolean isSaveOnExit = true;     public Word() {         ActiveXComponent oWord = new ActiveXComponent("Word.Application");         oWord.setProperty("Visible", new Variant(isVisible));         Dispatch oDocuments = oWord.getProperty("Documents").toDispatch();         Dispatch oDocument = Dispatch.call(oDocuments, "Open", strInputDoc).                              toDispatch();         Dispatch oSelection = oWord.getProperty("Selection").toDispatch();         Dispatch oFind = oWord.call(oSelection, "Find").toDispatch();         Dispatch.put(oFind, "Text", strOldText);         Dispatch.call(oFind, "Execute");         Dispatch.put(oSelection, "Text", strNewText);         Dispatch.call(oSelection, "MoveDown");         Dispatch.put(oSelection, "Text",                      "nSo we got the next line including BR.n");         Dispatch oFont = Dispatch.get(oSelection, "Font").toDispatch();         Dispatch.put(oFont, "Bold", "1");         Dispatch.put(oFont, "Italic", "1");         Dispatch.put(oFont, "Underline", "0");         Dispatch oAlign = Dispatch.get(oSelection, "ParagraphFormat").                           toDispatch();         Dispatch.put(oAlign, "Alignment", "3");         Dispatch oWordBasic = (Dispatch) Dispatch.call(oWord, "WordBasic").                               getDispatch();         Dispatch.call(oWordBasic, "FileSaveAs", strOutputDoc);         Dispatch.call(oDocument, "Close", new Variant(isSaveOnExit));         oWord.invoke("Quit", new Variant[0]);     }     public static void main(String[] args) {         Word word = new Word();     } } 

4、jacob.jar的结构

jacob包括两个部分:

    com.jacob.activeX: ActiveXComponent类
    com.jacob.com: 其它类和元素

5、Jacob类

Jacob的结构很简单,包含以下几个类:

    ActiveXComponent Class:封装了Dispatch对象,用于创建一个封装了COM组件对象的Java Object
    Dispatch Class:用于指向封装后的MS数据结构。常用的方法有call,subcall,get,invoke…后面会介绍使用方法。
    Variant Class:用于映射COM的Variant数据类型。提供Java和COM的数据交换。

ComException Class:异常类

6、Jacob方法

用于访问COM/DLL对象的方法,读取、修改COM/DLL对象的属性。

    call method:属于Dispatch类。用于访问COM/DLL对象的方法。方法进行了重载,方便不同场合调用。返回一个Variant类型的值。
    callSub method:使用方法和call一样,不过它不返回值。
    get method:读取COM对象的属性值,返回一个Variant类型值。
    put method:设置COM对象的属性值。
    invoke method:call的另一种用法,更复杂一些。
    invokesub method:subcall的另一种用法
    getProperty method:属于ActiveXComponent类,读取属性值,返回一个Variant类型值。

setProperty method:属于ActiveXComponent类,设置属性值。

要注意一点:在使用Jacob时,很重要的一点是,用户必须安装有Office的应用程序。否则也就无法建立Java-COM桥,进而无法解析了。


部分内容参考: http://www.cnblogs.com/vulcans/archive/2009/09/08/1562588.html


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
HTML中的布爾屬性是什麼?舉一些例子。HTML中的布爾屬性是什麼?舉一些例子。Apr 25, 2025 am 12:01 AM

布爾屬性是HTML中的特殊屬性,不需要值即可激活。 1.布爾屬性通過存在與否控制元素行為,如disabled禁用輸入框。 2.它們的工作原理是瀏覽器解析時根據屬性的存在改變元素行為。 3.基本用法是直接添加屬性,高級用法可通過JavaScript動態控制。 4.常見錯誤是誤以為需要設置值,正確寫法應簡潔。 5.最佳實踐是保持代碼簡潔,合理使用布爾屬性以優化網頁性能和用戶體驗。

如何驗證您的HTML代碼?如何驗證您的HTML代碼?Apr 24, 2025 am 12:04 AM

HTML代碼可以通過在線驗證器、集成工具和自動化流程來確保其清潔度。 1)使用W3CMarkupValidationService在線驗證HTML代碼。 2)在VisualStudioCode中安裝並配置HTMLHint擴展進行實時驗證。 3)利用HTMLTidy在構建流程中自動驗證和清理HTML文件。

HTML與CSS和JavaScript:比較Web技術HTML與CSS和JavaScript:比較Web技術Apr 23, 2025 am 12:05 AM

HTML、CSS和JavaScript是構建現代網頁的核心技術:1.HTML定義網頁結構,2.CSS負責網頁外觀,3.JavaScript提供網頁動態和交互性,它們共同作用,打造出用戶體驗良好的網站。

HTML作為標記語言:其功能和目的HTML作為標記語言:其功能和目的Apr 22, 2025 am 12:02 AM

HTML的功能是定義網頁的結構和內容,其目的在於提供一種標準化的方式來展示信息。 1)HTML通過標籤和屬性組織網頁的各個部分,如標題和段落。 2)它支持內容與表現分離,提升維護效率。 3)HTML具有可擴展性,允許自定義標籤增強SEO。

HTML,CSS和JavaScript的未來:網絡開發趨勢HTML,CSS和JavaScript的未來:網絡開發趨勢Apr 19, 2025 am 12:02 AM

HTML的未來趨勢是語義化和Web組件,CSS的未來趨勢是CSS-in-JS和CSSHoudini,JavaScript的未來趨勢是WebAssembly和Serverless。 1.HTML的語義化提高可訪問性和SEO效果,Web組件提升開發效率但需注意瀏覽器兼容性。 2.CSS-in-JS增強樣式管理靈活性但可能增大文件體積,CSSHoudini允許直接操作CSS渲染。 3.WebAssembly優化瀏覽器應用性能但學習曲線陡,Serverless簡化開發但需優化冷啟動問題。

HTML:結構,CSS:樣式,JavaScript:行為HTML:結構,CSS:樣式,JavaScript:行為Apr 18, 2025 am 12:09 AM

HTML、CSS和JavaScript在Web開發中的作用分別是:1.HTML定義網頁結構,2.CSS控製網頁樣式,3.JavaScript添加動態行為。它們共同構建了現代網站的框架、美觀和交互性。

HTML的未來:網絡設計的發展和趨勢HTML的未來:網絡設計的發展和趨勢Apr 17, 2025 am 12:12 AM

HTML的未來充滿了無限可能。 1)新功能和標準將包括更多的語義化標籤和WebComponents的普及。 2)網頁設計趨勢將繼續向響應式和無障礙設計發展。 3)性能優化將通過響應式圖片加載和延遲加載技術提升用戶體驗。

HTML與CSS vs. JavaScript:比較概述HTML與CSS vs. JavaScript:比較概述Apr 16, 2025 am 12:04 AM

HTML、CSS和JavaScript在網頁開發中的角色分別是:HTML負責內容結構,CSS負責樣式,JavaScript負責動態行為。 1.HTML通過標籤定義網頁結構和內容,確保語義化。 2.CSS通過選擇器和屬性控製網頁樣式,使其美觀易讀。 3.JavaScript通過腳本控製網頁行為,實現動態和交互功能。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器