【发布时间】:2012-12-21 10:03:14
【问题描述】:
我正在开发一个以编程方式将 .doc 和 .docx 文件转换为 pdf 的 Java 程序。我已经测试了几种将 .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 秒钟后如果仍然处于活动状态,该进程将被终止。
我过去处理过类似的事情,解决方案包括“杀死单词进程批处理脚本”,以杀死在程序结束后卡住的任何 WORD 进程。不是很干净,但它完成了它的工作。
任何经验或想法将不胜感激!
【问题讨论】:
-
那是javascript或更糟,不是Java。
-
除非您想学习这项技术,否则只需安装 pdf 打印机,然后将文档“打印”成 pdf。我使用了 Adobe Acrobat 提供的(非免费)一个,但似乎有许多免费实用程序可以做同样的事情。
-
stackoverflow.com/questions/607669/… 有同样的问题吗? (C# 类似)
-
support.microsoft.com/kb/257757/en-us - Microsoft 关于自动化 Office 的说明(他们不推荐)。
-
@mlk,仅当自动化在服务器端完成时才会发出警告,此处并非如此(问题中未提及)。
标签: java javascript docx doc