1

我一直在尝试将documents4j安排为windows服务,使用procrun进行RTF到PDF的转换,但它一直抛出以下错误:

com.documents4j.throwables.ConversionInputException: The sent input is invalid
    at com.documents4j.util.Reaction$ConversionInputExceptionBuilder.make(Reaction.java:159) ~[documents4j-client-standalone-0.3-SNAPSHOT-shaded.jar:na]
    at com.documents4j.util.Reaction$ExceptionalReaction.apply(Reaction.java:75) ~[documents4j-client-standalone-0.3-SNAPSHOT-shaded.jar:na]
    at com.documents4j.ws.ConverterNetworkProtocol$Status.resolve(ConverterNetworkProtocol.java:97) ~[documents4j-client-standalone-0.3-SNAPSHOT-shaded.jar:na]
    at com.documents4j.job.WebserviceRequestFutureWrapper.handle(WebserviceRequestFutureWrapper.java:48) ~[documents4j-client-standalone-0.3-SNAPSHOT-shaded.jar:na]
    at com.documents4j.job.WebserviceRequestFutureWrapper.get(WebserviceRequestFutureWrapper.java:38) ~[documents4j-client-standalone-0.3-SNAPSHOT-shaded.jar:na]
    at com.documents4j.job.WebserviceRequestFutureWrapper.get(WebserviceRequestFutureWrapper.java:13) ~[documents4j-client-standalone-0.3-SNAPSHOT-shaded.jar:na]
    at com.documents4j.job.AbstractFutureWrappingPriorityFuture.run(AbstractFutureWrappingPriorityFuture.java:78) ~[documents4j-client-standalone-0.3-SNAPSHOT-shaded.jar:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_31]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_31]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_31]

我为 procrun 创建了以下 bat 文件

@echo off
set SELF=%CD%
set SERVICE_NAME=PCNService
set SERVICE_URL=
set PR_INSTALL=%SELF%\prunsrv.exe
set PRMGR_INSTALL=%SELF%\prunmgr.exe
 
@REM Service Log Configuration
set PR_LOGPREFIX=%SERVICE_NAME%
set PR_LOGPATH=%SELF%\logs
set PR_STDOUTPUT=auto
set PR_STDERROR=auto
set PR_LOGLEVEL=Debug
 
@REM Path to Java Installation
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_05
set PR_JVM=%JAVA_HOME%\jre\bin\server\jvm.dll
set PR_CLASSPATH=%SELF%\documents4j-server-standalone-0.3-SNAPSHOT-shaded.jar
 
@REM JVM Configuration
set PR_JVMOPTIONS=
@REM Startup Configuration
set JETTY_START_CLASS=com.documents4j.standalone.StandaloneServer

set PR_STARTUP=auto
set PR_STARTMODE=java
set PR_STARTCLASS=%JETTY_START_CLASS%
set PR_STARTMETHOD=start
set PR_STARTPARAMS=http://localhost:9998
 
@REM Shutdown Configuration
set PR_STOPMODE=java
set PR_STOPCLASS=%JETTY_START_CLASS%
set PR_STOPMETHOD=stop
set PR_STOPPARAMS=

if "x%1x" == "xx" goto displayUsage
set SERVICE_CMD=%1
shift
if "x%1x" == "xx" goto checkServiceCmd
:checkServiceCmd
if /i %SERVICE_CMD% == install goto doInstall
if /i %SERVICE_CMD% == delete goto doDelete
if /i %SERVICE_CMD% == stop goto doStop
if /i %SERVICE_CMD% == start goto doStart
if /i %SERVICE_CMD% == monitor goto doMonitor
if /i %SERVICE_CMD% == run goto doRun
if /i %SERVICE_CMD% == console goto doConsole

echo Unknown parameter "%SERVICE_CMD%"
:displayUsage
echo.
echo Usage: service.bat install/start/stop/delete
goto end

:doInstall
rem Install the service
echo Installing the service '%SERVICE_NAME%' ...
%PR_INSTALL% //IS//%SERVICE_NAME% ^
  --DisplayName="%SERVICE_NAME%" ^
  --Install="%PR_INSTALL%" ^
  --Startup="%PR_STARTUP%" ^
  --LogPath="%PR_LOGPATH%" ^
  --LogPrefix="%PR_LOGPREFIX%" ^
  --LogLevel="%PR_LOGLEVEL%" ^
  --StdOutput="%PR_STDOUTPUT%" ^
  --StdError="%PR_STDERROR%" ^
  --JavaHome="%JAVA_HOME%" ^
  --Jvm="%PR_JVM%" ^
  --JvmMs="" ^
  --JvmMx="" ^
  --JvmSs="" ^
  --JvmOptions="%PR_JVMOPTIONS%" ^
  --Classpath="%PR_CLASSPATH%" ^
  --StartMode="%PR_STARTMODE%" ^
  --StartClass="%PR_STARTCLASS%" ^
  --StartMethod="%PR_STARTMETHOD%" ^
  --StartParams="%PR_STARTPARAMS%" ^
  --StopMode="%PR_STOPMODE%" ^
  --StopClass="%PR_STOPCLASS%" ^
  --StopMethod="%PR_STOPMETHOD%" ^
  --StopParams="%PR_STOPPARAMS%" ^
  --Type interactive
 
if not errorlevel 1 goto installed
echo Failed to install "%SERVICE_NAME%" service.  Refer to log in %PR_LOGPATH%
goto end
 
:doStart
rem Starting the service
echo Starting the service '%SERVICE_NAME%' ...
%PR_INSTALL% //ES//%SERVICE_NAME% 
if not errorlevel 1 goto started 
echo Failed to start "%SERVICE_NAME%" service.  Refer to log in %PR_LOGPATH%
goto end

:doStop
rem Stop the service
echo Stopping the service '%SERVICE_NAME%' ...
%PR_INSTALL% //SS//%SERVICE_NAME% 
if not errorlevel 1 goto stopped
echo Failed to stop "%SERVICE_NAME%" service.  Refer to log in %PR_LOGPATH%
goto end

:doDelete
rem Delete the service
echo Deleting the service '%SERVICE_NAME%' ...
%PR_INSTALL% //DS//%SERVICE_NAME% 
if not errorlevel 1 goto deleted
echo Failed to delete "%SERVICE_NAME%" service.  Refer to log in %PR_LOGPATH%
goto end

:doMonitor
rem Monitor the service
echo Monitoring the service '%SERVICE_NAME%' ...
echo Look for the service in the system tray. You can modify the properties in the GUI.
%PRMGR_INSTALL% //MR//%SERVICE_NAME%
goto end

:doRun
rem Run the service
echo Running the service '%SERVICE_NAME%' ...
%PR_INSTALL% //RS//%SERVICE_NAME%
goto end

:doEdit
rem Edit the service
echo Editing the service '%SERVICE_NAME%' ...
%PRMGR_INSTALL% //ES//%SERVICE_NAME%
goto end

:doConsole
rem Running the service as console application
%PR_INSTALL% //TS//%SERVICE_NAME%
goto end

:installed
echo The Service "%SERVICE_NAME%" has been installed
goto logging
goto end

:started
echo The Service "%SERVICE_NAME%" has been started 
goto logging
goto end
 
:deleted
echo The Service "%SERVICE_NAME%" has been deleted
goto end

:stopped
echo The Service "%SERVICE_NAME%" has been stopped
goto logging
goto end

:logging
echo Refer to log in %PR_LOGPATH%

:end
</code>

我能够成功地将 jar 安装为 Windows 服务并启动/停止它

此外,当类 com.documents4j.standalone.StandaloneServer 通过命令行执行时,转换会正确发生。

4

1 回答 1

2

您是否阅读过有关使用 Word 作为 Windows 服务运行documents4j 的信息?

当作为 Windows 服务与 MS Office 转换一起运行时,documents4j 可能会出现故障。请注意,MS Office 不正式支持在服务上下文中执行。当作为服务运行时,MS Office 始终使用 MS Window 的本地服务帐户启动,该帐户不配置桌面。但是,MS Office 需要一个桌面才能正常运行。如果没有这样的桌面配置,MS Office 将正确启动但无法读取任何输入文件。为了允许 MS Office 在服务上下文中运行,有两种可能的方法,其中第一种方法更推荐:

在 32 位系统上,创建文件夹 C:\Windows\System32\config\systemprofile\Desktop。在 64 位系统上,创建文件夹 C:\Windows\SysWOW64\config\systemprofile\Desktop。

更多信息可以在 MSDN 上找到。您可以操作 MS Window 的注册表,以便 MS Office 应用程序使用本地服务帐户以外的其他帐户运行。这种方法记录在 MSDN 上。请注意,这会破坏 MS Window 的沙盒模型,并对运行 MS Office 的机器造成额外的安全威胁。

于 2015-02-27T15:03:15.043 回答