java調用WPS或pdfcreator的com接口實現doc轉pdf

fmms 12年前發布 | 76K 次閱讀 Java PDF工具包

使用了jacob.jar來調用activex控件,本機需安裝WPS或pdfcreator。

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>

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!