[英]Batch converting doc/docx to pdf using Javascript
我正在研究一個Java程序,該程序以編程方式將.doc-和.docx文件轉換為pdf。 我已經測試了幾種將.doc-和.docx-files轉換為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();
}
}
從我的Java程序中為每個文檔同步調用此javascript-script。
在較小的范圍內,這似乎很好用,但是在處理許多文檔(例如數千個)時,我遇到了兩個問題:
我正在尋找最好/最干凈的方法,通過給它們一個截止日期或其他東西來更好地控制這些Word流程。 就像給他們5秒鍾的時間來打開Word文檔並將其另存為PDF一樣,如果5秒鍾后該過程仍然處於活動狀態,則該過程將被終止。
我過去處理過類似的東西,針對該問題的解決方案包括“殺死字進程批處理腳本”,以殺死程序結束后卡住的所有WORD進程。 不是很干凈,但是它確實完成了工作。
任何經驗或想法,將不勝感激!
您可以使用https://www.npmjs.com/package/@nativedocuments/docx-wasmless serverless(例如AWS Lambda)並行執行轉換。 Lambda負責並發。 docx-wasm是獨立的(即無需運行Microsoft Word)。 免費增值模式。
編輯2019年4月
https://github.com/NativeDocuments/docx-to-pdf-on-AWS-Lambda是在Lambda上使用它的示例項目。
我設法解決了與該過程卡在Microsoft Word提示中有關的問題。 在最終的解決方案中,我更改了Java代碼,使其在單獨的線程中啟動Javascript腳本。 然后,我的主線程將休眠幾秒鍾,然后檢查另一個線程。
另一個線程保留了用於運行Javascript腳本的Process實例的引用。 然后,如果腳本被卡在Microsoft Word提示符下,則主線程將檢查該進程的exitValue,將引發IllegalThreadStateException。 然后,我將通過終止進程並清理Microsoft Word留下的任何臨時文件來處理異常。
微軟支持說不要在服務器端無人看管的情況下使用Office。
如果需要簡單的轉換,LibreOffice有一個命令行選項-convert-to。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.