获取pdf文件文字图片内容以及在PDF中插入图片

该功能用到如下jar包:

//获取图片数据public void huoqu() throws IOException {File file = new File("C:\\Users\\xiaomage\\Desktop\\123.pdf");PDDocument document = Loader.loadPDF(file);/* PDFTextStripper stripper = new PDFTextStripper();String text = stripper.getText(document);System.out.println(text);*/int allPages = document.getNumberOfPages();System.out.println(allPages);int count=0;for (int i = 0; i < allPages; i++) {System.out.println(i);PDPage page = document.getPage(i);PDResources resources = page.getResources();Iterable<COSName> xObjectNames = resources.getXObjectNames();if (xObjectNames != null){Iterator<COSName> iterator = xObjectNames.iterator();while (iterator.hasNext()){COSName key =  iterator.next();System.out.println("key:"+key);//if (resources.isImageXObject(key)){PDImageXObject image = (PDImageXObject) resources.getXObject(key);BufferedImage bImage = image.getImage();ImageIO.write(bImage, "PNG", new File("D:\\image\\"+"image_"+ (i+1) + "页" + count  + ".png"));count++;// }}}}}public static void main(String[] args) throws Exception {	File resultFile = new File("resultFile//"); //获取结果文件夹路径String resultPath=resultFile.getCanonicalPath();System.err.println(resultPath);logger.info("123");//获取结果文件夹路径File imgFile = new File("imgFile//"); //获取原始文件夹路径File sourceFile = new File("sourceFile//"); service(sourceFile, imgFile, resultPath);}//逻辑处理public static void service(File sourceFile,File imgFile,String resultPath) throws Exception{//失败结果File errorFile = new File(""); String errorPath=errorFile.getCanonicalPath(); String errorFileName=errorPath+"//error.txt";BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(errorFileName, true));//获取图片文件夹路径String imgPath=imgFile.getCanonicalPath(); //获取源文件名String sourcePath=sourceFile.getCanonicalPath(); List<String> sourcefileNameList=new ArrayList<String>();sourcefileNameList=getAllFiles(sourceFile, sourcefileNameList);if(sourcefileNameList!=null && sourcefileNameList.size()>0) {for(String sourcefileName: sourcefileNameList) {Map<String, String> mapResult= huoquText(sourcePath+"//"+sourcefileName, imgFile);if(mapResult.get("isTrue").equals("true")) {String imgName=mapResult.get("imgName");String imgNamePath=imgPath+"//"+imgName;//插入印章xiugai(sourcePath+"//"+sourcefileName, resultPath+"//"+sourcefileName, imgNamePath);bufferedWriter.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+":文件名称:"+sourcefileName+" 结果:success"+" \n");logger.info(sourcefileName+":"+mapResult.get("msg"));}else {logger.info(sourcefileName+":"+mapResult.get("msg"));bufferedWriter.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+":文件名称"+sourcefileName+" 结果:"+mapResult.get("msg")+" \n");}}}else {logger.info("原始文件夹没有文件");bufferedWriter.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+":sourceFile没有文件"+" \n");}bufferedWriter.flush();bufferedWriter.close();}
//获取文件夹里的文件public static List<String> getAllFiles(File folder, List<String> fileNameList) {File[] files = folder.listFiles(); // 获取文件夹中所有文件和子文件夹 if (files != null) {for (File file : files) {                // 如果是文件,则输出文件名String sfileName=file.getName(); fileNameList.add(sfileName);}}return fileNameList;}//获取文字数据public static  Map<String, String> huoquText(String fileNamePath,File imgFileS ) throws IOException {Map<String, String> map=new HashMap<String, String>();List<String> fileNameList=new ArrayList<String>();fileNameList=getAllFiles(imgFileS, fileNameList);if(fileNameList!=null && fileNameList.size()>0) {//File file = new File("C:\\Users\\xiaomage\\Desktop\\123.pdf");System.err.println(fileNamePath);File file = new File(fileNamePath);PDDocument document = Loader.loadPDF(file);PDFTextStripper stripper = new PDFTextStripper();String text = stripper.getText(document);String text1= text.replace("\r\n", "===");String text2=text1.split("===¥")[0];String text3=text2.substring(text2.lastIndexOf("===")+3, text2.length());System.err.println("text3:"+text3);boolean flag=false;for(String imgName: fileNameList) {String fileName=imgName.substring(0, imgName.indexOf("."));System.err.println("fileName:"+fileName);System.err.println("text fileName:"+fileName.equals(text3));if(fileName.equals(text3)) {map.put("isTrue", "true");map.put("imgName", imgName);map.put("msg", "success");flag=true;break;}}if(flag==false) {map.put("isTrue", "fail");	        	map.put("msg", "图库无该图片:文件路径"+fileNamePath);}}else {map.put("isTrue", "fail");      		map.put("msg", "图库无数据图片");}return map;}//插入图片public static void xiugai(String basepath,String reultpath,String imgpath) throws IOException {System.err.println(basepath);// 加载现有的PDF文档PdfDocument pdf = new PdfDocument();//pdf.loadFromFile("C:\\Users\\xiaomage\\Desktop\\123.pdf");pdf.loadFromFile(basepath);/*	由于使用  Spire.Pdf 生成的书签带有 Evaluation Warning : The document was created with Spire.PDF for .NET. 字样但是它只在第一页头部有显示,我们可以新增一页,并删掉第一页即可*/PdfPageBase pb = pdf.getPages().add(); //新增一页//删除pdf.getPages().remove(pb);//获取所需的页面PdfPageBase page = pdf.getPages().get(0);Rectangle2D pageSize = page.getMediaBox();Double pageWidth = pageSize.getWidth();Double pageHeight = pageSize.getHeight();System.err.println(pageWidth);System.err.println(pageHeight);//加载图像// PdfImage image = PdfImage.fromFile("C:\\Users\\xiaomage\\Desktop\\123.png");PdfImage image = PdfImage.fromFile(imgpath);//指定页面上图像区域的宽度和高度float width = image.getWidth() * 0.37f;float height = image.getHeight() * 0.37f;//指定 X 和 Y 坐标以开始绘制图像Double x = pageWidth-width-25;Double y = pageHeight-height-20;System.err.println(x);System.err.println(y);//在页面指定位置上绘制图像page.getCanvas().drawImage(image, x, y, width, height);//保存结果文档//pdf.saveToFile("C:\\Users\\xiaomage\\Desktop\\277.pdf");pdf.saveToFile(reultpath);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/487387.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C#】NET 9中LINQ的新特性-CountBy

前言 在 .NET 中,使用 LINQ 对元素进行分组并计算它们的出现次数时,需要通过两个步步骤。首先,使用 GroupBy方法根据特定键对元素进行分类。然后,再计算每个组元素包含个数。而随着 .NET 9 版本发布,引入了一些新特性。其中 LINQ 引入了一种新的方法 CountBy,本文一起来了…

若依集成更好用的easyexcel

背景 若依使用的是apach poi并在此基础上进行封装apach poi的原生的api是很复杂的&#xff0c;若依简化了了此操作apach poi的上传速率和下载速率都是没有优化的&#xff0c;依赖于文件大小的限制在此前提下&#xff0c;如果没法满足客户的需求&#xff08;超大型文件的上传&am…

阿里内部正式开源“Spring Cloud Alibaba (全彩小册)”

年轻的毕业生们满怀希望与忐忑&#xff0c;去寻找、竞争一个工作机会。已经在职的开发同学&#xff0c;也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而&#xff0c;面试人群众多&#xff0c;技术市场却相对冷淡&#xff0c;面试的同学们不得不面临着 1 个…

Android问题记录 - Inconsistent JVM-target compatibility detected for tasks

文章目录 前言开发环境问题描述问题分析解决方案补充内容最后 前言 前段时间升级Android Studio后修复了一堆问题&#xff0c;详情请看&#xff1a;Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0&#xff08;持续更新&#xff09;。我以为问题已经全部解决了…

分布式专题(1)之Redis持久化、主从与哨兵架构详解

一、Redis持久化 1.1 RDB快照&#xff08;snapshot&#xff09; 在默认的情况下&#xff0c;Redis将内存数据快照保存名字为&#xff1a;dump.rdb的二进制文件中&#xff0c;当然你在配置文件redis.conf中修改对应的二进制文件名。 redis开启RDB快照&#xff0c;可以在redis中…

Y20030053 JSP+SSM+MYSQL+LW+旅游系统的设计与实现 源码 配置 文档 全套资料

旅游系统的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 摘 要 随着旅游业的蓬勃发展和人们对休闲度假需求的不断增加&#xff0c;旅游业管理面临着越来越多的挑战。为了提高管理效率、优化客户体验并增强市场竞争力&#xff0c;本文介绍…

TypeScript进阶

Typescript进阶 基础知识 JavaScript 的核心特点就是灵活&#xff0c;但随着项目规模的增大&#xff0c;灵活反而增加开发者的心智负担。例如在代码中一个变量可以被赋予字符串、布尔、数字、甚至是函数&#xff0c;这样就充满了不确定性。而且这些不确定性可能需要在代码运行…

github操作学习笔记

git开源的分布式版本控制系统&#xff1a; 每次修改文件提交后&#xff0c;都会自动创建一个项目版本 查看git版本看有没有安装成功&#xff1a;git --version 把默认编辑器设置成vim&#xff1a;git config --global core.editor "vim" 1、设置昵称和邮箱&#xff…

QT 多级嵌套结构体,遍历成员--半自动。<模板+宏定义>QTreeWidget树结构显示

Qt的QTreeWidget来显示嵌套结构体的成员&#xff0c;并以树形结构展示。 #include <QApplication> #include <QTreeWidget> #include <QTreeWidgetItem> #include <QString> #include <cstdint>// 假设这些是你的结构体定义 struct BaseMeterPa…

简明速通Java接口

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文从代码层面直接整理Java接口 让老油子们无需再理解繁杂的概念了。 Java接口在代码层面是做什么的 说白了老铁&#xff0c;Java的接口就是一个类&#xff0c;这个类中只能声明属性和方法&#xff0c;属性需要…

2.linux中调度kettle

一.准备转换&#xff0c;等会在linux中用 1.添加excel输入组件&#xff0c;并添加对应的文件 2.添加列拆分为多行组件 3.添加文本文件输出组件 4.保存转换 二.linux安装java 1.把jdk-8u144-linux-x64.tar.gz上传到linux的/lx目录下 2. 解压jdk包&#xff0c;然后配置环境变量…

【C#设计模式(19)——备忘录模式(MementoPattern)】

前言 备忘录模式&#xff1a;将想要备份的信息交给备忘录对象来管理。通过设置初始、备份、修改、恢复等状态展示备忘录模式的使用。 代码 //备忘录类 public class Memento {private string state;public string State { get>state;}public Memento(string state){this.st…

如何将CSDN博客下载为PDF文件

1.打开CSDN文章内容 2.按键盘上的f12键&#xff08;或者右键—审查元素&#xff09;进入浏览器调试模式&#xff0c;点击控制台&#xff08;Console&#xff09;进入控制台 3.在控制台输入以下代码&#xff0c;回车 (function(){ $("#side").remove(); $("#…

GWAS分析先做后学

大家好&#xff0c;我是邓飞。 GWAS分析是生物信息和统计学的交叉学科&#xff0c;上可以学习编程&#xff0c;下可以学习统计。对于Linux系统&#xff0c;R语言&#xff0c;作图&#xff0c;统计学&#xff0c;机器学习等方向&#xff0c;都是一个极好的入门项目。生物信息如…

git命令基本操作

一、git介绍 Git 是一个开源的分布式版本控制系统&#xff0c;旨在提供一个快速、灵活且分布式的版本控制系统&#xff0c;能够处理从小型个人项目到大型复杂企业项目的各种规模的开发工作。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制…

快速了解 Aurora DSQL

上周在 AWS re:Invent大会&#xff08;类似于阿里云的云栖大会&#xff09;上推出了新的产品 Aurora DSQL[1] &#xff0c;在数据库层面提供了多区域、多点一致性写入的能力&#xff0c;兼容 PostgreSQL。并声称&#xff0c;在多语句跨区域的场景下&#xff0c;延迟只有Google …

大数据之国产数据库_OceanBase数据库002_在centos7.9上_安装部署OceanBase001_踩坑指南_亲测可用

部署前最好看一下,部署前的要求, 主要是系统 以及系统内核版本,还有比如清理一下缓存等,按照做一做. 这些都是前置条件. 清一下缓存. 也就是说官网给的前置的条件,都要根据说明去执行一遍,如果不执行可能后面安装会报错. 然后用户最好也去创建一个用户. 注意前置

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出&#xff0c;可以让开发者轻松地对实时数据进行处理&#xff0c;比如计数、聚合、…

Leecode刷题C语言之判断国际象棋棋盘中一个格子的颜色

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下 &#xff1a; bool squareIsWhite(char* s) {return s[0] % 2 ! s[1] % 2; } 解题思路&#xff1a; 这段代码的目的是判断一个给定的字符串 s 所表示的棋盘上的格子是否为白色。这里假设字符串 s 的前两个字符…

Oracle之表空间迁移

问题背景&#xff1a;一个数据表随着时间的累积&#xff0c;导致所在表空间占用很高&#xff0c;里面历史数据可以清除&#xff0c;保留近2个月数据即可 首先通过delete删除了2个月以前的数据。 按网上的教程进行空间压缩&#xff0c;以下sql在表所在用户执行: -- 允许表重新…