开源PDF工具 Apache PDFBox 认识及使用(知识点+案例)

打印 上一主题 下一主题

主题 1032|帖子 1032|积分 3096


一、认识PDFBox

一、认识PDFBox
Apache PDFBox库是一个开源的Java工具,专门用于处理PDF文档。它允许用户创建全新的PDF文件,编辑现有的PDF文档,以及从PDF文件中提取内容。
功能:创建、渲染、打印、合并、拆分、加密、解密、签名等多种操作PDF文件的功能,包括一个下令行工具,可以用于执行各种PDF处理任务。支持文本提取和搜索,以及将PDF转换为其他格式,如图片和文本。
应用场景:广泛应用于企业和开发者构建PDF处理相关的应用程序和工具。
Apache PDFBox具备以下重要功能:

  • 从PDF文件中提取Unicode文本。
  • 将单个PDF文件拆分成多个文件,或将多个PDF文件合并成一个。
  • 从PDF表单中提取数据,或填写PDF表单。
  • 验证PDF文件是否符合PDF/A-1b标准。
  • 使用标准的Java打印API打印PDF文件。
  • 将PDF文件另存为图像格式,如PNG或JPEG。
  • 从零开始创建PDF文件,包括嵌入字体和图像。
  • 对PDF文件举行数字签名。
一、pandas是什么?

示例:pandas 是基于NumPy 的一种工具,该工具是为了办理数据分析任务而创建的。
二、导入依靠

  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.apache.pdfbox</groupId>
  4.         <artifactId>pdfbox</artifactId>
  5.         <version>2.0.28</version>
  6.     </dependency>
  7. </dependencies>
复制代码
三、基础功能

demo1:读取pdf全部内容


  1. package com.changlu.demos;
  2. import org.apache.pdfbox.pdmodel.PDDocument;
  3. import org.apache.pdfbox.text.PDFTextStripper;
  4. import java.io.File;
  5. import java.net.URLDecoder;
  6. /**
  7. * @Description:
  8. * @Author: pipilin
  9. */
  10. public class Demo1 {
  11.     public static void main(String[] args) throws Exception{
  12.         //读取resources目录下input.pdf文件
  13.         String inputFile = URLDecoder.decode(Demo1.class.getClassLoader().getResource("input.pdf").getFile(), "UTF-8");
  14.         PDDocument pdDocument = PDDocument.load(new File(inputFile));
  15.         PDFTextStripper pdfTextStripper = new PDFTextStripper();
  16.         //读取pdf中所有的文件
  17.         String fullText = pdfTextStripper.getText(pdDocument);
  18.         System.out.println(fullText);
  19.     }
  20. }
复制代码

demo2:读取全部页内容(分页)


  1. package com.changlu;
  2. import org.apache.pdfbox.pdmodel.PDDocument;
  3. import org.apache.pdfbox.text.PDFTextStripper;
  4. import java.io.InputStream;
  5. /**
  6. * @Description:
  7. * @Author: pipilin
  8. */
  9. public class Main {
  10.     public static void main(String[] args) throws Exception{
  11.         //读取resources目录下input.pdf文件
  12.         InputStream is = Main.class.getClassLoader().getResourceAsStream("input.pdf");
  13.         PDDocument pdDocument = PDDocument.load(is);
  14.         PDFTextStripper pdfTextStripper = new PDFTextStripper();
  15.         //读取所有的分页
  16.         for (int i = 1; i <= pdDocument.getNumberOfPages(); i++) {
  17.             //设置起始-结束页  这里设置指定某页
  18.             pdfTextStripper.setStartPage(i);
  19.             pdfTextStripper.setEndPage(i);
  20.             //读取每一页
  21.             String pageText = pdfTextStripper.getText(pdDocument);
  22.             System.out.println(String.format("第%s页读取内容:", i));
  23.             System.out.println(pageText);
  24.         }
  25.     }
  26. }
复制代码

demo3:添加页眉、页脚

要求:页眉页脚居中显示。

  1. package com.changlu.demos;
  2. import com.changlu.Main;
  3. import org.apache.pdfbox.pdmodel.PDDocument;
  4. import org.apache.pdfbox.pdmodel.PDPage;
  5. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  6. import org.apache.pdfbox.pdmodel.font.PDType0Font;
  7. import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
  8. import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
  9. import java.io.File;
  10. import java.io.FileInputStream;
  11. import java.io.InputStream;
  12. import java.net.URLDecoder;
  13. import java.nio.file.Files;
  14. import java.nio.file.Paths;
  15. /**
  16. * @Description: 添加页眉、页脚
  17. * @Author: pipilin
  18. */
  19. public class Demo3 {
  20.     public static void main(String[] args) throws Exception{
  21.         //读取resources目录下input.pdf文件
  22.         InputStream is = Main.class.getClassLoader().getResourceAsStream("input.pdf");
  23.         PDDocument pdDocument = PDDocument.load(is);
  24.         //自定义字体 C:\Users\93997\Desktop\watermark tools\watermarkTools\target\classes\ttfs
  25.         //URLDecoder.decode() 方法来解码 URL 编码的路径,将 %20 转换回空格
  26.         String fontFile = URLDecoder.decode(Main.class.getClassLoader().getResource(File.separator + "ttfs" + File.separator + "Alibaba_PuHuiTi_2.0_65_Medium_65_Medium.ttf").getFile(), "UTF-8");
  27.         PDType0Font font = PDType0Font.load(pdDocument, new File(fontFile));
  28.         float fontSize = 10; // 设置字体大小为12
  29.         // 设置透明度状态对象
  30.         PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState();
  31.         graphicsState.setNonStrokingAlphaConstant(0.2f);
  32.         graphicsState.setAlphaSourceFlag(true);
  33.         graphicsState.setStrokingAlphaConstant(0.2f);
  34.         //设置新的页眉
  35.         String headerText = "咨询专转本默默学课程联系官方报名处QQ:xxxx51091,更多资料可加群xxxx03961";
  36.         String footerText = "江苏专转本公众号:xxx智慧树";
  37.         //遍历原先的pdf文档
  38.         for (PDPage page : pdDocument.getPages()) {
  39.             float pageWidth = page.getMediaBox().getWidth();
  40.             //计算页眉的居中位置
  41.             float headerTextWidth = font.getStringWidth(headerText) / 1000 * fontSize;
  42.             float headerCenteredX = (pageWidth - headerTextWidth) / 2; // 计算水平居中位置
  43.             //计算页脚的居中位置
  44.             float footerTextWidth = font.getStringWidth(footerText) / 1000 * fontSize;
  45.             float footerCenteredX = (pageWidth - footerTextWidth) / 2; // 计算水平居中位置
  46.             // 创建用于页眉的内容流
  47.             PDPageContentStream headerContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.APPEND, true, true);
  48.             headerContentStream.beginText(); // 开始文本操作
  49.             headerContentStream.setFont(font, fontSize); // 设置字体和字号
  50.             headerContentStream.newLineAtOffset(headerCenteredX, page.getMediaBox().getHeight() - 30); // 设置文本起始位置
  51.             headerContentStream.showText(headerText); // 绘制页眉内容
  52.             headerContentStream.endText(); // 结束文本操作
  53.             headerContentStream.close(); // 关闭内容流
  54.             // 添加页脚
  55.             PDPageContentStream footerContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.APPEND, true, true);
  56.             footerContentStream.beginText(); // 开始文本操作
  57.             footerContentStream.setFont(font, fontSize); // 设置字体和字号
  58.             footerContentStream.newLineAtOffset(footerCenteredX, 30); // 设置文本起始位置
  59.             footerContentStream.showText(footerText); // 绘制页脚内容
  60.             footerContentStream.endText(); // 结束文本操作
  61.             footerContentStream.close(); // 关闭内容流
  62.         }
  63.         //目标目录 Thread.currentThread().getContextClassLoader().getResource("").getPath()  当前工程目录路径
  64.         //String targetPDFPath = URLDecoder.decode(Demo3.class.getClassLoader().getResource("resources").getPath() + File.separator + "output.pdf", "UTF-8");
  65. //        String targetPDFPath = URLDecoder.decode(Main.class.getClassLoader().getResource("output.pdf").getFile(), "UTF-8");
  66.                 String targetPDFPath = "C:\\技术视频\\2024.1.20 水印工具 watermark tools\\watermarkTools\\src\\main\\resources\\output.pdf";
  67.         File outputFile = new File(targetPDFPath);
  68.         // 若是文件存在先进行删除
  69.         Files.deleteIfExists(Paths.get(outputFile.toURI()));
  70.         // 保存修改后的文档
  71.         pdDocument.save(outputFile);
  72.         System.out.println("转换任务:" + targetPDFPath + " 成功!");
  73.         // 关闭文档
  74.         pdDocument.close(); // 关闭文档
  75.     }
  76. }
复制代码
效果:

demo4:添加居中45°文字水印

要求:对pdf每页都添加上旋转45°水印,透明度为20%。

  1. package com.changlu.demos;
  2. import com.changlu.Main;
  3. import org.apache.pdfbox.pdmodel.PDDocument;
  4. import org.apache.pdfbox.pdmodel.PDPage;
  5. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  6. import org.apache.pdfbox.pdmodel.font.PDType0Font;
  7. import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
  8. import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
  9. import java.io.File;
  10. import java.io.InputStream;
  11. import java.net.URLDecoder;
  12. import java.nio.file.Files;
  13. import java.nio.file.Paths;
  14. /**
  15. * @Description: Apache PDFBox案例:对pdf每页都添加上旋转45°水印。
  16. * @Author: pipilin
  17. */
  18. public class Demo4 {
  19.     public static void main(String[] args) throws Exception{
  20.         //读取resources目录下input.pdf文件
  21.         InputStream is = Main.class.getClassLoader().getResourceAsStream("input.pdf");
  22.         PDDocument pdDocument = PDDocument.load(is);
  23.         //自定义字体 C:\Users\93997\Desktop\watermark tools\watermarkTools\target\classes\ttfs
  24.         //URLDecoder.decode() 方法来解码 URL 编码的路径,将 %20 转换回空格
  25.         String fontFile = URLDecoder.decode(Main.class.getClassLoader().getResource(File.separator + "ttfs" + File.separator + "Alibaba_PuHuiTi_2.0_65_Medium_65_Medium.ttf").getFile(), "UTF-8");
  26.         PDType0Font font = PDType0Font.load(pdDocument, new File(fontFile));
  27.         // 设置透明度状态对象
  28.         PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState();
  29.         graphicsState.setNonStrokingAlphaConstant(0.2f);
  30.         graphicsState.setAlphaSourceFlag(true);
  31.         graphicsState.setStrokingAlphaConstant(0.2f);
  32.         //设置水印名
  33.         String waterText = "江苏专转本网课报名vx:xxxxx";
  34.         //遍历原先的pdf文档
  35.         for (PDPage page : pdDocument.getPages()) {
  36.             float pageWidth = page.getMediaBox().getWidth();
  37.             float pageHeight = page.getMediaBox().getHeight();
  38.             //添加水印   要求:旋转45°,不透明度30%
  39.             float waterTextWidth = font.getStringWidth(waterText) / 1000 * 30;
  40.             float waterCenteredX = (pageWidth - waterTextWidth) / 2;
  41.             float waterCenteredY = pageHeight / 2;
  42.             //创建一个水印内容流
  43.             PDPageContentStream waterContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.APPEND, true, true);
  44.             waterContentStream.beginText();
  45.             waterContentStream.setFont(font, 30);
  46.             // 设置不透明度
  47.             waterContentStream.setNonStrokingColor(0, 0, 0); // black color
  48.             waterContentStream.setStrokingColor(0, 0, 0); // black color
  49.             waterContentStream.setGraphicsStateParameters(graphicsState);//设置透明度
  50.             //设置旋转文本 45° 对于tx、ty是以左下角为偏移位置中心来进行旋转角度
  51.             waterContentStream.setTextRotation(Math.toRadians(45), 400, -50);
  52.             //设置文本
  53.             waterContentStream.newLineAtOffset(waterCenteredX, waterCenteredY);
  54.             waterContentStream.showText(waterText);
  55.             waterContentStream.endText();
  56.             waterContentStream.close();
  57.         }
  58.         //目标目录 Thread.currentThread().getContextClassLoader().getResource("").getPath()  当前工程目录路径
  59.         String targetPDFPath = "C:\\技术视频\\2024.1.20 水印工具 watermark tools\\watermarkTools\\src\\main\\resources\\output.pdf";
  60.         File outputFile = new File(targetPDFPath);
  61.         // 若是文件存在先进行删除
  62.         Files.deleteIfExists(Paths.get(outputFile.toURI()));
  63.         // 保存修改后的文档
  64.         pdDocument.save(outputFile);
  65.         System.out.println("转换任务:" + targetPDFPath + " 成功!");
  66.         // 关闭文档
  67.         pdDocument.close(); // 关闭文档
  68.     }
  69. }
复制代码
效果:

demo5:添加图片到右上角

要求:将图片缩小25%后插入到右上角。

  1. package com.changlu.demos;
  2. import com.changlu.Main;
  3. import org.apache.pdfbox.pdmodel.PDDocument;
  4. import org.apache.pdfbox.pdmodel.PDPage;
  5. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  6. import org.apache.pdfbox.pdmodel.font.PDType0Font;
  7. import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
  8. import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
  9. import java.io.File;
  10. import java.io.InputStream;
  11. import java.net.URLDecoder;
  12. import java.nio.file.Files;
  13. import java.nio.file.Paths;
  14. /**
  15. * @Description: Apache PDFBox案例:将图片缩小25%后插入到右上角。
  16. * @Author: pipilin
  17. */
  18. public class Demo5 {
  19.     public static void main(String[] args) throws Exception{
  20.         //读取resources目录下input.pdf文件
  21.         InputStream is = Main.class.getClassLoader().getResourceAsStream("input.pdf");
  22.         PDDocument pdDocument = PDDocument.load(is);
  23.         //自定义字体 C:\Users\93997\Desktop\watermark tools\watermarkTools\target\classes\ttfs
  24.         //URLDecoder.decode() 方法来解码 URL 编码的路径,将 %20 转换回空格
  25.         String fontFile = URLDecoder.decode(Main.class.getClassLoader().getResource(File.separator + "ttfs" + File.separator + "Alibaba_PuHuiTi_2.0_65_Medium_65_Medium.ttf").getFile(), "UTF-8");
  26.         PDType0Font font = PDType0Font.load(pdDocument, new File(fontFile));
  27.         //遍历原先的pdf文档
  28.         for (PDPage page : pdDocument.getPages()) {
  29.             float pageWidth = page.getMediaBox().getWidth();
  30.             float pageHeight = page.getMediaBox().getHeight();
  31.             //添加图片水印
  32.             //创建一个水印内容流
  33.             PDPageContentStream imageContentStream = new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.APPEND, true, true);
  34.             // 创建图像对象
  35. //            PDImageXObject image = PDImageXObject.createFromFile("C:\\Users\\pipilin\\Desktop\\watermark tools\\watermarkTools\\src\\main\\resources\\images\\ConsultationGroupQRCode.jpg", pdDocument);
  36.             String pictureFile = URLDecoder.decode(Main.class.getClassLoader().getResource(File.separator + "images" + File.separator + "ConsultationGroupQRCode.jpg").getFile(), "UTF-8");
  37.             PDImageXObject image = PDImageXObject.createFromFile(pictureFile, pdDocument);
  38.             // 计算图像的宽度和高度(缩小比例为0.3)
  39.             float imageWidth = (float) (image.getWidth() * 0.25);
  40.             float imageHeight = (float) (image.getHeight() * 0.25);
  41.             //具体图片位置
  42.             float imageX = pageWidth - imageWidth - 10;
  43.             float imageY = pageHeight - imageHeight - 10;
  44.             // 在指定位置绘制图像
  45.             imageContentStream.drawImage(image, imageX, imageY, imageWidth, imageHeight);
  46.             imageContentStream.close();
  47.         }
  48.         //目标目录 Thread.currentThread().getContextClassLoader().getResource("").getPath()  当前工程目录路径
  49.         String targetPDFPath = "C:\\技术视频\\2024.1.20 水印工具 watermark tools\\watermarkTools\\src\\main\\resources\\output.pdf";
  50.         File outputFile = new File(targetPDFPath);
  51.         // 若是文件存在先进行删除
  52.         Files.deleteIfExists(Paths.get(outputFile.toURI()));
  53.         // 保存修改后的文档
  54.         pdDocument.save(outputFile);
  55.         System.out.println("转换任务:" + targetPDFPath + " 成功!");
  56.         // 关闭文档
  57.         pdDocument.close(); // 关闭文档
  58.     }
  59. }
复制代码
效果:

资料获取

大家点赞、收藏、关注、批评啦~
更多博客与资料可私

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表