pdf 电子签章 java_利用itextpdf实现简单的电子签章/水印等
利用itextpdf实现简单的电子签章只需要itextpdf相关jar包,构建一个简单的javademo就可以模拟。在web项目上大同小异,只需要得到对应的文件即可以作为工具进行调用
准备:itextpdf-5.5.13.jar,itextpdf-5.5.8.jar都可以。
准备待签名文件(路径)、签章,矢量即可(直接上代码)
代码如下:
//电子签章(传入源文件,输出文件、签章图片)
public static void addMark(String inSource,String outSource,String sealPNG){
try {
//读取需要签章的文档信息
MappdfMsg = getPdfMsg(inSource);
//获取文件宽度,默认pdf
float startAddress = Float.valueOf(SealUtils.getString(pdfMsg.get("width")));
PdfReader reader = new PdfReader(new FileInputStream(inSource));
PdfStamper stamper =new PdfStamper(reader, new FileOutputStream(outSource));
//利用关键字查找文件中的内容,确定签章的位置
ListkeyWordsList = new ArrayList();
keyWordsList.add("敏感字");
//查找关键字位置
List> arrLists = SealUtils.findKeywords(keyWordsList,reader);
int pageNum = SealUtils.getInt(pdfMsg.get("pageSize"));
//插入水印
Image img = Image.getInstance(sealPNG);
//设置尺寸
img.scaleAbsolute(90,60);// 直接设定显示尺寸
img.setBackgroundColor(new BaseColor(0));
//如果没有找到关键字,走默认位置
if(arrLists.isEmpty()){
//默认盖章位置
img.setAbsolutePosition(startAddress - 188,70);
PdfContentByte overContent = stamper.getOverContent(pageNum);
overContent.addImage(img);
stamper.close();
reader.close();
return;
}
for (int i=pageNum;i>0;i--) {
if(!arrLists.get(0).isEmpty()){
// 关键字所在的页码数
float pageFlag = arrLists.get(0).get(0)[2];
// 当且仅当落款和关键字在同一页时考虑同时盖章
if (pageNum == pageFlag && pageFlag == i) {
img.setAbsolutePosition(arrLists.get(0).get(0)[0] - 60,
arrLists.get(0).get(0)[1] - 60);
}
PdfContentByte under = stamper.getOverContent(i);
under.addImage(img);
//添加文字水印
doTextHide(under);
//图片水印
doImgHide(under,sealPNG);
}
}
stamper.close();
reader.close();
} catch (FileNotFoundException e) {
logger.info("传入文件有问题!。。"+e.getMessage());
} catch (IOException e) {
logger.info("文件传输错误!。。"+e.getMessage());
} catch (DocumentException e) {
logger.info("解析pdf文档有问题!。。"+e.getMessage());
}
}
工具方法抽取
/**
* 添加文字水印
* @throws IOException
* @throws DocumentException
*/
public static void doTextHide(PdfContentByte under) throws DocumentException, IOException{
logger.info("添加文字水印!");
PdfGState gState = new PdfGState();
under.beginText();
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA_BOLDOBLIQUE,BaseFont.WINANSI,BaseFont.NOT_CACHED);
under.setFontAndSize(bf, 45);
under.setTextMatrix(30, 30);
under.setColorFill(BaseColor.PINK);
gState.setFillOpacity(0.3f);
under.setGState(gState);
under.showTextAligned(Element.ALIGN_LEFT, "JASON_HSUEH", 230, 430, 45);
under.endText();
}
/**
* 添加图片水印
* @throws IOException
* @throws MalformedURLException
* @throws DocumentException
*/
public static void doImgHide(PdfContentByte under,String path) throws MalformedURLException, IOException, DocumentException{
under.beginText();
PdfGState gState = new PdfGState();
gState.setStrokeOpacity(0.4f);
Image image = Image.getInstance(path);
// 设置坐标 绝对位置 X Y
image.setAbsolutePosition(200, 300);
// 设置旋转弧度
image.setRotation(30);// 旋转 弧度
// 设置旋转角度
image.setRotationDegrees(45);// 旋转 角度
// 设置等比缩放
image.scalePercent(90);// 依照比例缩放
// image.scaleAbsolute(200,100);//自定义大小
// 设置透明度
under.addImage(image);
under.setGState(gState);
under.endText();
under.stroke();
}
其中:SealUtils.findKeywords(keyWordsList,reader)实现在对应文件中搜索关键字
/**
* 根据关键字返回对应的坐标
* @param keyWords
* @param pdfReader
* @return
*/
public static List> findKeywords(final ListkeyWords, PdfReader pdfReader) {
if (keyWords.isEmpty()) {
return null;
}
int pageNum = pdfReader.getNumberOfPages();
final List> arrayLists = new ArrayList>(keyWords.size());
for (int k=0; kListpositions = new ArrayList();
arrayLists.add(positions);
}
PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);
try {
for (int i = 1; i <= pageNum; i++) {
final int finalI = i;
pdfReaderContentParser.processContent(i, new RenderListener() {
public String pdfsb=new String();
private float yy = -1f;
[email protected]
public void renderText(TextRenderInfo textRenderInfo) {
String text = textRenderInfo.getText();
com.itextpdf.awt.geom.Rectangle2D.Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange();
if(yy == -1f) {
yy = boundingRectange.y;
}
if(yy != boundingRectange.y) {
yy = boundingRectange.y;
}
pdfsb +=text;
if (pdfsb.length()>0) {
for (int j=0; jListkey_words = parseList(keyWords.get(j), ",");
//假如配置了多个关键字,找到一个就跑
for (final String key_word : key_words) {
if (pdfsb.length()>0 && pdfsb.toString().contains(key_word)) {
float[] resus = new float[3];
resus[0] = boundingRectange.x +boundingRectange.width * (key_word.length()-1);
resus[1] = boundingRectange.y;
resus[2] = finalI;
arrayLists.get(j).add(resus);
pdfsb ="";
logger.info("找到关键字:"+key_word);
break;
}
}
}
}
}
[email protected]
public void renderImage(ImageRenderInfo arg0) {
}
[email protected]
public void endTextBlock() {
}
[email protected]
public void beginTextBlock() {
}
});
}
} catch (Exception e) {
System.out.println("出现异常"+e.getMessage());
}
return arrayLists;
}
/**
* 获取关键字
*
* @param source
* @param regex
* @return
*/
public static ListparseList(String source, String regex) {
if (source.isEmpty()) {
return null;
}
ListstrList = new ArrayList();
if (regex.isEmpty()) {
strList.add(source);
} else {
String[] strArr = source.split(regex);
for (String str : strArr) {
if (!str.isEmpty()) {
strList.add(str);
}
}
}
return strList;
}
另一种利用ExternalSignature算法也可实现,个人更倾向于后者。
pdf 电子签章 java_利用itextpdf实现简单的电子签章/水印等相关推荐
- 词法分析器java_利用Java实现简单的词法分析器实例代码
首先看下我们要分析的代码段如下: 输出结果如下: 输出结果(a).PNG 输出结果(b).PNG 输出结果(c).PNG 括号里是一个二元式:(单词类别编码,单词位置编号) 代码如下: package ...
- 电子签章(SpringCloud写一个简单签章)
java 代码实现电子签章(表格+签章)简单版本 注:使用的是springcloud项目 导入依赖 注:导入依赖不只有pdf的还有其他依赖 <dependencies><!--eur ...
- 用easyx画电子钟_Canvas入门-利用Canvas绘制好玩的电子时钟
在这之前 你需要了解一下方法的使用: beginPath() closePath() moveTo() lineTo() fill() stroke() fillRect() clearRect() ...
- Canvas入门-利用Canvas绘制好玩的电子时钟
在这之前 你需要了解一下方法的使用: beginPath() closePath() moveTo() lineTo() fill() stroke() fillRect() clearRect() ...
- python数码时钟代码_Python+Pyqt实现简单GUI电子时钟
本文实例为大家分享了Python+Pyqt实现简单GUI电子时钟的具体代码,供大家参考,具体内容如下 突发奇想想用GUI做一个简单的电子时钟界面,利用pyqt模块也很方便,代码如下: from PyQ ...
- 关于如何利用Struts2,Hibernate,Spring开发电子商业汇票系统
关于如何利用Struts2,Hibernate,Spring开发电子商业汇票系统. 首先先说说电子商业汇票的种类: 1.电子银行承兑汇票 2.电子商业承兑汇票 另外电子商业汇票与纸票的区别: 电子商业 ...
- js入门·循环与判断/利用函数的简单实例/使用对象/列举对象属性的名称
1,列举对象属性的名称 <script language="javascript"> var obj=new Object(); obj.a="您好,我是田洪 ...
- 在html利用canvas蚂蚁,html5 利用canvas实现简单的人物走动
最近在学习html5,其中涉及到很关键的元素canvas-画布,在网上下载了一些游戏源代码,虽然能看懂,但是想单独地针对某个功能提取出来还是有难处的,于是乎自己又上网查找了一些例子,才将超级玛丽简单的 ...
- python爬虫简单实例-Python 利用Python编写简单网络爬虫实例3
利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站"http://bbs.51tes ...
最新文章
- 基于HTML5 Canvas 实现矢量工控风机叶轮旋转
- RFC 4303--ESP
- 使用Java mail发送邮件附件出现附件上产生.eml文件夹的问题及附件名.bin结尾问题...
- 【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )
- VTK:可视化算法之LOxGrid
- springboot 项目部署为war项目
- excel loc() python_总结:像Excel一样使用python进行数据分析
- ssh中c3p0连接mysql_ssh 中使用c3p0 的连接池配置 | 学步园
- Mysql、navicat、SQL server 的关系
- 279. Perfect Squares
- 蓝桥杯 ALGO-97 算法训练 排序
- 对,信中介不去信一头猪
- vscode编辑器 mac 版 中文编译报错_记录一下mac上用vscode写latex文档
- python求解next数组实现KMP算法
- python制作无限弹窗_Python无限弹窗,开机启动,打包为exe程序
- UEFI 文件类型 .efi (二)
- Python实现对网易云音乐的数据进行一个数据清洗和可视化分析
- 图解PLC与变频器通讯接线
- 有道云笔记怎么保存html,有道云笔记怎么保存网页?有道云笔记保存路径是什么...
- docker.socks vul
热门文章
- android 10.0 launcher3 app列表隐藏某个app
- 如何在最近任务列表中隐藏app
- 栈溢出:Infinite recursion (StackOverflowError)
- 手机故障手机通讯录被删除了怎么恢复
- wireshark常见协议包分析1
- 开源 | 无线电 | 摩斯电码CW发报练习器
- MISF:Multi-level Interactive Siamese Filtering for High-Fidelity Image Inpainting 论文解读与感想
- python界面小游戏贪吃蛇_用Python实现童年小游戏贪吃蛇
- B.FRIENDit壁虎忍者GC03电竞椅,坐的舒服才能心无旁骛!
- 【蓝桥杯选拔赛真题07】python输出乘积 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析