Java为pdf电子签章(关键字盖章) |
您所在的位置:网站首页 › 盖章的字怎么写的图片 › Java为pdf电子签章(关键字盖章) |
1、pom依赖
com.itextpdf itextpdf 5.5.11 com.itextpdf itext7-core 7.2.0 2、关键字信息查找package com.example.study.demo.pdfSign; import cn.hutool.core.collection.CollectionUtil; 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.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; public class FindKey { /** * 获取关键字位置信息map * key为页数,value为当页关键字信息集合 */ public static Map keyWordLocationMap(String input, String keyword) { Map listMap; try(PdfReader reader = new PdfReader(input);PdfDocument pdfDocument = new PdfDocument(reader)) { int pageNumbers = pdfDocument.getNumberOfPages(); listMap = new HashMap(pageNumbers); for (int i = 1; i List keyWordInfoList = new ArrayList(); List iPdfTextLocationList = CollectionUtil.newArrayList(resultantLocations); for (int m = 0; m < iPdfTextLocationList.size(); m++) { IPdfTextLocation item = iPdfTextLocationList.get(m); Rectangle boundRectangle = item.getRectangle(); KeyWordInfo keyWordInfo = new KeyWordInfo(); keyWordInfo.setPage(i); keyWordInfo.setX(boundRectangle.getX()); keyWordInfo.setY(boundRectangle.getY()); keyWordInfo.setWidth(boundRectangle.getWidth()); keyWordInfo.setHeight(boundRectangle.getHeight()); keyWordInfo.setText(item.getText()); keyWordInfo.setNum(m + 1); System.out.println("关键字“" + keyword + "” 的坐标为 x: " + boundRectangle.getX() + " ,y: " + boundRectangle.getY()); keyWordInfoList.add(keyWordInfo); } listMap.put(i, keyWordInfoList); } } } catch (IOException e) { throw new RuntimeException(e); } return listMap; } } package com.example.study.demo.pdfSign; import lombok.Data; @Data public class KeyWordInfo{ private float x; private float y; private float width; private float height; /** * pdf的页面 */ private int page; /** * 当前页面中第几个 */ private int num; private String text; } 3、关键字签章、指定位置签章demopackage com.example.study.demo.pdfSign; import cn.hutool.core.date.DateUtil; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Image; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Date; import java.util.List; import java.util.Map; public class ItextTest { /** * 指定位置盖章 */ public static void main1(String[] args) throws Exception { String dateStr = DateUtil.format(new Date(),"yyyyMMdd-HHmm"); String inputPdf = "D://test//pdf//test2.pdf"; String outputPdf = "D://test//pdf//指定位置签章-itext-".concat(dateStr).concat(".pdf"); String stampImage ="D://test//pdf//zhang.png"; ByteArrayOutputStream memoryStream = readFileToMemoryStream(inputPdf); PdfReader reader = new PdfReader(memoryStream.toByteArray()); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputPdf)); Image image = Image.getInstance(stampImage); //设置签字图片宽高 image.scaleToFit(100, 100); PdfContentByte content; Rectangle pageSize; int pageCount = reader.getNumberOfPages(); for(int i=1; i String dateStr = DateUtil.format(new Date(),"yyyyMMdd-HHmm"); String inputPdf = "D://test//pdf//test2.pdf"; String outputPdf = "D://test//pdf//关键字签章-itext-".concat(dateStr).concat(".pdf"); String stampImage ="D://test//pdf//zhang.png"; // 要盖章的关键字 String keyword = "张三看看"; // 关键字位置信息map Map map = FindKey.keyWordLocationMap(inputPdf,keyword); ByteArrayOutputStream memoryStream = readFileToMemoryStream(inputPdf); PdfReader pdfReader = new PdfReader(memoryStream.toByteArray()); PdfStamper pdfStamper = new PdfStamper(pdfReader, Files.newOutputStream(Paths.get(outputPdf))); Image image = Image.getInstance(stampImage); //设置签字图片宽高 image.scaleAbsolute(100, 100); int pageCount = pdfReader.getNumberOfPages(); for(int i=1; i //签章图片位置坐标 float absoluteX = keyWordInfo.getX() + keyWordInfo.getWidth()/2 - image.getScaledWidth()/2 ; float absoluteY = keyWordInfo.getY() + keyWordInfo.getHeight()/2 - image.getScaledHeight()/2; image.setAbsolutePosition(absoluteX, absoluteY); content.addImage(image); } } pdfStamper.close(); pdfReader.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; } } |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |