【发布时间】:2013-07-05 19:27:35
【问题描述】:
我有一个 ColdFusion 应用程序,它从目录中读取文件列表,然后使用 JODConverter 库和 OpenOffice.org 3.4.1 将列表中的每个 MSOffice 文档转换为 PDF。
我根据这里两篇文章中的说明编写了这个应用程序并设置了我的开发电脑:
http://cfsearching.blogspot.com/search/label/JODConverter
唯一的区别是我在cf_root之外安装了必要的JAR。
<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>
这个应用程序在我的开发机器上运行良好,但是一旦我将它移到我的一个网络服务器上,它就不能在那里运行。
开发电脑设置:
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 就从任务管理器中消失了。
任何想法可能是什么问题?
【问题讨论】:
-
您是否检查过以确保
APPLICATION.OpenOfficeProgramPath在两种环境中都相同? -
@Lance,是的,我有,这是一个在两种环境中设置不同的配置设置。我已经确认 OpenOfficeManager 对象已正确实例化,但是当它调用 start() 时,它永远不会回来......
-
好像连接有问题。日志文件说什么?此外,jodconverter 是否可以在该机器上工作 - 例如从命令行?
标签: coldfusion openoffice.org jodconverter