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

问题描述 投票:0回答:3

我正在开发一个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进程。不是很干净,但它完成了它的工作。

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

java javascript docx doc
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上使用它的示例项目。


1
投票

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

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


-2
投票

Microsoft support说不要使用办公室无人服务的服务器端。

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

© www.soinside.com 2019 - 2024. All rights reserved.