2017-11-25 13 views
-1

DOCXファイルをPDFファイルに変換しようとしましたが、DOCXをPDFファイルに完全に変換するvbスクリプトコードが見つかりました。コードはjavaを介して実行することができます。Apache TomcatにデプロイされたJavaコードからコマンドを実行

ローカルマシンでコードを実行するとファイルが生成されますが、サーバーにアプリケーションをデプロイすると、コードはエラーなしで実行されますが、ファイルは生成されません。

javaからコマンドを実行する権限が必要ですか?

Serverオペレーティングシステム:のWindows Server 2012 R2の標準

アプリケーションサーバ:Apache Tomcatの7.0.75

コード: 1)Javaの

public static void generatePDF() { 
    try { 

     File file = new File("C:\\Docx_To_Pdf_Converter\\errorLog.txt"); 
     PrintStream printStreamToFile = new PrintStream(file); 
     System.setOut(printStreamToFile); 


     String docToPdf = "C:\\Docx_To_Pdf_Converter\\doc2pdf.bat"; 

     File docPath = new File("C:\\Docx_To_Pdf_Converter\\Letter1.docx"); 

     File pdfPath = new File("C:\\Docx_To_Pdf_Converter\\LetterPDF.pdf"); 

     String command = String.format("%s %s %s", docToPdf, docPath, pdfPath); 

     Process process = Runtime.getRuntime().exec(command); 

     // The next line is optional and will force the current Java 
     //thread to block until the script has finished its execution. 

     process.waitFor(); 
    } catch (IOException e) {  
     e.printStackTrace(); 
    } catch (InterruptedException e) {    
     e.printStackTrace(); 
    } 

} 

以下は詳細です

と.batファイルコード:

@Echo off 
pushd %~dp0 
cscript C:\Docx_To_Pdf_Converter\doc2pdf.vbs %1 %2 

実際に私達があなたの展開サーバーへのアクセス権を持っていないとして、あなたに100%の保証答えを与えることは不可能であるが、ここで私が考えるものだPDF

Const wdFormatPDF = 17 ' PDF format. 
Const wdFormatXPS = 18 ' XPS format. 
Const WdDoNotSaveChanges = 0 

Dim arguments 
Set arguments = WScript.Arguments 


Function CheckUserArguments() 
If arguments.Unnamed.Count < 1 Or arguments.Unnamed.Count > 2 Then 
WScript.Echo "Use:" 
WScript.Echo "<script> input.doc" 
WScript.Echo "<script> input.doc output.pdf" 
WScript.Quit 1 
End If 
End Function 

// Transforms a doc to a pdf 
Function DocToPdf(docInputFile, pdfOutputFile) 

Dim fileSystemObject 
Dim wordApplication 
Dim wordDocument 
Dim wordDocuments 
Dim baseFolder 

Set fileSystemObject = CreateObject("Scripting.FileSystemObject") 
Set wordApplication = CreateObject("Word.Application") 
Set wordDocuments = wordApplication.Documents 
docInputFile = fileSystemObject.GetAbsolutePathName(docInputFile) 
baseFolder = fileSystemObject.GetParentFolderName(docInputFile) 
If Len(pdfOutputFile) = 0 Then 
pdfOutputFile = fileSystemObject.GetBaseName(docInputFile) + ".pdf" 

End If 

If Len(fileSystemObject.GetParentFolderName(pdfOutputFile)) = 0 Then 
pdfOutputFile = baseFolder + "\" + pdfOutputFile 

End If 
//' Disable any potential macros of the word document. 
wordApplication.WordBasic.DisableAutoMacros 
// 'from below line the code does not executes 
Set wordDocument = wordDocuments.Open(docInputFile) 
wordDocument.SaveAs pdfOutputFile, wdFormatPDF 
wordDocument.Close WdDoNotSaveChanges 
wordApplication.Quit WdDoNotSaveChanges 

Set wordApplication = Nothing 
Set fileSystemObject = Nothing 
End Function 
// ' Execute script 
Call CheckUserArguments() 
If arguments.Unnamed.Count = 2 Then 
Call DocToPdf(arguments.Unnamed.Item(0), arguments.Unnamed.Item(1)) 
Else 
Call DocToPdf(arguments.Unnamed.Item(0), "") 
End If 

Set arguments = Nothing 
+2

サーバーのオペレーティングシステムとは何ですか?コンバータはインストールされていますか?それは同じディレクトリにありますか?あなたの質問にはたくさんの情報がありません。それがなければ誰もあなたを助けません。このサイトの使い方を知るには、[help]にアクセスして[ask]を読んでください。今あなたを助けるように頼まれている人の立場に立つようにしてください。あなたが手助けするためにどのような情報を見たいでしょうか?また、あなたのコードが十分に表示されていない...例外がスローされたらどうなりますか?あなたはそれをキャッチしますか? –

+0

こんにちはジム、短い説明のために申し訳ありません、私は自分のコードを更新しました。 –

+0

@JimGarrison私は、必要に応じて詳細、まだ更新や提案、私の質問を編集した否定的な投票やそれ以上の情報が必要ですか?私に教えてください....ありがとう。 –

答えて

0

にdocxファイルを変換するVBScriptコードは、そこで起こっている。

何らかの理由で.batファイルが見つからないか実行できない場合は、JavaコードにIOExceptionが表示されます。あなたが例外を取得しなかったので、明らかに.batファイルが見つけられて実行されました。

ただし、にありますが、.batファイルは期待どおり実行されていません。 cscript.exeが存在しないか、または.vbsファイルがありません。あなたのコードが書かれている方法、あなたはこれを知らないでしょう。表示されるのは、waitfor()メソッドからのゼロ以外の状態の戻り値で、確認するのは面倒ではありません。したがって、実際にはが何が起こったのか分かりません。これはあなたに.batファイルを実行しようとする試みからの戻り状況を教えてくれます

int rc = process.waitFor(); 
System.out.printf("Process returned %d\n", rc); 

非常に最低でも、あなたはにwaitfor()メソッド呼び出しを変更する必要があります。それがゼロでないなら、あなたは問題があり、99.999%はこれが非ゼロであると確信しています。これをトラブルシューティングするには、コマンドの出力をキャプチャする必要があります。上記NOTE

Process proc = Runtime.getRuntime().exec(command); 
    BufferedReader procOutput = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
    String line; 
    while((line = procOutput.readLine()) != null) 
    { 
     System.out.println(line); 
     // Or whatever you need to do to in your environment, such 
     // as log the output or examine it to ensure the script did 
     // what you want 
    } 
    int rc = proc.waitFor(); 
    System.out.printf("Process returned %d\n", rc); 

それは一例に過ぎず、生産レベルのコードではありません。(それはあなた次第ですがないエラー処理のように)次の例では非常に単純化されたですAPIの使用方法について説明します。これは、外部コマンドがリダイレクト入力を必要としない場合にのみ機能します。入力が必要な場合は、デッドロックを防ぐために入出力を別々のスレッドで処理する必要があります。

また、ProcessBuilderを使用することを検討する必要があります。柔軟性が高いからです。たとえば、プロセスの出力をリダイレクトして、おそらく実装する必要のあるログファイルに追加することができます。

+0

戻り値が0であることを確認したことをお勧めしましたが、私はvbScriptコードも更新して、コードがスキップされた場所からコメントを追加しました。しかし、dos cmd promtやjavaを使ってコードを実行するとファイルが生成されますが、WebアプリケーションとしてApache Tomcatを使ってサーバー上でアプリケーションを実行すると、これは起こりません。 Tomcatをサーバーにインストールする際には何の許可もありませんか?私に教えてください..あなたのおかげでありがとう –

関連する問題