pdf 电子签章 java_利用itextpdf实现简单的电子签章/水印等

本文介绍如何使用iTextPDF库在Java中创建电子签章和水印。通过读取PDF文档,查找关键字并定位签章位置,结合图片和文字水印,实现PDF的安全签章功能。
摘要由CSDN通过智能技术生成

利用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算法也可实现,个人更倾向于后者。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值