


使用jacob調(diào)用Windows的com對象,轉(zhuǎn)換Office文件為pdf、html等_html/css_WEB-ITnose
Jun 24, 2016 am 11:50 AM
1、介紹
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、轉(zhuǎn)換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 轉(zhuǎn)換文檔格式參數(shù)值: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文檔轉(zhuǎn)換 * * @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");//創(chuàng)建一個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[]第三個參數(shù)是表示“是否只讀方式打開” 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("轉(zhuǎn)換文檔 ["+fromfileName+"] >>> ["+toFileName+"]"); Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { toFileName, new Variant(formatValue) }, new int[1]); }else{ System.out.println("轉(zhuǎn)換文件到目標(biāo)文檔不被支持!["+fromfileName+"] >>> ["+toFileName+"]"); } long end = System.currentTimeMillis(); System.out.println("用時:" + (end - start) + "ms."); } catch (Exception e) { e.printStackTrace(); System.out.println("========Error:文檔轉(zhuǎn)換失?。?quot; + e.getMessage()); } finally { Dispatch.call(doc, "Close", false); System.out.println("關(guān)閉文檔"); if (app != null) app.invoke("Quit", new Variant[] {}); } // 如果沒有這句話,winword.exe進程將不會關(guān)閉 ComThread.Release(); ComThread.quitMainSTA(); } /** * PPT(PowerPoint)文檔轉(zhuǎn)換 * * @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");//創(chuàng)建一個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[]第三個參數(shù)是表示“是否只讀方式打開” 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("轉(zhuǎn)換文檔 ["+fromfileName+"] >>> ["+toFileName+"]"); Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { toFileName, new Variant(formatValue) }, new int[1]); }else{ System.out.println("轉(zhuǎn)換文件到目標(biāo)文檔不被支持!["+fromfileName+"] >>> ["+toFileName+"]"); } long end = System.currentTimeMillis(); System.out.println("用時:" + (end - start) + "ms."); } catch (Exception e) { e.printStackTrace(); System.out.println("========Error:文檔轉(zhuǎn)換失敗:" + e.getMessage()); } finally { Dispatch.call(doc, "Close", false); System.out.println("關(guān)閉文檔"); if (app != null) app.invoke("Quit", new Variant[] {}); } // 如果沒有這句話,winword.exe進程將不會關(guān)閉 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的結(jié)構(gòu)
jacob包括兩個部分:
??? com.jacob.activeX: ActiveXComponent類
??? com.jacob.com: 其它類和元素
5、Jacob類
Jacob的結(jié)構(gòu)很簡單,包含以下幾個類:
??? ActiveXComponent Class:封裝了Dispatch對象,用于創(chuàng)建一個封裝了COM組件對象的Java Object
??? Dispatch Class:用于指向封裝后的MS數(shù)據(jù)結(jié)構(gòu)。常用的方法有call,subcall,get,invoke…后面會介紹使用方法。
??? Variant Class:用于映射COM的Variant數(shù)據(jù)類型。提供Java和COM的數(shù)據(jù)交換。
ComException Class:異常類
6、Jacob方法
用于訪問COM/DLL對象的方法,讀取、修改COM/DLL對象的屬性。
??? call method:屬于Dispatch類。用于訪問COM/DLL對象的方法。方法進行了重載,方便不同場合調(diào)用。返回一個Variant類型的值。
??? callSub method:使用方法和call一樣,不過它不返回值。
??? get method:讀取COM對象的屬性值,返回一個Variant類型值。
??? put method:設(shè)置COM對象的屬性值。
??? invoke method:call的另一種用法,更復(fù)雜一些。
??? invokesub method:subcall的另一種用法
??? getProperty method:屬于ActiveXComponent類,讀取屬性值,返回一個Variant類型值。
setProperty method:屬于ActiveXComponent類,設(shè)置屬性值。
要注意一點:在使用Jacob時,很重要的一點是,用戶必須安裝有Office的應(yīng)用程序。否則也就無法建立Java-COM橋,進而無法解析了。
部分內(nèi)容參考: http://www.cnblogs.com/vulcans/archive/2009/09/08/1562588.html

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Untuk menggunakan elemen butang HTML untuk mencapai butang yang boleh diklik, anda mesti menguasai penggunaan asas dan langkah berjaga -jaga yang sama. 1. Buat butang dengan tag dan tentukan tingkah laku melalui atribut jenis (seperti butang, hantar, tetapkan semula), yang dikemukakan secara lalai; 2. Tambahkan fungsi interaktif melalui JavaScript, yang boleh ditulis dalam talian atau mengikat pendengar acara melalui ID untuk meningkatkan penyelenggaraan; 3. Gunakan CSS untuk menyesuaikan gaya, termasuk warna latar belakang, sempadan, sudut bulat dan kesan status hover/aktif untuk meningkatkan pengalaman pengguna; 4. Perhatikan masalah biasa: Pastikan atribut kurang upaya tidak didayakan, peristiwa JS terikat dengan betul, oklusi susun atur, dan gunakan bantuan alat pemaju untuk menyelesaikan masalah. Menguasai ini

Metadata dalam htmlhead adalah penting untuk SEO, perkongsian sosial, dan tingkah laku penyemak imbas. 1. Tetapkan tajuk halaman dan perihalan, gunakan dan simpannya ringkas dan unik; 2. Tambahkan maklumat kad OpenGraph dan Twitter untuk mengoptimumkan kesan perkongsian sosial, perhatikan saiz imej dan gunakan alat penyahpepijatan untuk menguji; 3. Tentukan set aksara dan tetapan Viewport untuk memastikan sokongan pelbagai bahasa disesuaikan dengan terminal mudah alih; 4. Tag pilihan seperti Hak Cipta Pengarang, Kawalan Robot dan Canonical Mencegah Kandungan Duplikat juga harus dikonfigurasi dengan munasabah.

Tolearnhtmlin2025, chooseatutorialthatalishands-onpracticeWithmodernstandardsandIntegrateScsSandjavascriptbasics.1.priorit izehands-onleleingwithstep-by-stepprojectslikeBuildingapersonalprofileorbloglayout.2.ensureitcoversmodernhtmlelementssuchas,

Bagaimana membuat templat mel html dengan keserasian yang baik? Pertama, anda perlu membina struktur dengan jadual untuk mengelakkan menggunakan susun atur div flex atau grid; Kedua, semua gaya mesti digariskan dan tidak boleh bergantung pada CSS luaran; Kemudian gambar harus ditambah dengan keterangan alt dan menggunakan URL awam, dan butang harus disimulasikan dengan jadual atau TD dengan warna latar belakang; Akhirnya, anda mesti menguji dan menyesuaikan butiran mengenai pelbagai pelanggan.

Menggunakan jumlah HTML membolehkan kejelasan intuitif dan semantik untuk menambah teks kapsyen ke imej atau media. 1. Digunakan untuk membungkus kandungan media bebas, seperti gambar, video atau blok kod; 2. Ia diletakkan sebagai teks penjelasannya, dan boleh terletak di atas atau di bawah media; 3. Mereka bukan sahaja meningkatkan kejelasan struktur halaman, tetapi juga meningkatkan akses dan kesan SEO; 4. Apabila menggunakannya, anda harus memberi perhatian untuk mengelakkan penyalahgunaan, dan memohon kepada kandungan yang perlu ditekankan dan disertai dengan keterangan, bukannya gambar hiasan biasa; 5. Atribut alt yang tidak boleh diabaikan, yang berbeza dari figcaption; 6. Figcaption adalah fleksibel dan boleh diletakkan di bahagian atas atau bawah angka seperti yang diperlukan. Menggunakan kedua -dua tag ini dengan betul membantu membina semantik dan mudah difahami kandungan web.

Apabila tiada pelayan backend, penyerahan borang HTML masih boleh diproses melalui teknologi front-end atau perkhidmatan pihak ketiga. Kaedah khusus termasuk: 1. Gunakan JavaScript untuk memintas penyerahan bentuk untuk mencapai pengesahan input dan maklum balas pengguna, tetapi data tidak akan berterusan; 2. Gunakan perkhidmatan bentuk tanpa pelayan pihak ketiga seperti FormSpree untuk mengumpul data dan memberikan pemberitahuan e-mel dan fungsi semula; 3. Gunakan LocalStorage untuk menyimpan data klien sementara, yang sesuai untuk menyimpan keutamaan pengguna atau menguruskan status aplikasi tunggal halaman, tetapi tidak sesuai untuk penyimpanan jangka panjang maklumat sensitif.

Kelas, ID, Gaya, Data, dan Tajuk adalah atribut global yang paling biasa digunakan dalam HTML. Kelas digunakan untuk menentukan satu atau lebih nama kelas untuk memudahkan tetapan gaya dan operasi JavaScript; ID menyediakan pengenal unik untuk elemen, sesuai untuk lompatan sauh dan kawalan JavaScript; Gaya membolehkan gaya sebaris ditambah, sesuai untuk debugging sementara tetapi tidak disyorkan untuk kegunaan besar-besaran; sifat data digunakan untuk menyimpan data tersuai, yang mudah untuk interaksi front-end dan back-end; Tajuk digunakan untuk menambah arahan tetikus, tetapi gaya dan kelakuannya terhad oleh penyemak imbas. Pemilihan yang munasabah sifat -sifat ini dapat meningkatkan kecekapan pembangunan dan pengalaman pengguna.

Pemuatan malas asli adalah fungsi penyemak imbas terbina dalam yang membolehkan pemuatan gambar malas dengan menambah atribut pemuatan = "malas" ke tag. 1. Ia tidak memerlukan JavaScript atau perpustakaan pihak ketiga, dan digunakan secara langsung dalam HTML; 2. Ia sesuai untuk gambar yang tidak dipaparkan pada skrin pertama di bawah halaman, galeri gambar menatal tambahan dan sumber gambar yang besar; 3. Ia tidak sesuai untuk gambar dengan skrin pertama atau paparan: Tiada; 4. Apabila menggunakannya, pemegang tempat yang sesuai harus ditetapkan untuk mengelakkan susun atur susun atur; 5. Ia harus mengoptimumkan pemuatan imej responsif dalam kombinasi dengan atribut srcset dan saiz; 6. Isu keserasian perlu dipertimbangkan. Sesetengah pelayar lama tidak menyokongnya. Mereka boleh digunakan melalui pengesanan ciri dan digabungkan dengan penyelesaian JavaScript.
