首页 > 编程语言 >java 用PDFBox 删除 PDF文件中的某一页

java 用PDFBox 删除 PDF文件中的某一页

时间:2023-08-04 13:32:02浏览次数:46  
标签:java name int param String static PDF document PDFBox

依赖:


  1. org.apache.pdfbox
  2. pdfbox-app
  3. 1.8.10

java 用PDFBox 删除 PDF文件中的某一页,前n页,后n页,效率低,不推荐使用

  1. package com.everjiankang;

  2. import java.io.File;

  3. import org.apache.pdfbox.pdmodel.PDDocument;

  4. /**运行效率很慢,因为每次删除一页就读取和保存一次文件,初始文件名格式:xxxx0.pdf*/
  5. public class Test {
  6. static String name_pre = "C:\\log\\jvm"; //文件名前缀
  7. static String name_after = ".pdf";//文件名后缀
  8. public static void main(String[] args) {
  9. //1.刪除前n頁
  10. // cutPdfPreNPage(2);
  11. //2.刪除后n頁
  12. cutPdfAfterNPage(5);
  13. //3.刪除第n頁
  14. cutPdf(name_pre + 0 + name_after,name_pre + (0+1) + name_after,7);//删除第n页
  15. }

  16. /**
  17. * 删除前n页
  18. * @param n
  19. */
  20. public static void cutPdfPreNPage(int n) {
  21. for(int i = 0; i < n; i++)
  22. cutPdf(name_pre + i + name_after,name_pre + (i+1) + name_after,0);
  23. }

  24. /**
  25. * 删除后n页
  26. * @param n
  27. */
  28. public static void cutPdfAfterNPage(int n) {
  29. for(int i = 0; i < n; i++)
  30. cutPdf(name_pre + i + name_after,name_pre + (i+1) + name_after,1);
  31. }

  32. /**
  33. *
  34. * @param pdfPath 旧路径
  35. * @param newPdfPath 新路径
  36. * @param flag 0:第一页;1:最后一页 ;else : 要删除的页码
  37. */
  38. public static void cutPdf(String pdfPath,String newPdfPath, int flag)
  39. {
  40. File file = new File(pdfPath);
  41. PDDocument document = new PDDocument();
  42. try{
  43. document = PDDocument.load(file);
  44. }catch(Exception e){
  45. e.printStackTrace();
  46. }
  47. int noOfPages = document.getNumberOfPages();
  48. System.out.println(noOfPages);
  49. if(flag == 0)
  50. document.removePage(0);
  51. else if(flag == 1) {
  52. document.removePage(noOfPages-1);
  53. } else {
  54. document.removePage(flag-1);
  55. }
  56. try{
  57. document.save(newPdfPath);
  58. document.close();
  59. }catch(Exception e){
  60. e.printStackTrace();
  61. }
  62. System.out.println("已经转完了哦");

  63. }
  64. }

抽取任意范围的PDF页作为新的PDF. 效率高

依赖


  1. com.itextpdf
  2. itextpdf
  3. 5.5.13

代码

  1. /**
  2. * 截取pdfFile的第from页至第end页,组成一个新的文件名
  3. * @param pdfFile 需要分割的PDF
  4. * @param savepath 新PDF
  5. * @param from 起始页
  6. * @param end 结束页
  7. */
  8. public static void splitPDFFile(String respdfFile,
  9. String savepath, int from, int end) {
  10. Document document = null;
  11. PdfCopy copy = null;
  12. try {
  13. PdfReader reader = new PdfReader(respdfFile);
  14. int n = reader.getNumberOfPages();
  15. if(end==0){
  16. end = n;
  17. }
  18. ArrayList<String> savepaths = new ArrayList<String>();
  19. String staticpath = respdfFile.substring(0, respdfFile.lastIndexOf("\\")+1);
  20. //String savepath = staticpath+ newFile;
  21. savepaths.add(savepath);
  22. document = new Document(reader.getPageSize(1));
  23. copy = new PdfCopy(document, new FileOutputStream(savepaths.get(0)));
  24. document.open();
  25. for(int j=from; j<=end; j++) {
  26. document.newPage();
  27. PdfImportedPage page = copy.getImportedPage(reader, j);
  28. copy.addPage(page);
  29. }
  30. document.close();

  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. } catch(DocumentException e) {
  34. e.printStackTrace();
  35. }
  36. }

标签:java,name,int,param,String,static,PDF,document,PDFBox
From: https://blog.51cto.com/chengzheng183/6960903

相关文章

  • Java中如何向一个string类型的数组中添加数据
    在Java中,String类型的数组是固定长度的,一旦创建后就无法改变其长度。如果你需要向一个String类型的数组中添加数据,可以考虑使用ArrayList或LinkedList等可变长度的集合类型来代替。使用 ArrayList,你可以通过调用add()方法来向集合中添加元素,例如://创建一个ArrayList......
  • 现在面试都会问什么?(PDF高清下载)
    前几天在网上看到一个北漂程序员的真实遭遇:“被裁整整一个月了,面试了22家,一个offer都没有拿到”这样的遭遇,确实不得不让人怀疑人生啊……虽说现在确实大环境不太好,被裁员的人也是很多,但是也不至于面试惨到如此地步吧?不过现在的企业和面试官,对于Java程序员的要求确实是越来越高,他们......
  • java锁总结
    Java中的锁主要用于保障多并发线程情况下数据的一致性。在多线程编程中为了保障数据的一致性,我们通常需要在使用对象或者方法之前加锁,这时如果有其他线程也需要使用该对象或者该方法,则首先要获得锁,如果某个线程发现锁正在被其他线程使用,就会进入阻塞队列等待锁的释放,直到其他线程......
  • 为了成为Java大牛,我决定手写个JVM~
    JVM对我们很多人来说就像个黑盒子,无从下手,但是又是我们JavaCoder不得不去深入研究的一门技术国内玩JVM的大牛很少,知名的就那么几个,而玩好JVM又教好JVM的人更是少之又少。今天给大家介绍其中一位,江湖人送外号道格牙的子牙老师。下面的时间,交给他。哈喽,我就是江湖人送外号[......
  • 反内卷 | Java程序员不可错过的10本书!
    大家好,我是飘渺。又到了一年一度的双11了,想必不少小伙伴打算趁此机会入手几本好书。在此我也为大家整理了一份书单,如果你还在纠结犹豫,不妨看看我为整理的这几本。PS:今年京东的图书活动大致如下:活动一“多买优惠”,即:1件7.5折,两件6.5折活动二:“满减”,即:每满100-50这两个活动结算的时......
  • JavaSE--标识符与关键字
    一、标识符1、标识符可以标识那些:类名、方法名、变量名、接口名、常量名......注意:主方法中main也是标识符,但是不能修改,因为main时sun公司规定的固定的2、标识符命名规则标识符只能由数字、字母、下划线、美元符号$、中文,不能有其他符号不能以数字开头关键字不能做为标识......
  • 《介绍篇》c#为什么能在桌面应用上战胜java
    参考链接:https://blog.csdn.net/weixin_39539761/article/details/114158817参考链接:http://it.cha138.com/shida/show-5705680.htmljava语言确实是一种比较不错的语言。相比于C,C++等语言来说,java是移植性和语言的形式上都是非常优秀,尤其是Web开发和Android移动应用开发方面,可以......
  • Java 诊断工具 Arthas 教程学习笔记
    Java诊断工具Arthas教程学习笔记 Java诊断利器Arthas,是阿里的一款开源工具。Github-alibaba/arthas 上可以看到它的介绍。了解它,主要是最近对分析Java错误堆栈比较感兴趣,机缘巧合看到了它。本文记录的内容,就是基于它官网的文档摘抄的,涉及的截图可能由于篇幅有限,不是......
  • Java面试题 P59:微服务篇:分布式系统理论-CAP和BASE
           ......
  • Java反射与自定义注解实现不同Bean属性映射的高效解决方案
    假设现有一个叫user的bean,里面有username、passsword、sex、createTime这四个属性,需要实现一个功能,把其它bean里的字段分别映射到user里的username、passsword、sex、createTime这几个属性上,然后可以根据其它的bean的实例自动转化为user的实例(填充对应属性值),下面是代码实现。Java......