当前位置: 首页 > news >正文

潍坊做网站好看学做衣服网 缤纷网站

潍坊做网站好看,学做衣服网 缤纷网站,wordpress首页轮播,沃通 wordpressJava 实现给pdf文件指定位置盖章功能 开发中遇到一个需求, 需要给用户上传的的pdf文件, 指定位置上盖公章的功能, 经过调研和对比, 最终确定实现思路. 这里是使用pdf文件中的关键字进行章子的定位, 之所以这样考虑是因为如果直接写死坐标的话, 可能会出现因pdf大小, 缩放, 盖章…

Java 实现给pdf文件指定位置盖章功能

开发中遇到一个需求, 需要给用户上传的的pdf文件, 指定位置上盖公章的功能, 经过调研和对比, 最终确定实现思路.

这里是使用pdf文件中的关键字进行章子的定位, 之所以这样考虑是因为如果直接写死坐标的话, 可能会出现因pdf大小, 缩放, 盖章位置变更的原因, 导致公章位置错位. 所以选择了根据关键字定位的方式.

下面列出具体的实现方式:

  1. 使用的是Java语言, 使用Maven管理依赖, 下面是操作pdf所依赖的库的坐标

    <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.12</version>
    </dependency>
    <dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
    </dependency>
    
  2. 下面是具体的代码逻辑

    • CustomRenderListener, 自定义渲染监听器, 实现查找关键字自有逻辑

      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 lombok.Data;/*** pdf关键词帮助类** @author wdhcr*/
      @Data
      public class CustomRenderListener implements RenderListener {// 坐标private float[] coordinate = null;// 关键字private String keyWord;// pdf当前页private int page;@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 boundingRange = textRenderInfo.getBaseline().getBoundingRectange();coordinate = new float[3];coordinate[0] = boundingRange.x;coordinate[1] = boundingRange.y;coordinate[2] = page;}}
      }
      
    • 获取关键字坐标的工具类

      import com.itextpdf.text.Image;
      import com.itextpdf.text.pdf.PdfContentByte;
      import com.itextpdf.text.pdf.PdfGState;
      import com.itextpdf.text.pdf.PdfReader;
      import com.itextpdf.text.pdf.PdfStamper;
      import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
      import com.jkwl.common.exception.BaseException;
      import lombok.SneakyThrows;
      import lombok.extern.slf4j.Slf4j;import java.io.*;/*** Pdf定位工具类* @author wdhcr*/
      @Slf4j
      public class PdfUtils {/*** 获取关键字所在PDF坐标** @param pdfReader 流* @param keyWords  关键词* @return float[] 坐标*/public static float[] getKeyWords(PdfReader pdfReader, String keyWords) {float[] coordinate = null;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);coordinate = renderListener.getCoordinate();if (coordinate != null) {break;}}} catch (IOException e) {e.printStackTrace();}return coordinate;}@SneakyThrowspublic static void stampToPdf(InputStream pdfInputStream, String keyWords, InputStream sealInputStream, OutputStream outputStream) {byte[] sealBytes = sealInputStream.readAllBytes();PdfReader reader = new PdfReader(pdfInputStream);float[] xyz = PdfUtils.getKeyWords(reader, keyWords);if (xyz == null) {throw new BaseException("未找到盖章位置");}PdfStamper stamper = new PdfStamper(reader, outputStream);// 将印章图片放在pdf文件的第?页PdfContentByte over = stamper.getOverContent((int) xyz[2]);// 需要插入的图片Image contractSealImg = Image.getInstance(sealBytes);// 保存状态over.saveState();// 图片处理PdfGState pdfGState = new PdfGState();// 给图片设置透明度,一般不需要pdfGState.setFillOpacity(0.8F);over.setGState(pdfGState);contractSealImg.setAbsolutePosition(xyz[0] + 50, xyz[1] - 40);// 设置图片大小contractSealImg.scaleAbsolute(100, 100);// 将图片添加到pdf文件over.addImage(contractSealImg);over.restoreState();stamper.setFormFlattening(true);// 关闭流stamper.close();reader.close();}}
      
    • 测试demo

          @SneakyThrowspublic static void main(String[] args) {FileInputStream pdfInputStream = new FileInputStream("/Users/Desktop/报告模版.pdf");FileInputStream sealInputStream = new FileInputStream("/Users/Desktop/dbd.png");FileOutputStream fileOutputStream = new FileOutputStream("/Users/Desktop/报告模版盖章.pdf");// 关键字为: 签发日期PdfUtils.stampToPdf(pdfInputStream, "签发日期", sealInputStream, fileOutputStream);fileOutputStream.close();pdfInputStream.close();sealInputStream.close();System.out.println("盖章完成");}
      
    • 公章如图所示

      seal

    • 报告模版如下:

      image-20241211145537180

    • 盖完章后

      image-20241211145618814

http://www.yayakq.cn/news/140676/

相关文章:

  • 同一个域名在一个服务器做两件网站如何管理网站页面设计
  • 网站模板中文dedecms网站备份
  • 设计国外网站有哪些免费找精准客户软件
  • 做网站怎样租用虚拟空间茶叶公司网站建设策划书
  • 做公司网站备案可以个人网店交易平台网站建设
  • 域名推荐网站全网营销整合营销
  • 网站制作深什么网站好
  • 平面设计网站源码徐州10年网站建设 推广公司
  • 校园网站建设和管理工作制度福州seo技巧培训
  • 嘉兴网站制作多少钱企业解决单身问题方案
  • 合肥做网站的公番禺网站制作 优帮云
  • 电商 网站 降低 跳出率 措施 效果开个小公司需要多少钱注册
  • 营销型网站建设托管网店运营管理与营销推广
  • 济宁网站建设方面好的做详情页的网站有哪些
  • wordpress自带站内搜索功能做图书网站赚钱吗
  • 做民宿怎么登录网站网站转化低的原因
  • 深圳做手机网站天津网上办事大厅官网入口
  • 陇西网站建设 室内设计培训机构老师何去何从
  • 自己可以接单做网站吗会展设计说明
  • 成都网站空间创新互联重庆建网站要多少钱
  • 深圳网站建设g商业中心 网站建设
  • 计算机怎么建设网站查公司名称是否已经被注册
  • 自贡企业网站建设公司wordpress错位
  • 网站建设算固定资产吗手机网站开发专业
  • 网站服务器租用价格 百度一下wordpress 发文章
  • 移动网站开发 公众号中国机械加工设备展会
  • 网站联系方式连接怎么做电脑怎么建网站
  • 天蓝色系网站设计怎么建设信息网站
  • 做商城网站哪里宁波模板建站定制网站
  • 天津市建设工程质量协会网站网站地图文件