【问题标题】:Batch converting doc/docx to pdf using Javascript使用 Javascript 将 doc/docx 批量转换为 pdf
【发布时间】: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。我使用了 Adob​​e Acrobat 提供的(非免费)一个,但似乎有许多免费实用程序可以做同样的事情。
  • stackoverflow.com/questions/607669/… 有同样的问题吗? (C# 类似)
  • support.microsoft.com/kb/257757/en-us - Microsoft 关于自动化 Office 的说明(他们不推荐)。
  • @mlk,仅当自动化在服务器端完成时才会发出警告,此处并非如此(问题中未提及)。

标签: java javascript docx doc


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    Microsoft support 表示不要在无人看管的情况下使用办公室或服务器端。

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

    【讨论】:

      【解决方案3】:

      您可以使用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 上使用它的示例项目。

      【讨论】:

      • docx-wasm 不再可用。他们的网站已被撤下,不再颁发许可证。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多