向PDF写入签名日期

  • 前言
  • 一、导入所需的jar
  • 二、定位日期的位置

前言

需求是要在pdf上进行签字,生成签字日期。签字是使用的第三方信手书工具,但是不会自动生成日期,需要后端在签好字的pdf上将日期填上。


一、导入所需的jar

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>

二、定位日期的位置

定位日期的位置

读取pdf内容,通过方法processContent传入自定义的监听器CustomRenderListener,然后通过监听器获取关键字的位置信息,因为关键字会在多个位置出现,所以存入pdfKeyWordLocationList中,然后将List里面先通过page页码排序,定位到最后一页,再通过Y轴排序,选出最小值(即最下面位置)

import cn.gtmap.estateplat.olcommon.model.PdfKeyWordLocation;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** @ClassName : PdfHelper* @Description :*/
public class PdfHelper {/*** @Description 用于供外部类调用获取关键字所在PDF文件坐标* @param filepath* @param keyWords* @return float[]*/public static float[] getKeyWordsByPath(String filepath, String keyWords) {float[] coordinate = null;try{PdfReader pdfReader = new PdfReader(filepath);coordinate = getKeyWords(pdfReader, keyWords);} catch (IOException e) {e.printStackTrace();}return coordinate;}/*** @Description 获取关键字所在PDF坐标* @param pdfReader* @param keyWords* @return float[]*/public static float[] getKeyWords(PdfReader pdfReader, String keyWords) {float[] coordinate = new float[3];List<PdfKeyWordLocation> pdfKeyWordLocationList = new ArrayList<>();int page = 0;try{int pageNum = pdfReader.getNumberOfPages();PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);CustomRenderListener renderListener = new CustomRenderListener();renderListener.setKeyWord(keyWords);for (page = 1; page <= pageNum; page++) {renderListener.setPage(page);pdfReaderContentParser.processContent(page, renderListener);pdfKeyWordLocationList.addAll(renderListener.getPdfKeyWordLocationList());}Collections.sort(pdfKeyWordLocationList, (o1, o2) -> {int num = o2.getPage() - o1.getPage();if (num == 0) {return (int) (o1.getY() - o2.getY());} else {return num;}});coordinate[0] = pdfKeyWordLocationList.get(0).getX();coordinate[1] = pdfKeyWordLocationList.get(0).getY();coordinate[2] = pdfKeyWordLocationList.get(0).getPage();} catch (IOException e) {e.printStackTrace();}return coordinate;}
}

实现RenderListener接口,通过方法renderText去获取关键字位置信息

import cn.gtmap.estateplat.olcommon.model.PdfKeyWordLocation;
import com.itextpdf.awt.geom.Rectangle2D.Float;
import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.RenderListener;
import com.itextpdf.text.pdf.parser.TextRenderInfo;import java.util.ArrayList;
import java.util.List;/*** @ClassName : CustomRenderListener* @Description :*/
public class CustomRenderListener implements RenderListener {private List<PdfKeyWordLocation> pdfKeyWordLocationList = new ArrayList<>();private float[] pcoordinate = null;private String keyWord;private int page;public int getPage() {return page;}public void setPage(int page) {this.page = page;}public float[] getPcoordinate(){return pcoordinate;}public String getKeyWord() {return keyWord;}public void setKeyWord(String keyWord) {this.keyWord = keyWord;}public List<PdfKeyWordLocation> getPdfKeyWordLocationList() {return pdfKeyWordLocationList;}public void setPdfKeyWordLocationList(List<PdfKeyWordLocation> pdfKeyWordLocationList) {this.pdfKeyWordLocationList = pdfKeyWordLocationList;}@Overridepublic void beginTextBlock() {}@Overridepublic void endTextBlock() {}@Overridepublic void renderImage(ImageRenderInfo arg0) {}@Overridepublic void renderText(TextRenderInfo textRenderInfo) {String text = textRenderInfo.getText();if (null != text && text.contains(keyWord)) {Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange();PdfKeyWordLocation pdfKeyWordLocation = new PdfKeyWordLocation();pdfKeyWordLocation.setX(boundingRectange.x);pdfKeyWordLocation.setY(boundingRectange.y);pdfKeyWordLocation.setPage(page);pdfKeyWordLocationList.add(pdfKeyWordLocation);}}}

根据关键字位置计算出日期位置

private void setFontPosition(PdfContentByte over, String type, float[] f) {if (StringUtils.equals("hebmmht", type)) {//设置字体的输出位置over.setTextMatrix(f[0] + 54.5F, f[1] - 85.0F);//要输出的textover.showText(DateTimeFormatter.ofPattern("yyyy年MM月dd日").format(LocalDate.now()));} else if (StringUtils.equals("hebwxblgy", type)) {//设置字体的输出位置over.setTextMatrix(f[0] + 52.5F, f[1] - 23.1F);//要输出的textover.showText(DateTimeFormatter.ofPattern("yyyy年MM月dd日").format(LocalDate.now()));} else if (StringUtils.equals("hebwxbldd", type)) {//设置字体的输出位置over.setTextMatrix(f[0] + 52.5F, f[1] - 23.1F);//要输出的textover.showText(DateTimeFormatter.ofPattern("yyyy年MM月dd日").format(LocalDate.now()));} else if (StringUtils.equals("hebsqs", type)) {LocalDate localDate = LocalDate.now();//设置字体的输出位置over.setTextMatrix(f[0], f[1] - 46.2F);//要输出的textover.showText(DateTimeFormatter.ofPattern("yyyy").format(localDate));//设置字体的输出位置over.setTextMatrix(f[0] + 60.5F, f[1] - 46.2F);//要输出的textover.showText(DateTimeFormatter.ofPattern("MM").format(localDate));//设置字体的输出位置over.setTextMatrix(f[0] + 115.0F, f[1] - 46.2F);//要输出的textover.showText(DateTimeFormatter.ofPattern("dd").format(localDate));}}

向pdf中写入日期

private void writePdfDate(String fileName, String userName, String type) {PdfReader reader = null;try {reader = new PdfReader(fileName);fileName = fileName.substring(0, fileName.lastIndexOf("_")) + "_" + DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS").format(LocalDateTime.now()) + ".pdf";//根据一个pdfreader创建一个pdfStamper.用来生成新的pdf.PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(fileName));//这个字体是itext-asian.jar中自带的 所以不用考虑操作系统环境问题.BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); // set font//baseFont不支持字体样式设定.但是font字体要求操作系统支持此字体会带来移植问题.Font font = new Font(bf,10);font.setStyle(Font.BOLD);font.getBaseFont();float[] f = PdfHelper.getKeyWords(reader, userName);int page = (int) f[2];//获得pdfstamper在当前页的上层打印内容.也就是说 这些内容会覆盖在原先的pdf内容之上.PdfContentByte over = stamper.getOverContent(page);//开始写入文本over.beginText();//设置字体和大小over.setFontAndSize(font.getBaseFont(), 10);//设置字体颜色over.setColorFill(BaseColor.RED);//设置文字的位置setFontPosition(over, type, f);over.endText();stamper.close();} catch (IOException | DocumentException e) {e.printStackTrace();}}

向PDF写入签名日期相关推荐

  1. python使用fpdf创建pdf:写入hello world、嵌入图片

    python使用fpdf创建pdf:写入hello world.嵌入图片 pip install fpdf # 创建pdf并写入hello world文本内容: # 嵌入图片 from fpdf im ...

  2. PDF签名系列(2):PDF的签名值到底存在哪里?

    来源:PDF签名系列(2):PDF的签名值到底存在哪里? - 知乎 研究过PDF签名的同学应该见过下面这张图, 来自ADOBE的文档Acrobat_DigitalSignatures_in_PDF.p ...

  3. 办公技巧:如何修改PDF文件的日期格式

    有时候在编辑PDF文档的时,我们一般需要给PDF文档的页眉页脚当中添加日期格式,但是根据不同的需求或者情境,我们可能需要对已经插入了日期格式的PDF文档进行修改,我们应该怎么做呢?怎样通过PDF编辑器 ...

  4. java实现写字板对pdf文件签名

    java实现写字板对pdf文件签名 思路 首先明白写字板签名完输出的是base64的图片,剩下的就是将此图片插入到pdf文件中,实现此步骤的技术很多,可以用itex5但是为了实现与其他数据一起动态插入 ...

  5. 腾讯应用宝认领APP并将空白apk写入签名

    将app发布到应用宝时,而上传安装包时提示如下图时, 但您或您的团队从未上传该应用,您可以通过认领功能认领应用.认领成功后该应用会自动转入您的账户下,同时保留应用全部数据,您可以在应用管理中进行管理. ...

  6. 怎样使用Mac的预览应用在PDF上签名?

    如何在PDF上签名?首先想到的是先把文件打印出来,等签完名字后再扫描进电脑里,听起来就很麻烦,现在用Mac的预览应用就可以跳过打印的步骤,轻松完成签名. 用Mac的预览应用在PDF上签名具体步骤 当你 ...

  7. php pdf 加密 签名 时间戳,在现有PDF签名上添加签名时间戳

    我假设您指的是添加PADES-5标准中定义的"document security store"和"document-level timestamp"(RFC 3 ...

  8. android实现对PDF进行签名、涂鸦操作

    在android项目开发过程中,项目需要android客户端完成对PDF文件的涂鸦.签名操作,其中最重要的就是手写签名了,可以当做是凭证一类的东西.在网上只能找到一个例子,然而做的不是很完善(地址下面 ...

  9. 冰蓝科技spire.pdf写入到pdf文件时,中文无法显示的原因

    之前在一台电脑上使用冰蓝科技的sprire.pdf插件往pdf文件中写文字,功能已经实现出来了,但是后面这台电脑重新装了系统后,发现之前写入文字的功能又无法显示了,只能显示字母和数字. 经过几天的摸索 ...

  10. PHP利用FPDI 制作PDF 档案 (php合并pdf, php签名pdf)

    昨天研究如何在既有的PDF 档案上放入中文字,虽然找到支援中文的FPDF ,但是有些Unicode 字集我实在试不出如何显示(如:堃) . 我的同事建议我用图形来解决看看,以下就是我的实验过程(我用的 ...

最新文章

  1. gzip格式分析与识别
  2. VTK修炼之道11:基本数据结构_数据对象数据集
  3. 删除已经配置的类库和移除CocoaPods
  4. A1-2017级算法上机第一次练习赛 H 模式寻对
  5. Eclipse里做JBPM工作流gpd.xml中文乱码问题解决(包括控制台乱码解决)
  6. Spring Boot文档阅读笔记=Caching Data with Spring
  7. 52 - 算法 - LeetCode 21 数据结构链表 头插法 递归
  8. OpenResty入门
  9. 【Docker】问题汇总
  10. echarts 世界地图标点_echarts中国地图3D各个城市标点demo
  11. 华为2019校招实习笔试-软件题
  12. 八个步骤实现一个Web项目(在线聊天室)
  13. Matlab入门教程 | 001 球的体积问题
  14. python数据分析入门之高效的学习路径
  15. Centos7 压缩文件
  16. 上海庆科EMW3162 WiFi模块 串口透传
  17. Linux下安装配置各种软件和服务
  18. isalpha() / isupper() / islower()函数
  19. 关于函数不定积分的方法总结
  20. 中国量子计算机芯片美国,13nm!中国量子芯片再获突破,美国专家:中国学者不睡觉吗?...

热门文章

  1. 开关电源matlab仿真,用数学方法建立一种开关电源全系统的仿真模型
  2. 谷歌地球专业版:Google Earth Pro for Mac中文免费版
  3. Pattern Recognition and Machine Learning(模式识别与机器学习)第一章导读
  4. python中pygame学习——碰碰球(简单版)
  5. (Note)CIE色度图
  6. linux用在炫龙m7,NH55 炫龙M7 Ubuntu 安装
  7. jsp如何使用kindeditor
  8. PC Logo入门指南
  9. BMP图片的旋转以及BMP转YUV(4:2:0)
  10. 软件生命周期创建B2C电子商务网站