java调用WPS或pdfcreator的com接口实现doc转pdf
fmms
13年前
使用了jacob.jar来调用activex控件,本机需安装WPS或pdfcreator。 <pre class="brush:java; toolbar: true; auto-links: false;">package test; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.DispatchEvents; import com.jacob.com.Variant; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; public class Doc2Pdf { public static Converter newConverter(String name) { if (name.equals("wps")) { return new Wps(); } else if (name.equals("pdfcreator")) { return new PdfCreator(); } return null; } public synchronized static boolean convert(String word, String pdf) { return newConverter("pdfcreator").convert(word, pdf); } public abstract static interface Converter { public boolean convert(String word, String pdf); } public static class Wps implements Converter { public synchronized boolean convert(String word, String pdf) { File pdfFile = new File(pdf); File wordFile = new File(word); ActiveXComponent wps = null; try { wps = new ActiveXComponent("wps.application"); ActiveXComponent doc = wps.invokeGetComponent("Documents").invokeGetComponent("Open", new Variant(wordFile.getAbsolutePath())); doc.invoke("ExportPdf", new Variant(pdfFile.getAbsolutePath())); doc.invoke("Close"); doc.safeRelease(); } catch (Exception ex) { Logger.getLogger(Doc2Pdf.class.getName()).log(Level.SEVERE, null, ex); return false; } catch (Error ex) { Logger.getLogger(Doc2Pdf.class.getName()).log(Level.SEVERE, null, ex); return false; } finally { if (wps != null) { wps.invoke("Terminate"); wps.safeRelease(); } } return true; } } public static class PdfCreator implements Converter { public static final int STATUS_IN_PROGRESS = 2; public static final int STATUS_WITH_ERRORS = 1; public static final int STATUS_READY = 0; private ActiveXComponent pdfCreator; private DispatchEvents dispatcher; private volatile int status; private Variant defaultPrinter; private void init() { pdfCreator = new ActiveXComponent("PDFCreator.clsPDFCreator"); dispatcher = new DispatchEvents(pdfCreator, this); pdfCreator.setProperty("cVisible", new Variant(false)); pdfCreator.invoke("cStart", new Variant[]{new Variant("/NoProcessingAtStartup"), new Variant(true)}); setCOption("UseAutosave", 1); setCOption("UseAutosaveDirectory", 1); setCOption("AutosaveFormat", 0); defaultPrinter = pdfCreator.getProperty("cDefaultPrinter"); status = STATUS_IN_PROGRESS; pdfCreator.setProperty("cDefaultprinter", "PDFCreator"); pdfCreator.invoke("cClearCache"); pdfCreator.setProperty("cPrinterStop", false); } private void setCOption(String property, Object value) { Dispatch.invoke(pdfCreator, "cOption", Dispatch.Put, new Object[]{property, value}, new int[2]); } private void close() { if (pdfCreator != null) { pdfCreator.setProperty("cDefaultprinter", defaultPrinter); pdfCreator.invoke("cClearCache"); pdfCreator.setProperty("cPrinterStop", true); pdfCreator.invoke("cClose"); pdfCreator.safeRelease(); pdfCreator = null; } if (dispatcher != null) { dispatcher.safeRelease(); dispatcher = null; } } public synchronized boolean convert(String word, String pdf) { File pdfFile = new File(pdf); File wordFile = new File(word); try { init(); setCOption("AutosaveDirectory", pdfFile.getParentFile().getAbsolutePath()); setCOption("AutosaveFilename", pdfFile.getName()); pdfCreator.invoke("cPrintfile", wordFile.getAbsolutePath()); int seconds = 0; while (isInProcess()) { Thread.sleep(1000); seconds++; if (seconds > 20) { // timeout break; } } if (seconds > 20 || isWithError()) return false; } catch (InterruptedException ex) { Logger.getLogger(Doc2Pdf.class.getName()).log(Level.SEVERE, null, ex); return false; } catch (Exception ex) { Logger.getLogger(Doc2Pdf.class.getName()).log(Level.SEVERE, null, ex); return false; } catch (Error ex) { Logger.getLogger(Doc2Pdf.class.getName()).log(Level.SEVERE, null, ex); return false; } finally { close(); } return true; } private boolean isInProcess() { return status == STATUS_IN_PROGRESS; } private boolean isWithError() { return status == STATUS_WITH_ERRORS; } // eReady event public void eReady(Variant[] args) { status = STATUS_READY; } // eError event public void eError(Variant[] args) { status = STATUS_WITH_ERRORS; } } public static void main(String[] args) { convert("d:\\input.doc", "d:\\output.pdf"); } }</pre>