热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java实现pdf定位签章

很多时候,在项目中需要打单子,生成pdf格式,还需要盖章。这个时候,就需要对pdf文件进行再次处理。处理的方式就是:1、获取要处理的位置2、将要盖章的图片添加上去代码如下:publ


很多时候,在项目中需要打单子,生成pdf格式,还需要盖章。

这个时候,就需要对pdf文件进行再次处理。

处理的方式就是:

1、获取要处理的位置

2、将要盖章的图片添加上去

代码如下:

public void printSign(OutputStream outputStream){
List keyWords = new ArrayList();
keyWords.add("打印人,打印机构");//支持多关键字,默认选择第一个找到的关键字
PdfReader pdfReader;
PdfStamper pdfStamper;
try {
pdfReader = new PdfReader(((ByteArrayOutputStream)outputStream).toByteArray());
pdfStamper = new PdfStamper(pdfReader, outputStream);
List> arrayLists = findKeywords(keyWords, pdfReader);//查找关键字所在坐标
//一个坐标也没找到,就返回
if (ObjectUtil.isEmpty(arrayLists)) {
return;
}
if (!ObjectUtil.isEmpty(arrayLists.get(0))) {
for (int i=0; i> findKeywords(final List keyWords, PdfReader pdfReader) {
if (keyWords == null || keyWords.size() == 0) {
return null;
}
int pageNum = pdfReader.getNumberOfPages();
final List> arrayLists = new ArrayList>(keyWords.size());
for (int k=0; k List positiOns= 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() {
private StringBuilder pdfsb = new StringBuilder();
private float yy = -1f;
@Override
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.setLength(0);
}
pdfsb.append(text);
if (pdfsb.length()>0) {
for (int j=0; j List key_words = ListUtil.parseList
(keyWords.get(j), ",");
//假如配置了多个关键字,找到一个就跑
for (final String key_word : key_words) {
if (arrayLists.get(j) != null)
{
break;
}
if (pdfsb.length()>0 && pdfsb.toString
().contains(key_word)) {
float[] resu = new float[3];
resu[0] = boundingRectange.x +
boundingRectange.width * (key_word.length()-1);
resu[1] = boundingRectange.y;
resu[2] = finalI;
arrayLists.get(j).add(resu);
pdfsb.setLength(0);
break;
}
}
}
}
}
@Override
public void renderImage(ImageRenderInfo arg0) {
//renderImage
}
@Override
public void endTextBlock() {
//endTextBlock
}
@Override
public void beginTextBlock() {
//beginTextBlock
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
return arrayLists;
}
public static List parseList(String source, String regex) {
if (source == null || "".equals(source)) {
return null;
}
List strList = new ArrayList();
if (regex== null || "".equals(regex)) {
strList.add(source);
} else {
String[] strArr = source.split(regex);
for (String str : strArr) {
if (str!= null || !"".equals(str)) {
strList.add(str);
}
}
}
return strList;
}

1、将上面的代码考到项目中,把该导的包导好。该方法所需的类都在iTextpdf里 https://download.csdn.net/download/esc_tab_end/10730983 。如果你的报表里还需要什么条形码生成的。可以下载条形码所需的包: https://download.csdn.net/download/esc_tab_end/10730999

2、然后调用printSign方法。

2.1 printSign方法入参是pdf的二进制流对象。

2.2 还有就是关键字写上自己所需要的关键字就行了。方法内的代码都是现成的,不需要改动,若有特殊需求可以自己微调。

注意:pdf中的关键字的字体必须是中文字体,例如:宋体,黑体,楷体等等。如果pdf生成的时候关键字是用英文字体例如:Arial,Dialog等等这些。

效果图如下:

在这里插入图片描述



推荐阅读
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • JavaScript 中创建对象的多种方法
    本文详细介绍了 JavaScript 中创建对象的几种常见方式,包括对象字面量、构造函数和 Object.create 方法,并提供了示例代码和属性描述符的解释。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 在本教程中,我们将深入探讨如何使用 Python 构建游戏的主程序模块。通过逐步实现各个关键组件,最终完成一个功能完善的游戏界面。 ... [详细]
  • 中科院学位论文排版指南
    随着毕业季的到来,许多即将毕业的学生开始撰写学位论文。本文介绍了使用LaTeX排版学位论文的方法,特别是针对中国科学院大学研究生学位论文撰写规范指导意见的最新要求。LaTeX以其精确的控制和美观的排版效果成为许多学者的首选。 ... [详细]
  • 本文详细介绍了福昕软件公司开发的Foxit PDF SDK ActiveX控件(版本5.20),并提供了关于其在64位Windows 7系统和Visual Studio 2013环境下的使用方法。该控件文件名为FoxitPDFSDKActiveX520_Std_x64.ocx,适用于集成PDF功能到应用程序中。 ... [详细]
  • 本文介绍了如何利用Python进行批量图片尺寸调整,包括放大和等比例缩放。文中提供了详细的代码示例,并解释了每个步骤的具体实现方法。 ... [详细]
  • 本文介绍了在Java环境中使用PDFBox和XPDF工具从PDF文件中提取文本内容的方法。重点讨论了处理中文字符集及解决相关错误的技术细节,特别是针对某些特定格式的PDF文件(如网上填写的报名表和下载的论文)遇到的问题及解决方案。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • Kubernetes 持久化存储与数据卷详解
    本文深入探讨 Kubernetes 中持久化存储的使用场景、PV/PVC/StorageClass 的基本操作及其实现原理,旨在帮助读者理解如何高效管理容器化应用的数据持久化需求。 ... [详细]
  • 异常要理解Java异常处理是如何工作的,需要掌握一下三种异常类型:检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常ÿ ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
author-avatar
木易_迪迪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有