Pageoffice6 實現後臺批量轉PDF文檔

在實際項目開發中如果遇到批量動態生成PDF文檔的需求,只需參考後臺批量生成PDF文檔,目前網上也有一些針對此需求的方案,如果您想要了解這些方案的對比,請查看後臺生成單個Word文檔中的“方案對比”。

如果只是需要批量轉PDF文件,那麼也可以使用PageOffice提供的FileMaker組件來實現,與“後臺批量生成PDF文檔”不同的地方僅是:批量轉PDF文件不需要WordDocument對象動態填充數據的代碼。所以批量轉PDF文件也只需兩步即可實現:

如果只是需要批量轉PDF文件,那麼也可以使用PageOffice提供的FileMaker組件來實現,與“後臺批量生成PDF文檔”不同的地方僅是:批量轉PDF文件不需要WordDocument對象動態填充數據的代碼。所以批量轉PDF文件也只需兩步即可實現:

  1. 調用FileMakerCtrl對象的fillDocumentAsPDF方法實現Word轉PDF功能,比如Convert.jsp中調用了此代碼;
fmCtrl.fillDocumentAsPDF("doc01.doc", DocumentOpenType.Word, "doc01.pdf");
  1. 調用PageOffice提供的jsCallFileMaker函數,遞歸執行Convert.jsp實現批量轉PDF文件功能,比如執行下面的ConvertFiles(),遞歸調用ConvertFile函數,把ids數組中包含的所有Word文件轉爲pdf。
var ids = [1, 2, 3, 5]; //比如這是Word文件在數據庫中的id

function ConvertFiles() {
	ConvertFile(ids, 0); 
}

function ConvertFile(idArr, index) {
	CallFileMaker({
		url: "Convert.jsp?id="+idArr[index], //把指定id的word文件轉pdf
		success: function () {
			console.log("completed successfully.");
			index++;

			if(index < idArr.length){
				ConvertFile(idArr, index);
			} 
		},
		progress: function (pos) {
			console.log("running "+pos+"%");
		},
		error: function (msg) {
			console.log("error occurred: "+msg);
		}
	});
}

FileMakerCtrl 和 PageOfficeCtrl 的區別
FileMakerCtrl 本質上就是一個沒有界面的 PageOfficeCtrl,也是調用客戶端 Office 程序處理文件的,都可以實現對文檔進行動態填充、動態轉 PDF 等功能,唯一的區別就是 FileMakerCtrl 在線打開填充和轉換文檔的時候,客戶端頁面不打開顯示文檔內容,而 PageOfficeCtrl 會打開顯示文檔內容。

後端代碼

  1. 調用FileMakerCtrl對象實現Word轉pdf,比如Convert.jsp,代碼如下:
String id = request.getParameter("id").trim();
String docName = "doc0" + id + ".doc";
String pdfName = "doc0" + id + ".pdf";

FileMakerCtrl fmCtrl = new FileMakerCtrl(request);
fmCtrl.setSaveFilePage("SaveFile.jsp");
fmCtrl.fillDocumentAsPDF("doc/" + docName, DocumentOpenType.Word, pdfName);
  1. Word轉pdf後,在SaveFilePage屬性指向的地址接口中處理文件保存的後臺代碼,比如SaveFile.js的代碼如下:
FileSaver fs = new FileSaver(request, response);
fs.saveToFile(request.getSession().getServletContext().getRealPath("FileMakerConvertPDFs/doc/"+ fs.getFileName()));
fs.close();

前端代碼

調用PageOffice提供的jsCallFileMaker函數,遞歸執行Convert.jsp實現批量轉PDF文件功能的前端頁面代碼,如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <title></title>
	<style>
		table{
			border:solid 1px #ccc; 
			width: 600px;
			margin:20px;
		}
		th{
			border-bottom:
			solid 1px #ccc;
			text-align:left;
			padding: 5px;
		}
		td{
			padding: 5px;
		}
	</style>
	<style>
		.progressBarContainer {
		  width: 100%;
		  background-color: #eee;
		  border-radius: 5px;
		  padding: 3px;
		  box-shadow: 2px 2px 3px 3px #ccc inset;  
		}
		.progressBar {
		  height: 20px;
		  width: 0%;
		  background-color: #1A73E8;
		  border-radius: 5px;
		  text-align: center;
		  line-height: 20px; 
		  color: white;
		}
		#progressDiv{
			width:400px;
			margin: 10px auto;
			text-align: left;
			font-size:14px;
			border: solid 1px #1A73E8;
			padding:10px 20px;
			color: #1A73E8;
		}
		#errorMsg{
			color: red;
		}
	</style>
	<script type="text/javascript" src="../pageoffice.js"></script>
    <script type="text/javascript">
        var checkit = true;
        function selectall() {
            if (checkit) {
                var obj = document.all.check;
                for (var i = 0; i < obj.length; i++) {
                    obj[i].checked = true;
                    checkit = false;
                }
            } else {
                var obj = document.all.check;
                for (var i = 0; i < obj.length; i++) {
                    obj[i].checked = false;
                    checkit = true;
                }
            }
        }

		function ConvertFiles() {
			var ids = []; //存儲用戶勾選的文檔id
			var checkboxes = document.getElementsByName('check');
			
			for (var i = 0; i < checkboxes.length; i++) {  
				if (checkboxes[i].checked) { 
					ids.push(checkboxes[i].value);  
				}  
			}  
			
			if(0 == ids.length){
				alert('請至少選擇一個文檔');
				return;
			}
			
			document.getElementById("Button1").disabled = true;
			ConvertFile(ids, 0);
		}
		
		function ConvertFile(idArr, index) {
            CallFileMaker({
                url: "Convert.jsp?id="+idArr[index], //把指定id的word文件轉pdf
                success: function () {
                    setProgress1(100);
					index++;
					setProgress2(index, idArr.length);
	
					if(index < idArr.length){
						ConvertFile(idArr, index);
					} 
                },
                progress: function (pos) {
                    setProgress1(pos);
                },
                error: function (msg) {
					document.getElementById("errorMsg").innerHTML = "發生錯誤: <br /> " + msg;
                    console.log("error occurred: "+msg);
                }
            });
        }
		
		function setProgress1(percent) {
			var progressBar = document.getElementById("progressBar1");
			progressBar.style.width = percent + '%';
			progressBar.innerText = percent + '%';
		}
		
		function setProgress2(index, count) {
			var progressBar = document.getElementById("progressBar2");
			progressBar.style.width = Math.round(index/count*100) + '%';
			progressBar.innerText = index + '/' + count;
		}
    </script>
</head>
<body>
<div style="margin:100px" align="center">
	<h2>演示:批量轉PDF</h2>
	<table id="table1" >
		<tr >
			<th><input name="checkAll" type="checkbox" onclick="selectall()"/></td>
			<th>序號</td>
			<th>文件名</td>
			<th>操作</td>
		</tr>
		<tr>
			<td><input name="check" type="checkbox" value="1"/></td>
			<td>01</td>
			<td>PageOffice產品簡介</td>
			<td><a href="javascript:POBrowser.openWindow('Edit.jsp?id=1','width=1150px;height=800px;');">編輯</a></td>
		</tr>
		<tr>
			<td><input name="check" type="checkbox" value="2"/></td>
			<td>02</td>
			<td>PageOffice產品安裝步驟</td>
			<td><a href="javascript:POBrowser.openWindow('Edit.jsp?id=2','width=1150px;height=800px;');">編輯</a></td>
		</tr>
		<tr>
			<td><input name="check" type="checkbox" value="3"/></td>
			<td>03</td>
			<td>PageOffice產品應用領域</td>
			<td><a href="javascript:POBrowser.openWindow('Edit.jsp?id=3','width=1150px;height=800px;');">編輯</a></td>
		</tr>
		<tr>
			<td><input name="check" type="checkbox" value="4"/></td>
			<td>04</td>
			<td>PageOffice產品對環境的要求</td>
			<td><a href="javascript:POBrowser.openWindow('Edit.jsp?id=4','width=1150px;height=800px;');">編輯</a></td>
		</tr>
	</table>
	<input type="button" id="Button1" value="批量轉換PDF文檔" onclick="ConvertFiles()"/>
	<div id="progressDiv">
		單文件進度:
		<div class="progressBarContainer">
		  <div id="progressBar1" class="progressBar"></div>
		</div>
		整體進度:
		<div class="progressBarContainer">
		  <div id="progressBar2" class="progressBar"></div>
		</div>
		<div id="errorMsg"> </div>
	</div>
</div>
</body>
</html>

參考鏈接:批量轉PDF文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章