0

プログラムで .doc ファイルと .docx ファイルを pdf に変換する Java プログラムに取り組んでいます。いくつかのオープン ソース Java ライブラリを使用するなど、.doc ファイルと .docx ファイルを pdf に変換するいくつかの異なる方法をテストしましたが、悲しいことに、これらのライブラリはドキュメントのレイアウトを台無しにすることがよくあります。

基盤となる Microsoft Word インスタンスを使用してファイルを開き、PDF として保存する JavaScript スクリプトを見つけました ( https://superuser.com/questions/17612/batch-convert-word-documents-toにあります)。 -pdfs-free/28303#28303 ):

var fso = new ActiveXObject("Scripting.FileSystemObject");
var docPath = WScript.Arguments(0);
var pdfPath = WScript.Arguments(1);
docPath = fso.GetAbsolutePathName(docPath);
var objWord = null;
try{
    WScript.Echo("Saving '" + docPath + "' as '" + pdfPath + "'...");
    objWord = new ActiveXObject("Word.Application");
    objWord.Visible = false;
    var objDoc = objWord.Documents.Open(docPath);
    var wdFormatPdf = 17;
    objDoc.SaveAs(pdfPath, wdFormatPdf);
    objDoc.Close();
    WScript.Echo("The CV was succesfully converted.");
} catch(err){
    WScript.Echo("An error occured: " + err.message);
}finally{
    if (objWord != null){
        objWord.Quit();
    }
}

この JavaScript スクリプトは、ドキュメントごとに Java プログラムから同期的に呼び出されます。

小規模ではこれはうまくいくように見えますが、数千のような大量のドキュメントを扱うとき、いくつかの問題に遭遇しました:

  • 1 つの Word プロセスが「名前を付けて保存」プロンプトでハングすることがありました。これが発生した場合、続行するにはユーザーの介入が必要でした。ユーザーの操作が行われるまで、プロセスはブロックされます。
  • Word プロセスが「ブックマーク」プロンプトでハングすることがありました。このプロセスは、ユーザーが介入してプロンプトを通過するまでブロックされます。

締め切りなどを与えることで、これらのWordプロセスをより適切に制御するための最良/最もクリーンな方法を探しています。Word 文書を開いて PDF として保存するのに 5 秒を与えるのと同様に、5 秒後にプロセスがまだアクティブな場合は強制終了されます。

私は過去に似たようなことを扱ったことがあり、その解決策には、プログラムの終了後にスタックした WORD プロセスを強制終了するための「kill word processes batch script」が含まれていました。あまりきれいではありませんが、それはその仕事をしました。

どんな経験やアイデアでも大歓迎です!

4

3 に答える 3

1

Microsoft Word のプロンプトでプロセスが停止することに関連する問題を回避することができました。私の最終的な解決策では、Java コードを変更して、Javascript スクリプトを別のスレッドで開始するようにしました。私のメインスレッドは数秒間スリープしてから、他のスレッドをチェックします。

もう一方のスレッドは、Javascript スクリプトを実行するために使用する Process インスタンスへの参照を保持します。その後、メイン スレッドはそのプロセスの exitValue をチェックします。スクリプトが Microsoft Word プロンプトで停止すると、IllegalThreadStateException がスローされます。次に、プロセスを強制終了し、Microsoft Word によって残された一時ファイルをクリーンアップすることで、例外を処理します。

于 2013-01-09T07:30:41.300 に答える
-2

マイクロソフトのサポートによると、サーバー側でもオフィスを無人で使用しないでください。

簡単な変換が必要な場合、LibreOffice にはコマンドライン オプション -convert-to があります。

于 2014-09-26T13:04:44.017 に答える