4

ディレクトリからファイルのリストを読み取り、リスト内の各 MSOffice ドキュメントを JODConverter ライブラリと OpenOffice.org 3.4.1 を使用して PDF に変換する ColdFusion アプリケーションがあります。

私はこのアプリケーションを作成し、次の 2 つの記事の指示に従って開発用 PC をセットアップしました。

http://cfsearching.blogspot.com/search/label/JODConverter

唯一の違いは、必要な JAR を の外部にインストールしたことですcf_root

<cffunction name="convertNonPDFFiles" returntype="Void" output="false">
    <cfscript>
        //  CONSTANTs
        var _NON_PDF_PATH = APPLICATION.PDFSource & "\NonPDFs";
        var _PDF_PATH = APPLICATION.PDFSource & "\PDFs";
        var _VALID_FILE_EXTENSIONS = "doc,docx,ppt,pptx";

        //  Set defaults for private variables
        var _qNonPDFDir = QueryNew("");
        var _fileName = "";
        var _documentId = 0;
        var _sourceFilePath = "";
        var _destinationFilePath = "";
        var _fileExtension = "";
        var _isConversionSuccessful = true;
        var _tempSourceFilePath = "";
        var _tempImageFilePath = "";

        //  Initialize Open Office Conversion Manager
        var _openOfficeManager =
            CreateObject(
                "java",
                "org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration"
                ).setOfficeHome(
                    APPLICATION.OpenOfficeProgramPath // Location of the OpenOffice.org 3.4.1 application directory on the server
                    ).setTaskExecutionTimeout(60000).buildOfficeManager();

        _openOfficeManager.start();
    </cfscript>

    <!--- Retrieve a list of file names in the directory of unprocessed
        non-PDF files --->
    <cfdirectory
        action="list"
        directory="#_NON_PDF_PATH#"
        name="_qNonPDFDir"
        type="file"
        listinfo="name"
        sort="datelastmodified DESC" />

    <cfoutput query="_qNonPDFDir">
        <cfscript>
            _fileName = _qNonPDFDir.name;
            _fileExtension =
                REQUEST.UDFLib.File.getFileExtension(_fileName);
            _sourceFilePath = _NON_PDF_PATH & "\" & _fileName;

            //  File is a valid format for conversion
            if  (ListFindNoCase(_VALID_FILE_EXTENSIONS, _fileExtension)) {
                _documentId =
                    REQUEST.UDFLib.File.getFileNameWithoutExtension(
                        _fileName
                        );
                _destinationFilePath =
                        _PDF_PATH
                    &   "\"
                    &   REQUEST.UDFLib.File.getFileNameWithoutExtension(
                            _fileName
                            )
                    &   ".pdf";
                _isConversionSuccessful = true;
                _tempSourceFilePath =
                        APPLICATION.TempDir
                    &   "\"
                    &   _documentId
                    &   "." & _fileExtension;

                /*
                    Create of the copy of the original file in the temp
                    directory
                */
                FileCopy(
                    APPLICATION.of_aprimo_root & "\" & _documentId & ".dat",
                    _tempSourceFilePath
                    );

                //  Attempt to convert the file to PDF
                try {
                    // See convertFile() method below
                    convertFile(
                        openOfficeManager = _openOfficeManager,
                        inputFilePath = _tempSourceFilePath,
                        outputFilePath = _destinationFilePath
                        );
                }
                catch (any e) {
                    _isConversionSuccessful = false;
                }

                if  (_isConversionSuccessful)
                    FileMove(
                        _sourceFilePath,
                        _NON_PDF_PATH & "\Processed\"
                        );
                else
                    FileMove(
                        _sourceFilePath,
                        _NON_PDF_PATH & "\NonFunctioning\"
                        );
            }
            //  File is not a valid format for conversion
            else {
                FileDelete(_sourceFilePath);
            }
        </cfscript>
    </cfoutput>

    <cfscript>
        _openOfficeManager.stop();

        return;
    </cfscript>
</cffunction>

<cfscript>
    function convertFile(openOfficeManager, inputFilePath, outputFilePath) {
        CreateObject(
            "java",
            "org.artofsolving.jodconverter.OfficeDocumentConverter"
            ).init(ARGUMENTS.OpenOfficeManager).convert(
                CreateObject(
                    "java",
                    "java.io.File"
                    ).init(ARGUMENTS.inputFilePath),
                CreateObject(
                    "java",
                    "java.io.File"
                    ).init(ARGUMENTS.outputFilePath)
                );

        return;
    }
</cfscript>

このアプリケーションは私の開発マシンでは完全に動作しますが、Web サーバーの 1 つに移動するとすぐに動作しなくなります。

開発用 PC のセットアップ:

 OS: Windows 7 Professional SP1
 IIS: 7
 ColdFusion: 8.0.1

サーバーのセットアップ:

 OS: Windows 2003 R2 Standard Edition SP2
 IIS: 6.0
 ColdFusion: 8.0.1

サーバー上でアプリケーションを実行しようとすると、ブラウザーで直接、またはスケジュールされたタスクを介して、例外はスローされません。60 分後にタイムアウトになるまで実行されているように見えます。タスク マネージャーでは、アプリケーションの起動時に soffice.bin が実行を開始するのを確認できますが、数秒後に soffice.bin がタスク マネージャーから消えてしまいます。

何が問題なのですか?

4

2 に答える 2

1

いくつかのトラブルシューティングの後、プログラミングにいくつかの小さな変更を加えて、ようやくこれを機能させることができました (すべて cfSearching の功績です - http://cfsearching.blogspot.com/search/のコメントで問題の答えを見つけました)。ラベル/JODConverter )。

OpenOfficeManager インスタンスを構成して開始した元のコード:

            CreateObject(
                "java",
                "org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration"
                ).setOfficeHome(
                    APPLICATION.OpenOfficeProgramPath
                    ).setTaskExecutionTimeout(60000).buildOfficeManager();

setConnectionProtocol() および setPortNumber() を追加するために更新 (修正) されました。

            CreateObject(
                "java",
                "org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration"
                ).setOfficeHome(
                    APPLICATION.OpenOfficeProgramPath
                    ).setConnectionProtocol(
                        CreateObject(
                            "java",
                            "org.artofsolving.jodconverter.office.OfficeConnectionProtocol"
                            ).SOCKET
                        ).setPortNumber(
                            8100
                            ).setTaskExecutionTimeout(
                                60000
                                ).buildOfficeManager();
于 2013-07-09T12:29:03.097 に答える