写在前面:本文主要为了实现能对pdf文件进行在线签名、盖章功能。采用的技术是pageoffice。说简单吧他坑点挺多的,说难吧 他代码量确实不多。本文总结了一下我自己遇到的问题以及解决方式。
注:实现pdf签名、签章的前提是pageoffice版本必须为 5.0以上
本文案例源码:源码地址
项目结构
真的没几个文件
1、添加依赖
<!-- 添加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.2.0.12</version>
</dependency>
<!--此处前端模板用的thymeleaf 可自行选择 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、注册bean(直接复制即可)
package com.zks.pageoffice.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RestController;
/**
* @Package: com.zks.pageoffice
* @ClassName: DemoController
* @Author: ZhouKaiShun
* @CreateTime: 2021/9/10 10:18
* @Description:
*/
@Component
public class RegistrationBean {
@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();
//设置PageOffice注册成功后,license.lic文件存放的目录
poserver.setSysPath(poSysPath);
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();
//设置印章管理员admin的登录密码
adminSeal.setAdminPassword(poPassWord);
//设置印章数据库文件poseal.db存放的目录
adminSeal.setSysPath(poSysPath);
ServletRegistrationBean srb = new ServletRegistrationBean(adminSeal);
srb.addUrlMappings("/adminseal.zz");
srb.addUrlMappings("/sealimage.zz");
srb.addUrlMappings("/loginseal.zz");
return srb;
}
}
3、controller调用
package com.zks.pageoffice.controller;
import com.zhuozhengsoft.pageoffice.FileSaver;
import com.zhuozhengsoft.pageoffice.OpenModeType;
import com.zhuozhengsoft.pageoffice.PDFCtrl;
import com.zhuozhengsoft.pageoffice.PageOfficeCtrl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
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.util.Map;
/**
* @Package: com.zks.pageoffice
* @ClassName: PDFInsertSealController
* @Author: ZhouKaiShun
* @CreateTime: 2021/9/10 10:19
* @Description:
*/
@RestController
@Slf4j
public class PDFInsertSealController {
@Value("${spring.profiles.active}")
public String active;
@Value("${signpath}")
public String signPath;
@Value("${sealpath}")
private String sealPath;
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView showIndex() {
ModelAndView mv = new ModelAndView("Index");
return mv;
}
/**
* @description:盖章功能
* @return:
* @author: ZhouKaiShun
* @time: 2021/9/10 13:40
*/
@GetMapping("/AddSeal")
public ModelAndView showWord(HttpServletRequest request, Map<String, Object> map) {
log.info("准备盖章");
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);
//此处路径为服务器端文档路径 如果是Linux服务器上的路径,前面需要加“file://” (这个点找了好久......)
pdfCtrl1.webOpen(active.equals("prod") ? "file://" + sealPath : sealPath);
map.put("pageoffice", pdfCtrl1.getHtmlCode("PDFCtrl1"));
ModelAndView mv = new ModelAndView("AddSeal/PDF1");
return mv;
}
/**
* @description:签字功能
* @return:
* @author: ZhouKaiShun
* @time: 2021/9/10 13:40
*/
@GetMapping("AddSign")
public ModelAndView showWord11(HttpServletRequest request, Map<String, Object> map) {
log.info("准备签字");
//PageOfficeCtrl pdfCtrl1 = new PageOfficeCtrl(request);
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);
//此处路径为服务器端文档路径 如果是Linux服务器上的路径,前面需要加“file://” (这个点找了好久......)
pdfCtrl1.webOpen(active.equals("prod") ? "file://" + signPath : signPath);
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(sealPath);
fs.close();
}
@RequestMapping("/AddSign/save")
public void save2(HttpServletRequest request, HttpServletResponse response) {
FileSaver fs = new FileSaver(request, response);
//此处路径为服务器端文档路径
fs.saveToFile(signPath);
fs.close();
}
}
两个主要接口,一个用于签名,一个用于盖章
controller中的一些配置项
application-dev.yml
server:
port: 8080
# 用于存放注册的信息以及.db文件,这个db文件包含了签章的一些信息,pageoffice帮我们集成好了 我们不用管,只需要自己创建签章即可
posyspath: d:/lic/
# 默认密码,管理签章的默认账号 admin 111111
popassword: 111111
# 用于签名的文件地址
signpath: D:\doc\AddSign\test1.pdf
# 用于盖章的文件路径
sealpath: D:\doc\AddSeal\test1.pdf
spring:
thymeleaf:
prefix: classpath:/templates/
suffix: .html
cache: false
application-prod.yml
server:
port: 8011
# 用于存放注册的信息以及.db文件,这个db文件包含了签章的一些信息,pageoffice帮我们集成好了 我们不用管,只需要自己创建签章即可
posyspath: /usr/javaproject/pageoffice/lic/
# 默认密码,管理签章的默认账号 admin 111111
popassword: 111111
# 用于签名的文件地址
signpath: /usr/javaproject/static/pageoffice/sign/test.pdf
# 用于盖章的文件路径
sealpath: /usr/javaproject/static/pageoffice/seal/test.pdf
spring:
thymeleaf:
prefix: classpath:/templates/
suffix: .html
cache: false
application.yml (此处测试默认dev)
spring:
profiles:
active: dev
上述路径需自行创建好,准备好用于测试的pdf文件放入指定路径。项目启动后会在我们的 d:lic下看到以下文件
这个lic文件是安装pageoffice客户端后的注册信息。(注意:此次的注册码要用 专业版 才可使用签字、签章的功能)
poseal.db暂时忽略 后面再提
到这里我们就可以启动项目了,可以看到如下界面
点击的时候如果没有安装pageoffice客户端,则会提示安装,直接下载安装即可。这里下载后需要注册,组织什么的可以随便填,最后的序列号,需要到官网下载一个案例(注意版本),里面有序列号,注意要使用专业版试用序列号。官网demo下载地址:http://www.zhuozhengsoft.com/dowm/
安装完毕后点击 加盖签章会提示输入用户名密码
这里的用户密码是签章的关联关系,由管理员创建,并且这里不能登录admin 111111 会提示
所以我们需要自己创建,创建地址是:http://localhost:8080/loginseal.zz
这里的账号密码是admin 111111,这里的数据就是之前我们提到的 poseal.db 文件
这个文件我们需要去官网下载一个demo包,然后从实例项目中的 Samples5\WEB-INF\lib 这个路径下拿到
官网下载demo地址:http://www.zhuozhengsoft.com/dowm/ 下载时记得对应大版本号,案例里面有很多资料,如果出问题了可以查看参考
拿到poseal.db文件后,替换我们本地的文件,重启服务,然后访问印章管理,去新建印章
**这时候我们就可去盖章了,输入刚刚的用户名以及默认密码,修改密码后确定
**
这里可以选择你刚刚新建的印章,点击确定,然后选择需要盖章到哪里后再点鼠标左键,然后保存,即可完成盖章
保存后,可在本地的文件夹下查看,章已经盖好了,签字同理。
至此本地测试完毕,下面可以部署到服务器。部署到服务器需要注意的点我上面的代码里都有注释,直接根据我的配置改下路径放好文件即可。最坑的点莫过于 服务器上的资源路径前需要添加 “file://”,然后再加自己的路径。这个找了半天都没有找到,最后咨询的他们官方技术人员才解答。
这里用的是体验版,期限3个月
参考博客:https://blog.csdn.net/wqqqianqian/article/details/109174170