记录使用iText7查找PDF内容关键字坐标,加盖电子签名、印章

这篇具有很好参考价值的文章主要介绍了记录使用iText7查找PDF内容关键字坐标,加盖电子签名、印章。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

项目以前签字都是由C端那边进行合成操作,最近项目要求把那块功能,由后端进行实现,其中包含坐标、关键字、任意位置进行签字操作,坐标是最容易实现的,曾经也写过类似的功能在(添加图片印章到PDF)直接复用就可以了
为了实现关键字位置签字,在网上查找了挺多资料的,感觉能满足功能的代码参考地址:Itext7获取关键字在文件中的坐标
在他这基础上我进行了优化

二、使用JAR包

<dependency>
	<groupId>com.itextpdf</groupId>
	<artifactId>itextpdf</artifactId>
	<version>5.5.13.1</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.2.0</version>
    <type>pom</type>
</dependency>

三、实现代码

import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor;
import com.itextpdf.kernel.pdf.canvas.parser.listener.IPdfTextLocation;
import com.itextpdf.kernel.pdf.canvas.parser.listener.RegexBasedLocationExtractionStrategy;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.*;

public class PDFKeywordFinder {

    public static Map<String, Object> getKeywordLocation(ByteArrayInputStream bytes, String keyword) {
        Map<String, Object> result = new HashMap<>();
        //使用这种方式,无需再关闭了,处理完自动关闭
        try (PdfReader reader = new PdfReader(bytes); PdfDocument pdfDocument = new PdfDocument(reader)) {
            for (int i = 1; i <= pdfDocument.getNumberOfPages(); i++) {
                PdfPage page = pdfDocument.getPage(i);
                RegexBasedLocationExtractionStrategy strategy = new RegexBasedLocationExtractionStrategy(keyword);
                PdfCanvasProcessor canvasProcessor = new PdfCanvasProcessor(strategy);
                canvasProcessor.processPageContent(page);
                Collection<IPdfTextLocation> resultantLocations = strategy.getResultantLocations();
                // 自定义结果处理
                if (!resultantLocations.isEmpty()) {
                    List<Map<String, Object>> locationList = new ArrayList<>();
                    for (IPdfTextLocation item : resultantLocations) {
                        Map<String, Object> map = new HashMap<>();
                        Rectangle rectangle = item.getRectangle();
                        map.put("page", item.getPageNumber());
                        map.put("absoluteX", rectangle.getX());
                        map.put("absoluteY", rectangle.getY());
                        map.put("width", rectangle.getWidth());
                        map.put("height", rectangle.getHeight());
                        map.put("keyword", item.getText());
                        map.put("top", rectangle.getTop());
                        map.put("bottom", rectangle.getBottom());
                        map.put("left", rectangle.getLeft());
                        map.put("right", rectangle.getRight()); // 右坐标
                        map.put("count", locationList.size() + 1); // 出现次数
                        locationList.add(map);
                    }
                    result.put(String.valueOf(i), locationList);
                }
            }
            return result;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

四、测试用例

本地测试用了文件转内存流方式,如果需要加盖电子印章,可以把签字图片替换成电子印章图片
我这没用到签名密钥,如果需要可以自行添加,或者找其它的处理方式

//引入包信息
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfStamper;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;

public static void main(String[] args) throws IOException, DocumentException {
    String filePath = "E:\\test.pdf";
    String keyword = "签收人"; // 要查找的关键字
    ByteArrayOutputStream memoryStream = readFileToMemoryStream(filePath);
    Map<String, Object> map = getKeywordLocation(new ByteArrayInputStream(memoryStream.toByteArray()), keyword);
    com.itextpdf.text.pdf.PdfReader pdfReader = new com.itextpdf.text.pdf.PdfReader(memoryStream.toByteArray());
    PdfStamper pdfStamper = new PdfStamper(pdfReader, Files.newOutputStream(Paths.get("E:\\文书.pdf")));
    com.itextpdf.text.Image image = Image.getInstance("E:\\sign.png");
    //设置签字图片宽高
    image.scaleAbsolute(100, 50);
    //我直接在第一页操作,也可以根据返回的数据进行操作
    JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(map.get("1")));
    JSONObject jsonObject = jsonArray.getJSONObject(0);
    //这个位置主要是插入签名图片位置坐标,也可以根据情况自行调整取值
    float absoluteX = Float.parseFloat(jsonObject.getString("absoluteX")) - Float.parseFloat(jsonObject.getString("width"));
    float absoluteY = Float.parseFloat(jsonObject.getString("absoluteY")) - (Float.parseFloat(jsonObject.getString("width")) + Float.parseFloat(jsonObject.getString("height")));
    image.setAbsolutePosition(absoluteX, absoluteY);
    PdfContentByte content = pdfStamper.getUnderContent(1);
    content.addImage(image);
    pdfStamper.close();
}

private static ByteArrayOutputStream readFileToMemoryStream(String filePath) throws IOException {
    ByteArrayOutputStream memoryStream = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024]; // 缓冲区大小
    try (FileInputStream fis = new FileInputStream(filePath)) {
        int bytesRead;
        while ((bytesRead = fis.read(buffer)) != -1) {
            memoryStream.write(buffer, 0, bytesRead);
        }
    }
    return memoryStream;
}

五、效果展示

记录使用iText7查找PDF内容关键字坐标,加盖电子签名、印章,Java,pdf,开发语言,java文章来源地址https://www.toymoban.com/news/detail-729100.html

到了这里,关于记录使用iText7查找PDF内容关键字坐标,加盖电子签名、印章的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用python实现给出关键字查找并标注pdf文件中关键字

    要在Python中标注PDF文件中的,可以使用Python的PDFMiner库和Python的matplotlib库。 首先,需要安装这两个库。可以使用pip命令进行安装: shell 复制代码 pip install pdfminer.six matplotlib 接下来,可以使用以下代码实现查找和标注功能: python 复制代码 import pdfminer   from pdf

    2024年01月16日
    浏览(67)
  • 使用VSCode在文件中查找关键字

    在使用VSCode编辑器时,经常需要在文件中查找特定的或文本。VSCode提供了强大的搜索功能,可以帮助我们快速定位并找到所需的内容。本文将介绍如何在VSCode中进行搜索。 在VSCode中查找的方法如下: 打开目标文件:首先,打开你想要在其中进行搜

    2024年02月04日
    浏览(63)
  • 哈希表:给定一组查找关键字(32,15,7,11,4,28,56,61,79),哈希表长为m=12,请按照除留余数法设计一个哈希函数,设每个记录的查找概率相等。

    慕课数据结构题目: 给定一组查找(32,15,7,11,4,28,56,61,79),哈希表长为m=12,请按照除留余数法设计一个哈希函数,设每个记录的查找概率相等。 (1)画出按照 线性探测 再散列处理冲突得到的哈希表(给出求解过程),并计算等概率情况下查找成功和查找失败时的平均

    2024年02月11日
    浏览(49)
  • Python批量实现word中查找关键字

     一、背景         在日常办公和文档处理中,我们常常需要在大量的Word文档中查找特定的,然后进行接下来的操作,比如替换等。手动逐个打开并搜索文档显然是费时费力的。因此,利用Python编写一个批量实现Word中查找的程序可以大大提高效率和减

    2024年02月16日
    浏览(48)
  • Linux命令_grep & 快速查找关键字、文件名

    目录 1. 语法 1.1. 常用参数 2. 常见用法 2.1. 查找 2.2. 取反 2.3. 额外输出上下 2 行 2.4. 额外输出上面 1 行 2.5. 额外输出下面 1 行 2.6. 输出总行数 2.7. 输出行号 2.8. 忽略大小写 2.9. 正则匹配 3.组合使用 4. 文本三剑客其他命令                  

    2024年01月17日
    浏览(71)
  • linux cat命令,显示多少行和查找关键字

    cat filename | tail -n 10 显示文件最后10行 cat filename | head -n 10 显示文件前面10行 cat filename | tail -n +10 从10行开始显示,显示10行以后的所有行 cat filename | head -n 50 | tail -n +10 显示10行到50行 cat filename1 filename2 | grep xxx 在filename1 和 filename2中查找xxx cat aaaa*.log | grep xxx 模糊匹配

    2024年02月16日
    浏览(53)
  • linux通过grep根据关键字查找日志文件上下文

    grep -C 10 keyword catalina.out 显示file文件中匹配keyword字串那行以及上下10行 grep -B 10 keyword catalina.out 显示keyword及前10行 grep -A 10 keyword catalina.out 显示keyword及后10行 grep -C 10 keyword catalina.out aaa.txt grep -o keyword catalina.out | wc -l grep -c keyword catalina.out grep -V

    2024年02月16日
    浏览(53)
  • 帝国cms内容页根据关键字调用相关内容的方法

    我们使用帝国cms的时候,需要调用当前文章的其他相关的文章,根据相关的方式,这样内页关联比较好,对于seo与用户体验来说都是非常好的 代码如下 =$or[title]? =$newstime? }}else{ $mesql2=$empire-query(\\\"select * from {$dbtbpre}ecms_news where id\\\".$navinfor[\\\'id\\\'].\\\" order by rand() desc limit 10\\\");w

    2024年02月03日
    浏览(59)
  • 【Rust指南】use关键字妙用|模块内容拆分

      书接上文,本篇补充rust 组织管理中模块的细节知识,比如模块拆分。此外介绍 use 的习惯用法,快速引用自定义模块内容或标准库,以此优化代码书写。 如果我说 use 与C/C++中的 include 或者是java、python中的 import 用法类似,想必此时的你定是头一歪,脑子里蹦出两

    2023年04月10日
    浏览(29)
  • 使用IText导出复杂pdf

            需要将发票导出成pdf,要求每页都必须包含发票信息和表头行。         使用IText工具实现PDF导出         IText8文档:Examples (itextpdf.com)                  引入Itext依赖,我这里用的是8.0.1版本         测试一下:         IText8不支持中文,需要引入外部

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包