原文地址:https://blog.csdn.net/weixin_38757817/article/details/109092774
為什么要使用pdf簽章
pdf在辦公過程中,做矢量文檔工具,使用比較廣范。
在文檔審批和發布過程中,也要求最后要pdf有效的簽名或者印章,以示文檔的重要性。
什么插件能實現pdf簽章功能
卓正軟件公司的pageOffice,專門實現辦公文檔的在線編輯,在辦公文檔編輯領域,提供的插件比較豐富。為做辦公系統的程序員節約了大量時間。最新的5.0版本,推出了pdf的在線簽章功能。
實現了pdf簽發的全流程處理。
spirngboot如果集成pageOffice並實現pdf簽章呢
本程序員實現了一個最簡單的pdf簽章的功能。
項目的結構如下圖:
1. pom文件
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>PDFseal</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- 添加Sqlite依賴(可選:如果不需要使用印章功能的話,不需要添加此依賴 )--> <dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.7.2</version> </dependency> <!-- 添加PageOffice依賴(必須) --> <dependency> <groupId>com.zhuozhengsoft</groupId> <artifactId>pageoffice</artifactId> <version>5.1.0.2</version> </dependency> </dependencies> </project>
2. appplication.properties 文檔的設置。
######################################################## ###PageOffice ######################################################## posyspath=d:/lic/ popassword=111111 ######################################################## ###THYMELEAF (ThymeleafAutoConfiguration) ######################################################## spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html #spring.thymeleaf.mode=HTML5 #spring.thymeleaf.encoding=UTF-8 # ;charset=<encoding> is added #spring.thymeleaf.content-type=text/html # set to false for hot refresh spring.thymeleaf.cache=false
3. 寫入pageOffice定義的bean
DemoController.java
package com.example.demo; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.util.ResourceUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import java.io.FileNotFoundException; /** * @author Administrator */ @RestController public class DemoController { @Value("${posyspath}") private String poSysPath; @Value("${popassword}") private String poPassWord; /** * 添加PageOffice的服務器端授權程序Servlet(必須) * @return */ @Bean public ServletRegistrationBean servletRegistrationBean() { com.zhuozhengsoft.pageoffice.poserver.Server poserver = new com.zhuozhengsoft.pageoffice.poserver.Server(); poserver.setSysPath(poSysPath);//設置PageOffice注冊成功后,license.lic文件存放的目錄 ServletRegistrationBean srb = new ServletRegistrationBean(poserver); srb.addUrlMappings("/poserver.zz"); srb.addUrlMappings("/posetup.exe"); srb.addUrlMappings("/pageoffice.js"); srb.addUrlMappings("/jquery.min.js"); srb.addUrlMappings("/pobstyle.css"); srb.addUrlMappings("/sealsetup.exe"); return srb;// } /** * 添加印章管理程序Servlet(可選) * @return */ @Bean public ServletRegistrationBean servletRegistrationBean2() { com.zhuozhengsoft.pageoffice.poserver.AdminSeal adminSeal = new com.zhuozhengsoft.pageoffice.poserver.AdminSeal(); adminSeal.setAdminPassword(poPassWord);//設置印章管理員admin的登錄密碼 adminSeal.setSysPath(poSysPath);//設置印章數據庫文件poseal.db存放的目錄 ServletRegistrationBean srb = new ServletRegistrationBean(adminSeal); srb.addUrlMappings("/adminseal.zz"); srb.addUrlMappings("/sealimage.zz"); srb.addUrlMappings("/loginseal.zz"); return srb;// } }
4開始寫后端業務代碼。
PDFInsertSealController.java
package com.example.demo; import com.zhuozhengsoft.pageoffice.FileSaver; import com.zhuozhengsoft.pageoffice.PDFCtrl; import org.springframework.util.ResourceUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileNotFoundException; import java.util.Map; @RestController public class PDFInsertSealController { @RequestMapping(value = "/index", method = RequestMethod.GET) public ModelAndView showIndex() { ModelAndView mv = new ModelAndView("Index"); return mv; } //蓋章功能 @RequestMapping(value = "/AddSeal", method = RequestMethod.GET) public ModelAndView showWord(HttpServletRequest request, Map<String, Object> map) { PDFCtrl pdfCtrl1 = new PDFCtrl(request); pdfCtrl1.setServerPage(request.getContextPath() + "/poserver.zz"); //此行必須 //設置保存頁面 pdfCtrl1.setSaveFilePage("/AddSeal/save"); // Create custom toolbar pdfCtrl1.addCustomToolButton("保存", "Save()", 1); pdfCtrl1.addCustomToolButton("加蓋印章", "InsertSeal()", 2); //此處路徑為服務器端文檔路徑 pdfCtrl1.webOpen("D:\\doc\\AddSeal\\test1.pdf"); map.put("pageoffice", pdfCtrl1.getHtmlCode("PDFCtrl1")); ModelAndView mv = new ModelAndView("/AddSeal/PDF1"); return mv; } //簽字功能 @RequestMapping(value = "AddSign", method = RequestMethod.GET) public ModelAndView showWord11(HttpServletRequest request, Map<String, Object> map) { PDFCtrl pdfCtrl1 = new PDFCtrl(request); pdfCtrl1.setServerPage(request.getContextPath() + "/poserver.zz"); //此行必須 //設置保存頁面 pdfCtrl1.setSaveFilePage("/AddSign/save"); // Create custom toolbar pdfCtrl1.addCustomToolButton("保存", "Save()", 1); pdfCtrl1.addCustomToolButton("簽字", "AddHandSign()", 3); //此處路徑為服務器端文檔路徑 pdfCtrl1.webOpen("D:\\doc\\AddSign\\test1.pdf"); map.put("pageoffice", pdfCtrl1.getHtmlCode("PDFCtrl1")); ModelAndView mv = new ModelAndView("/AddSign/PDF1"); return mv; } @RequestMapping("/AddSeal/save") public void save(HttpServletRequest request, HttpServletResponse response) { FileSaver fs = new FileSaver(request, response); //此處路徑為服務器端文檔路徑 fs.saveToFile( "D:/doc/AddSeal/" + fs.getFileName()); fs.close(); } @RequestMapping("/AddSign/save") public void save2(HttpServletRequest request, HttpServletResponse response) { FileSaver fs = new FileSaver(request, response); //此處路徑為服務器端文檔路徑 fs.saveToFile( "D:/doc/AddSign/" + fs.getFileName()); fs.close(); } }
最后
寫上三個對應的thymleleaf的模板
index.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"> <head> <title>Index</title> <script type="text/javascript" src="pageoffice.js" ></script> </head> <body> <h1 th:inline="text">PageOffice 集成效果演示</h1> <div style="width: 49%;float: left "> <a href="javascript:POBrowser.openWindowModeless('AddSeal','fullscreen=yes;');">打開pdf蓋章 </a><br> <a href="javascript:POBrowser.openWindowModeless('AddSign','fullscreen=yes;');">打開pdf簽字</a><br> </div> </body> </html>
templates\AddSeal\PDF1.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"> <head> </head> <body style="overflow:hidden"> <!--************** 卓正 PageOffice 客戶端代碼開始 ************************--> <script language="javascript" type="text/javascript"> function Save() { document.getElementById("PDFCtrl1").WebSave(); } function InsertSeal() { try { document.getElementById("PDFCtrl1").ZoomSeal.AddSeal();//如果使用ZoomSeal中的USBKEY方式蓋章,第一個參數不能為蓋章用戶登錄名,只能為null或者空字符串 } catch(e) {} } </script> <div style="height:850px;width:auto;" th:utext="${pageoffice}"> </div> </body> </html>
templates\AddSign\PDF1.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"> <head> </head> <body style="overflow:hidden"> <!--************** 卓正 PageOffice 客戶端代碼開始 ************************--> <script language="javascript" type="text/javascript"> function Save() { document.getElementById("PDFCtrl1").WebSave(); } function AddHandSign() { try { document.getElementById("PDFCtrl1").ZoomSeal.AddHandSign(); } catch(e) {} } </script> <div style="height:850px;width:auto;" th:utext="${pageoffice}"> </div> </body> </html>
代碼寫完后,配置環境
1電腦創建d:/lic/ 這個目錄,里面添加pageOffice自帶的數據庫。
2創建
目錄結構,每個目錄放入一個test1.pdf的pdf文檔。
3啟動服務
最終效果
index頁面打開效果
點 打開pdf蓋章
蓋章后的效果
簽字后的效果
git項目地址為
https://github.com/qingxue0606/PDFseal
需要的,數據庫文檔,和pdf文檔都在data目錄中。
有問題可訪問 http://www.zhuozhengsoft.com/