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

使用Javascript将doc/docx批量转换为pdf,java,javascript,docx,doc,Java,Javascript,Docx,Doc,我正在开发一个Java程序,通过编程将.doc和.docx文件转换为pdf。我已经测试了几种将.doc和.docx文件转换为pdf的不同方法,例如使用几个开源Java库,遗憾的是这些库经常会弄乱文档中的布局 我偶然发现了一个javascript脚本,它使用底层的Microsoft Word实例打开文件并将其保存为PDF格式(位于:): 这个javascript脚本是从我的Java程序中为每个文档同步调用的 在小范围内,这似乎很有效,但在处理大量文档(如数千个文档)时,我遇到了几个问题: 有时,

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

我偶然发现了一个javascript脚本,它使用底层的Microsoft Word实例打开文件并将其保存为PDF格式(位于:):

这个javascript脚本是从我的Java程序中为每个文档同步调用的

在小范围内,这似乎很有效,但在处理大量文档(如数千个文档)时,我遇到了几个问题:

  • 有时,一个单词进程会挂起在“另存为”提示符处,如果发生这种情况,则需要用户干预才能继续。在任何用户交互之前,该过程都会被阻塞
  • 有时单词进程会挂在“书签”提示符处。该过程也会被阻止,直到任何用户干预通过提示
我正在寻找最好/最干净的方法,通过给这些单词进程一个截止日期或其他什么来更好地控制它们。比如给他们5秒钟的时间打开Word文档并将其保存为PDF,5秒钟后,如果仍处于活动状态,该进程将被终止

我曾经处理过类似的问题,解决方案包括一个“kill word processs batch script”,用于杀死程序结束后卡住的任何word进程。不是很干净,但它完成了它的工作


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

我设法避开了与Microsoft Word中的进程在提示时被卡住有关的问题。在我的最终解决方案中,我修改了Java代码,使其在单独的线程中启动Javascript脚本。然后,我的主线程将休眠几秒钟,然后检查另一个线程

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

说不要在无人值守的情况下使用office服务器端

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

您可以使用serverless(例如AWS Lambda)并行执行转换。Lambda负责并发性。docx wasm是独立的(即不需要运行Microsoft Word)。Freemium模型

编辑2019年4月


是一个在Lambda上使用它的示例项目。

这是javascript或更糟的,不是Java。除非您试图学习该技术,否则只需安装pdf打印机,并将文档“打印”为pdf。我使用了AdobeAcrobat提供的(非免费)工具,但似乎有很多免费工具可以做同样的事情。是否也遇到了同样的问题?(C#相似)-微软公司注意到了Office自动化(他们不建议这样做)。@mlk,只有在服务器端完成自动化时才会发出警告,而这里没有这种情况(问题中没有提到)。docx wasm不再可用。他们的网站已被拆除,不再发放许可证。
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();
    }
}