2013-01-07 201 views
1

我正在研究一个Java程序,它以编程方式将.doc和.docx文件转换为pdf。我已经测试了几种不同的方法来将.doc和.docx文件转换为pdf格式,例如使用多个开源Java库,但遗憾的是这些库经常会弄乱文档中的布局。将doc/docx批量转换为使用Javascript的pdf

我在一个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过程,给他们一个最后期限或什么。就像给他们5秒打开Word文档并将其保存为PDF,5秒钟后该进程将被杀死,如果仍然有效。

我已经处理了一些与过去类似的事情,其解决方案包括“杀死字处理批处理脚本”,以杀死在程序结束后卡住的任何WORD进程。不是很干净,但它的工作。

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

+0

这是JavaScript或更糟,而不是Java。 – Adder

+1

除非您尝试学习这项技术,否则只需安装pdf打印机,并将文档“打印”为pdf。我使用了Adobe Acrobat中的(非免费的),但似乎有许多免费的实用程序可用于执行相同的操作。 – Gus

+0

是否http://stackoverflow.com/questions/607669/how-do-i-convert-word-files-to-pdf-programmatically遭受同样的问题? (类似C#) –

回答

1

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

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

-1

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

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