麒麟v10、uos系统在线批量生成pdf文件

注意

本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。

 在实际项目开发中如果遇到批量动态生成PDF文档的需求,只需参考后台批量生成PDF文档,目前网上也有一些针对此需求的方案,如果您想要了解这些方案的对比,请查看后台生成单个Word文档中的“方案对比”。

如果只是需要批量转PDF文件,那么也可以使用PageOffice提供的FileMaker组件来实现,与“后台批量生成PDF文档”不同的地方仅是:批量转PDF文件不需要WordDocumentWriter对象动态填充数据的代码。所以批量转PDF文件也只需两步即可实现:

  1. 调用FileMakerCtrl对象的fillDocumentAsPDF方法实现Word转PDF功能,比如Convert.jsp中调用了此代码; fmCtrl.fillDocumentAsPDF("doc01.doc", DocumentOpenType.Word, "doc01.pdf");
  2. 调用PageOffice提供的jsCallFileMaker函数,递归执行Convert.jsp实现批量转PDF文件功能,比如执行下面的ConvertFiles(),递归调用ConvertFile函数,把ids数组中包含的所有Word文件转为pdf。
    1. var ids = [1, 2, 3, 5]; //比如这是Word文件在数据库中的id
    2. function ConvertFiles() {
    3. ConvertFile(ids, 0);
    4. }
    5. function ConvertFile(idArr, index) {
    6. filemakerctrl.SaveFilePage = "/FileMakerConvertPDFs/SaveFile.jsp?id=" + idArr[index];
    7. filemakerctrl.CallFileMaker({
    8. url: "/FileMakerConvertPDFs/Convert.jsp?id="+idArr[index], //把指定id的word文件转pdf
    9. success: function (customSaveResult) {
    10. console.log("completed successfully.");
    11. index++;
    12. if(index < idArr.length){
    13. ConvertFile(idArr, index);
    14. }
    15. },
    16. progress: function (pos) {
    17. console.log("running "+pos+"%");
    18. },
    19. error: function (msg) {
    20. console.log("error occurred: "+msg);
    21. }
    22. });
    23. }

    FileMakerCtrl 和 PageOfficeCtrl 的区别

    FileMakerCtrl 本质上就是一个没有界面的 PageOfficeCtrl,也是调用客户端 Office 程序处理文件的,都可以实现对文档进行动态填充、动态转 PDF 等功能,唯一的区别就是 FileMakerCtrl 在线打开填充和转换文档的时候,客户端页面不打开显示文档内容,而 PageOfficeCtrl 会打开显示文档内容。

后端代码

  1. 调用FileMakerCtrl对象实现Word转pdf,比如后端/convert方法的代码如下:
    1. String id = request.getParameter("id").trim();
    2. String docName = "doc0" + id + ".doc";
    3. String pdfName = "doc0" + id + ".pdf";
    4. FileMakerCtrl fmCtrl = new FileMakerCtrl(request);
    5. fmCtrl.fillDocumentAsPDF("doc/" + docName, DocumentOpenType.Word, pdfName);
    6. out.print(fmCtrl.getHtml());
  2. Word转pdf后,在SaveFilePage属性指向的地址接口中处理文件保存的后台代码如下:
    1. FileSaver fs = new FileSaver(request, response);
    2. fs.saveToFile(request.getSession().getServletContext().getRealPath("FileMakerConvertPDFs/doc/"+ fs.getFileName()));
    3. fs.setCustomSaveResult("{\"msg\":\"ok\"}");//用于给前端页面返回数据
    4. fs.close();

前端代码

调用PageOffice提供的jsCallFileMaker函数,递归执行/convert实现批量转PDF文件功能的前端页面代码,如下:

  1. <script setup>
  2. import request from '@/utils/request';
  3. import { ref, onMounted } from 'vue'
  4. import { filemakerctrl, POBrowser } from 'js-pageoffice'
  5. const titleText = ref('');
  6. const checked = ref(true);
  7. const buttonDisabled = ref(false);
  8. const progressBar1 = ref(null);
  9. const progressBar2 = ref(null);
  10. onMounted(async () => {
  11. try {
  12. const response = await request({
  13. url: '/index',
  14. method: 'get',
  15. });
  16. titleText.value = response;
  17. } catch (error) {
  18. console.error('Failed to fetch title:', error);
  19. }
  20. })
  21. function selectall() {
  22. if (checked.value) {
  23. let obj = document.all.check;
  24. for (let i = 0; i < obj.length; i++) {
  25. obj[i].checked = true;
  26. checked.value = false;
  27. }
  28. } else {
  29. let obj = document.all.check;
  30. for (let i = 0; i < obj.length; i++) {
  31. obj[i].checked = false;
  32. checked.value = true;
  33. }
  34. }
  35. }
  36. function ConvertFiles() {
  37. let ids = [];
  38. let checkboxes = document.getElementsByName("check");
  39. for (let i = 0; i < checkboxes.length; i++) {
  40. if (checkboxes[i].checked) {
  41. ids.push(checkboxes[i].value);
  42. }
  43. }
  44. if (0 == ids.length) {
  45. alert("请至少选择一个文档");
  46. return;
  47. }
  48. buttonDisabled.value = true;
  49. ConvertFile(ids, 0);
  50. }
  51. function ConvertFile(idArr, index) {
  52. // 设置用于保存文件的服务器端controller地址,该地址需从"/"开始,指向服务器端根目录
  53. /** 如果想要给SaveFilePage传递多个参数,建议使用new URLSearchParams方式,例如:
  54. * let saveFileUrl = "/FileMakerConvertPDFs/save";
  55. * let paramValue = new URLSearchParams({id:1,name:"张三"});
  56. * filemakerctrl.SaveFilePage = `${saveFileUrl}?${paramValue.toString()}`;
  57. */
  58. filemakerctrl.SaveFilePage = "/FileMakerConvertPDFs/save?id=" + idArr[index];
  59. filemakerctrl.CallFileMaker({
  60. // url:指向服务器端FileMakerCtrl打开文件的controller地址,该地址需从"/"开始,指向服务器端根目录
  61. url: "/FileMakerConvertPDFs/convert?id=" + idArr[index],
  62. success: (res) => {//res:获取服务器端fs.setCustomSaveResult设置的保存结果
  63. console.log(res);
  64. console.log("completed successfully.");
  65. setProgress1(100);
  66. index++;
  67. setProgress2(index, idArr.length);
  68. if (index < idArr.length) {
  69. ConvertFile(idArr, index);
  70. }
  71. },
  72. progress: (pos) => {
  73. console.log("running " + pos + "%");
  74. setProgress1(pos);
  75. },
  76. error: (msg) => {
  77. console.log("error occurred: " + msg);
  78. },
  79. });
  80. }
  81. function setProgress1(percent) {
  82. progressBar1.value.style.width = percent + "%";
  83. progressBar1.value.innerText = percent + "%";
  84. }
  85. function setProgress2(index, count) {
  86. progressBar2.value.style.width = Math.round((index / count) * 100) + "%";
  87. progressBar2.value.innerText = index + "/" + count;
  88. }
  89. </script>
  90. <template>
  91. <div class="Word">
  92. <div style="margin: 100px" align="center">
  93. <h2>演示:批量转PDF</h2>
  94. <div style="width: 600px; margin: 0 auto; font-size: 14px">
  95. <p style="text-align: left">
  96. 操作说明:<br />
  97. 1. 勾选下面的文件;<br />
  98. 2. 点击“批量转换PDF文档”按钮;<br />
  99. 3.生成完毕后,即可在“FileMakerConvertPDFs/doc”目录下看到批量生成的PDF文件。<br />
  100. </p>
  101. </div>
  102. <h3>文件列表</h3>
  103. <table id="table1">
  104. <tr>
  105. <th>
  106. <input name="checkAll" type="checkbox" @click="selectall()" />
  107. </th>
  108. <th>序号</th>
  109. <th>文件名</th>
  110. </tr>
  111. <tr>
  112. <td><input name="check" type="checkbox" value="1" /></td>
  113. <td>01</td>
  114. <td>PageOffice产品简介</td>
  115. </tr>
  116. <tr>
  117. <td><input name="check" type="checkbox" value="2" /></td>
  118. <td>02</td>
  119. <td>PageOffice产品安装步骤</td>
  120. </tr>
  121. <tr>
  122. <td><input name="check" type="checkbox" value="3" /></td>
  123. <td>03</td>
  124. <td>PageOffice产品应用领域</td>
  125. </tr>
  126. <tr>
  127. <td><input name="check" type="checkbox" value="4" /></td>
  128. <td>04</td>
  129. <td>PageOffice产品对环境的要求</td>
  130. </tr>
  131. </table>
  132. <input type="button" id="Button1" :disabled="buttonDisabled" value="批量转换PDF文档" @click="ConvertFiles()" />
  133. <div id="progressDiv">
  134. 单文件进度:
  135. <div class="progressBarContainer">
  136. <div id="progressBar1" ref="progressBar1" class="progressBar"></div>
  137. </div>
  138. 整体进度:
  139. <div class="progressBarContainer">
  140. <div id="progressBar2" ref="progressBar2" class="progressBar"></div>
  141. </div>
  142. </div>
  143. </div>
  144. </div>
  145. </template>
  146. <style scoped>
  147. h3 {
  148. display: block;
  149. font-size: 1.17em;
  150. margin-block-start: 1em;
  151. margin-block-end: 1em;
  152. margin-inline-start: 0px;
  153. margin-inline-end: 0px;
  154. font-weight: bold;
  155. }
  156. h2 {
  157. display: block;
  158. font-size: 1.5em;
  159. margin-block-start: 0.83em;
  160. margin-block-end: 0.83em;
  161. margin-inline-start: 0px;
  162. margin-inline-end: 0px;
  163. font-weight: bold;
  164. }
  165. table {
  166. border: solid 1px #ccc;
  167. width: 600px;
  168. margin: 20px;
  169. }
  170. th {
  171. border-bottom: solid 1px #ccc;
  172. text-align: left;
  173. padding: 5px;
  174. }
  175. td {
  176. padding: 5px;
  177. }
  178. .progressBarContainer {
  179. width: 100%;
  180. background-color: #eee;
  181. border-radius: 5px;
  182. padding: 3px;
  183. box-shadow: 2px 2px 3px 3px #ccc inset;
  184. }
  185. .progressBar {
  186. height: 20px;
  187. width: 0%;
  188. background-color: #1a73e8;
  189. border-radius: 5px;
  190. text-align: center;
  191. line-height: 20px;
  192. color: white;
  193. }
  194. #progressDiv {
  195. width: 400px;
  196. margin: 10px auto;
  197. text-align: left;
  198. font-size: 14px;
  199. border: solid 1px #1a73e8;
  200. padding: 10px 20px;
  201. color: #1a73e8;
  202. }
  203. </style>

 参考链接:批量转PDF文件 | PageOffice 开发者中心

 

posted @ 2025-07-03 14:12  爱吃苹果皮  阅读(67)  评论(0)    收藏  举报