我正在开发一个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流程。就像给他们5秒钟打开Word文档并将其保存为PDF一样,5秒后,如果仍然有效,该过程将被终止。
我已经处理了过去类似的事情,其中的解决方案包括一个'kill word processes batch script'来杀死程序结束后卡住的任何WORD进程。不是很干净,但它确实起了作用。
任何经验或想法都将不胜感激!
答案 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。