利用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实现简单的电子签章/水印等相关推荐

  1. 词法分析器java_利用Java实现简单的词法分析器实例代码

    首先看下我们要分析的代码段如下: 输出结果如下: 输出结果(a).PNG 输出结果(b).PNG 输出结果(c).PNG 括号里是一个二元式:(单词类别编码,单词位置编号) 代码如下: package ...

  2. 电子签章(SpringCloud写一个简单签章)

    java 代码实现电子签章(表格+签章)简单版本 注:使用的是springcloud项目 导入依赖 注:导入依赖不只有pdf的还有其他依赖 <dependencies><!--eur ...

  3. 用easyx画电子钟_Canvas入门-利用Canvas绘制好玩的电子时钟

    在这之前 你需要了解一下方法的使用: beginPath() closePath() moveTo() lineTo() fill() stroke() fillRect() clearRect() ...

  4. Canvas入门-利用Canvas绘制好玩的电子时钟

    在这之前 你需要了解一下方法的使用: beginPath() closePath() moveTo() lineTo() fill() stroke() fillRect() clearRect() ...

  5. python数码时钟代码_Python+Pyqt实现简单GUI电子时钟

    本文实例为大家分享了Python+Pyqt实现简单GUI电子时钟的具体代码,供大家参考,具体内容如下 突发奇想想用GUI做一个简单的电子时钟界面,利用pyqt模块也很方便,代码如下: from PyQ ...

  6. 关于如何利用Struts2,Hibernate,Spring开发电子商业汇票系统

    关于如何利用Struts2,Hibernate,Spring开发电子商业汇票系统. 首先先说说电子商业汇票的种类: 1.电子银行承兑汇票 2.电子商业承兑汇票 另外电子商业汇票与纸票的区别: 电子商业 ...

  7. js入门·循环与判断/利用函数的简单实例/使用对象/列举对象属性的名称

    1,列举对象属性的名称 <script language="javascript"> var obj=new Object(); obj.a="您好,我是田洪 ...

  8. 在html利用canvas蚂蚁,html5 利用canvas实现简单的人物走动

    最近在学习html5,其中涉及到很关键的元素canvas-画布,在网上下载了一些游戏源代码,虽然能看懂,但是想单独地针对某个功能提取出来还是有难处的,于是乎自己又上网查找了一些例子,才将超级玛丽简单的 ...

  9. python爬虫简单实例-Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站"http://bbs.51tes ...

最新文章

  1. 基于HTML5 Canvas 实现矢量工控风机叶轮旋转
  2. RFC 4303--ESP
  3. 使用Java mail发送邮件附件出现附件上产生.eml文件夹的问题及附件名.bin结尾问题...
  4. 【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )
  5. VTK:可视化算法之LOxGrid
  6. springboot 项目部署为war项目
  7. excel loc() python_总结:像Excel一样使用python进行数据分析
  8. ssh中c3p0连接mysql_ssh 中使用c3p0 的连接池配置 | 学步园
  9. Mysql、navicat、SQL server 的关系
  10. 279. Perfect Squares
  11. 蓝桥杯 ALGO-97 算法训练 排序
  12. 对,信中介不去信一头猪
  13. vscode编辑器 mac 版 中文编译报错_记录一下mac上用vscode写latex文档
  14. python求解next数组实现KMP算法
  15. python制作无限弹窗_Python无限弹窗,开机启动,打包为exe程序
  16. UEFI 文件类型 .efi (二)
  17. Python实现对网易云音乐的数据进行一个数据清洗和可视化分析
  18. 图解PLC与变频器通讯接线
  19. 有道云笔记怎么保存html,有道云笔记怎么保存网页?有道云笔记保存路径是什么...
  20. docker.socks vul

热门文章

  1. android 10.0 launcher3 app列表隐藏某个app
  2. 如何在最近任务列表中隐藏app
  3. 栈溢出:Infinite recursion (StackOverflowError)
  4. 手机故障手机通讯录被删除了怎么恢复
  5. wireshark常见协议包分析1
  6. 开源 | 无线电 | 摩斯电码CW发报练习器
  7. MISF:Multi-level Interactive Siamese Filtering for High-Fidelity Image Inpainting 论文解读与感想
  8. python界面小游戏贪吃蛇_用Python实现童年小游戏贪吃蛇
  9. B.FRIENDit壁虎忍者GC03电竞椅,坐的舒服才能心无旁骛!
  10. 【蓝桥杯选拔赛真题07】python输出乘积 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析