我是如何接触到PDFBox的

疫情期间,周末在家老实呆着,女友在学法律,但女友学习法律的pdf文件资料里每页都有一些类似培训机构联系方式的一些文字,共三四百页,用普通的编辑软件删除不了,如果要删除的话必须开通会员,也可能我没找到免费的软件吧,我国的办公编辑软件也真够可以的了,编辑个PDF还要收费,我是程序员,也明白软件开发需要成本和消耗,但如果作为大众使用者还是接受不了收费软件.于是乎,作为猿的我只能自己研究下怎么自己写代码去掉那些不怎么好看的文字,上网查找资料有哪些基于Java的类库可以读取PDF,就找到了很多猿都用的PDFBox,PDFBox同样是来自给我们猿贡献了很多免费软件的Apache基金会.

Apache PDFBox介绍

直接去官网Apache PDFBox,看版本已经发布到2.0了,首页说该类库的功能对PDF文件有:创建,提取文字,分割合并,填写表格,打印,另存为图片和加密功能,对于我的需求来说足够了,操作文档pdf操作内置对象文档,看不懂翻译即可

需求代码

我的需求是去掉PDF里每页的固定位置的文字(多余的培训机构的联系方式),以下称"多余部分",但我经过测试发下,哪些其实不是文字而是图片,整页是一张大图片,那更好操作了,首先maven引入dependency你懂得,计划为共分为三步.

1.先把pdf三四百页,以每页为一张图片导出来

/*** pdf 转换为图片* @param pdfPath pdf文件路径* @param imgPath 图片导出目标路径*/
public static void getImgInPDF(String pdfPath,String imgPath){PDDocument document = null;try {File pdfFile = new File(pdfPath);// 加载pdf文档,在pdmodel包document = PDDocument.load(pdfFile);// PDF文档总页数System.out.println("共 "+num+" 页.");// PDF文档渲染对象,在rendering包PDFRenderer renderer = new PDFRenderer(document);String startDate = DateTool.now();int pageCount = document.getNumberOfPages();System.out.println("共 "+pageCount+" 页.");for (int i = 0; i < pageCount; i++) {/*** renderImage(i,1.9f)* * i: 指定页对象下标,从0开始,0即第一页* * 1.9f:DPI值(Dots Per Inch),官方描述比例因子,其中1=72 DPI*      DPI是指每英寸的像素,也就是扫描精度,DPI越低,扫描的清晰度越低*      根据根据自己需求而定,我导出的图片是 927x1372*/BufferedImage image = renderer.renderImage(i,1.9f);// 导出图片命名为:0-n.jpegImageIO.write(image, "JPEG", new File(imgPath+i+".jpeg"));System.out.println("导出 "+imgPath+i+".jpeg...");}System.out.println("开始时间:"+startDate);System.out.println("结束时间:"+ DateTool.now());}catch (Exception e){e.printStackTrace();}
}

2.java操作图片去掉固定位置的RGB(多余部分), 这部操作简单了

/*** 设置图片的指定区域为指定颜色* @param imgPath 图片路径*/
public static void cleanImgRgb(String imgPath){try{String startDate = DateTool.now();File dir = new File(imgPath);File[] img = dir.listFiles();// 处理imgPath中所有带jpeg后缀的图片for (int i = 0; i < img.length; i++) {String imgName =  img[i].getName();if(imgName.contains("jpeg")){System.out.println("正在处理:"+imgName);BufferedImage bufImage = ImageIO.read(new File(imgPath+imgName));int rgb = 0xffffff; // 替换多余部分为白色rgbint width = 470;// 替换区域宽int height = 34;// 替换区域高int startX = 230;// 替换区域x开始点int startY = 16;// 替换区域y开始点// rgb颜色数组,替换多余部分的width*height的总数int[] rgbArray = new int[width*height];for (int j = 0; j < width*height; j++) {rgbArray[j] = rgb;}bufImage.setRGB(startX,startY,width,height,rgbArray,0,width);FileOutputStream out = new FileOutputStream(imgPath+imgName);ImageIO.write(bufImage, "JPEG",out);}}System.out.println("开始时间:"+startDate);System.out.println("结束时间:"+ DateTool.now());}catch (Exception e){e.printStackTrace();}
}

3.再把处理过后的图片对应的插入到PDF每页里面,并覆盖以前,这步最重要!!!

/*** 插入图片到pdf,400+张依次插入到pdf的400+页中* @param pdfPath pdf路径* @param imgPath 要插入的图片路径(正是第一步的图片路径)* @param start  插入pdf开始页* @param end    插入pdf结束页*/
private static void imgInsertToPdf(String pdfPath,String imgPath,int start,int end){try {System.out.println("图片路径:"+imgPath);File file = new File(pdfPath);PDDocument document = PDDocument.load(file);int pageSie = document.getNumberOfPages();System.out.println("pdf总页数:"+pageSie);int insert = 0;System.out.println("开始时间:"+ DateTool.now());for (;start <=end; start++) {insert++;String img = imgPath+start+".jpeg";System.out.println("第"+(start+1)+"个文件,图片"+img);// 当前页PDPage page = document.getPage(start);File imgFile = new File(img);if(imgFile.exists() && imgFile.getName().endsWith( ".jpeg" ) ){//根据图片路径创建一张图片PDImageXObject pdImage = PDImageXObject.createFromFile(img,document);/*** (document, page,false, true)*  document: pdf对象*  page :    当前页对象*  false :   是否是追加内容,false不追加,清空之前的内容*  true :    是否压缩*/PDPageContentStream contents = new PDPageContentStream(document, page,false, true);/*** 比例值*  如果pdf页大,图片小,可调整此值放大图片沾满*  建议值 0-1*/float scale = 0.527f;// 绘制开始的xy点contents.drawImage(pdImage, 0, 0, pdImage.getWidth() * scale, pdImage.getHeight() * scale);contents.close();//Saving the document 保存文档document.save(pdfPath);}else{break;}}System.out.println("插入次数:"+insert);System.out.println("结束时间:"+ DateTool.now());System.out.println("插入完毕.....");//Closing the documentdocument.close();}catch (Exception e){e.printStackTrace();}
}

PDFBox常用API,更多看官网

// pdf路径
String pdfPath = "/Users/Documents/pdf_file.pdf";
File file = new File(pdfPath);
// 加载pdf
PDDocument document = PDDocument.load(file);
/*** 1.读取pdf文本*/// 文本分离器
PDFTextStripper textStripper = new PDFTextStripper();
// 输出pdf的文本内容
System.out.println(textStripper.getText(document));/*** 2.删除页面,存在的页,从0开始*/
document.removePage(2);
// 获取总页数
document.getNumberOfPages();
/*** 3.添加页面*/
PDPage my_page = new PDPage();
document.addPage(my_page);
// 保存pdf
document.save("Path");/*** 4.插入图像*/
// 获取pdf中的图片
PDFRenderer renderer = new PDFRenderer(document);
// 后去指定页的图像
BufferedImage image = renderer.renderImage(0);
// 另存到
ImageIO.write(image, "JPEG", new File("/Users/Documents/pdf_img.jpg"));/*** 5.合并pdf文档*/
File pdf1 = new File("F:/worksp/pdfbox/pdf_1.pdf");
PDDocument doc1 = PDDocument.load(pdf1);
File pdf2 = new File("/Users/Documents/pdf_2.pdf");
PDDocument doc2 = PDDocument.load(pdf2);
// 合并后的文件
PDFMergerUtility merger = new PDFMergerUtility();
merger.setDestinationFileName("/Users/Documents/merger.pdf");
merger.addSource(file1);
merger.addSource(file2);
// 合并
merger.mergeDocuments();
doc2.close();
doc1.close();// 关闭
document.close();

PDFBox操作pdf文件转换为图片相关推荐

  1. Java使用PDFBox操作PDF文件

    1首先,导入jar (maven方式导入) PS: 这个jar里面囊括了所有的pdfbox操作工具类,导入这一个就够了 <dependency><groupId>org.apa ...

  2. java调用pdfbox转pdf文件为图片文件,有中文时在windows上正常,部署到linux下乱码

    最近遇到了一个很头疼的问题,我们的项目移动端需要一个读pdf的功能,但是手机端开发人员说移动端是用jquerymobile做的,不能直接甩pdf文件过去(原因是pdf文件太大),于是乎我们想到了2个解 ...

  3. 使用 Apache PDFBox 操作PDF文件

    简介 Apache PDFBox库是一个用于处理PDF文档的开源Java工具.该项目允许创建新的PDF文档,操作现有PDF文档,并从PDF文档中提取内容.Apache PDFBox还包括几个命令行实用 ...

  4. Java使用PDFBOX操作pdf文件(一,加载和创建pdf)

    前言: 之前想学习使用Java操作pdf的时候看过了IText的文档.确实IText的文档很全,也有一个官网可以很方便的查找信息.但IText的开源协议为AGPL,使用者必须传染性的开源代码,商业使用 ...

  5. pdfbox 第一页加内容_Java使用PDFBox操作PDF文件获取页码、文章内容、缩略图

    一.依赖 com.sleepycat je 5.0.73 org.apache.pdfbox pdfbox 2.0.8 二.实现代码 import lombok.extern.slf4j.Slf4j; ...

  6. Cannot resolve javax.media:jai_core:1.1.3(pdf文件转换为图片的依赖出错)

    最近我在使用java完成pdf转图片时需要用到一个依赖是 但是导入时缺报错了!说Cannot resolve javax.media:jai_core:1.1.3 这里我也找到了解决方案,在这里教大家 ...

  7. 将PDF文件转换为高质量的图片:免费的在线PDF转换器

    在现代社会中,PDF文档是非常常见的一种文档格式.但是,在某些情况下,我们需要将PDF文件转换为高质量的图片,以方便分享和展示.本文将介绍几款免费的在线PDF转换器,帮助您将PDF文件快速.简单地转换 ...

  8. PDF文件转图片怎么弄?这个方法值得收藏

    PDF文件是一种广泛使用的文件格式,其保留了原始文档的格式和内容,使其在不同平台上具有高度的兼容性.然而,在某些情况下,我们需要将PDF文件转换为图片格式以便于处理和分享.本文将介绍两种方法将PDF文 ...

  9. php生成图片文件流,php如何将base64数据流文件转换为图片文件?

    2017-03-07 在开发中,自己遇到一个前端在上传图片的时候,使用的base64数据流文件显示的图片. 也就是说 ***image/后面的jpg是我们的图片文件格式,(base64,)后面的很大一 ...

最新文章

  1. 如何用eclipse操作MySQL数据库进行增删改查?
  2. 干货丨一文看懂什么是“自然语言处理”
  3. java $.class_java文件编译后额外生成的$1.class是怎么一回事
  4. SOCK开发之---TCP/IP简介
  5. 加密货币究竟是不是泡沫?
  6. NIST 发布关于使用“行政令-关键软件”的安全措施指南
  7. 常用的消息摘要算法小总结
  8. 在云栖小镇,新华三呈现物联网金秋硕果
  9. 在命令行中创建Django项目
  10. VMware卸载后再安装时网络连接处没有虚拟网卡
  11. UIImageJPEGRepresentation 使用中存在的问题
  12. js对象扁平化:Javascript对象进行扁平化处理
  13. 数据残酷物语:北上广深租房图鉴
  14. 【HBase】HBase数据库基本操作(Shell)
  15. webpack多入口
  16. IDEA中maven项目右边Dependencies报错飘红
  17. T-SQL 计算固定资产折旧(直线法)
  18. 1.1 DB DBMS DBA DBS简述
  19. 求两数之间的偶数或奇数的和.
  20. 转] Python 爬虫的工具列表 附Github代码下载链接

热门文章

  1. 应用最广泛的8位单片机当然也是初学者们最容易上手学习的单片机
  2. 拼多多,是真相还是谣言,原来是戏言
  3. Pandas的 loc iloc ix 区别
  4. java socket同步_Java socket客户端与服务端同步通信实例
  5. 重新定义 NFT (音乐、四维、隐私、交互)——上篇
  6. 云知梦WEB前端开发[最新全套]价值381元
  7. C语言典型代码---SSDP设备发现
  8. Matlab中unwrap函数内容详解
  9. STM32应用(二)测速模块、寻迹模块、数码管显示、TFT显示屏
  10. java版快速排序详解