0

我正在开发一个以编程方式将 .doc 和 .docx 文件转换为 pdf 的 Java 程序。我已经测试了几种将 .doc 和 .docx 文件转换为 pdf 的不同方法,例如使用几个开源 Java 库,遗憾的是这些库经常会弄乱文档中的布局。

我偶然发现了一个使用底层 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 程序中为每个文档同步调用的。

在小范围内,这似乎很有效,但是在处理数千个文件时,我遇到了几个问题:

  • 有时一个 Word 进程会在“另存为”提示下挂起,如果发生这种情况,则需要用户干预才能继续。在任何用户交互之前,该过程都会阻塞。
  • 有时 Word 进程会挂在“书签”提示符下。在任何用户干预以通过提示之前,该过程也被阻止。

我正在寻找最好/最干净的方法,通过给它们一个截止日期或其他东西来更好地控制这些 Word 进程。就像给他们 5 秒钟打开 Word 文档并将其保存为 PDF 一样,5 秒钟后如果仍然处于活动状态,该进程将被终止。

我过去处理过类似的事情,解决方案包括“杀死单词进程批处理脚本”来杀死程序结束后卡住的任何 WORD 进程。不是很干净,但它完成了它的工作。

任何经验或想法将不胜感激!

4

3 回答 3

2

您可以使用https://www.npmjs.com/package/@nativedocuments/docx-wasm无服务器(例如 AWS Lambda)并行执行转换。Lambda 负责并发处理。docx-wasm 是独立的(即无需运行 Microsoft Word)。免费增值模式。

编辑 2019 年 4 月

https://github.com/NativeDocuments/docx-to-pdf-on-AWS-Lambda是一个在 Lambda 上使用它的示例项目。

于 2019-01-22T21:56:31.007 回答
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 回答