使用Javascript将doc / docx批量转换为pdf

时间:2013-01-07 16:26:28

标签: java javascript docx doc

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

我偶然发现了一个javascript脚本,使用底层的Microsoft Word实例打开文件并将其另存为PDF(位于: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秒后,如果仍然有效,该过程将被终止。

我已经处理了过去类似的事情,其中​​的解决方案包括一个'kill word processes batch script'来杀死程序结束后卡住的任何WORD进程。不是很干净,但它确实起了作用。

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

3 个答案:

答案 0 :(得分: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上使用它的示例项目。

答案 1 :(得分:1)

我成功解决了与Microsoft Word中的提示陷入困境相关的问题。在我的最终解决方案中,我更改了我的Java代码,使其在单独的Thread中启动Javascript脚本。然后我的主线程将睡眠几秒钟,然后检查另一个线程。

另一个Thread保留对它用于运行Javascript脚本的Process实例的引用。然后,主线程将检查该进程的exitValue,如果脚本停留在Microsoft Word提示符下,则会抛出IllegalThreadStateException。然后我会通过终止进程并清理Microsoft Word留下的任何临时文件来处理异常。

答案 2 :(得分:-2)

Microsoft support表示不要在无人值守的办公室使用服务器端。

如果您需要简单的转换,LibreOffice有一个命令行选项-convert-to。