【Java】基于Pdfbox解析PDF文档中指定位置的文字和图片

Ruth ·
更新时间:2024-11-10
· 519 次阅读

1.1 PDFBOX介绍

Apache PDFBox是一个开源Java库,支持PDF文档的开发和转换。 我们可以使用PDFBox开发可以创建,转换和操作PDF文档的Java程序。PDFBox的主要功能:

Extract Text - 使用PDFBox,您可以从PDF文件中提取Unicode文本。 Split & Merge - 使用PDFBox,您可以将单个PDF文件分成多个文件,并将它们合并为一个文件。 Fill Forms - 使用PDFBox,您可以在文档中填写表单数据。 Print - 使用PDFBox,您可以使用标准Java打印API打印PDF文件。 Save as Image - 使用PDFBox,您可以将PDF保存为图像文件,如PNG或JPEG。 Create PDFs - 使用PDFBox,您可以通过创建Java程序创建新的PDF文件,还可以包含图像和字体。 Signing - 使用PDFBox,您可以将数字签名添加到PDF文件。

PDFBox的四个主要组成部分:

PDFBox - 这是PDFBox的主要部分。 它包含与内容提取和操作相关的类和接口。 FontBox - 它包含与font相关的类和接口,使用这些类我们可以修改PDF文档的文本字体。 XmpBox - 包含处理XMP元数据的类和接口。 Preflight - 此组件用于根据PDF/A-1b标准验证PDF文件。

PDFBOX操作PDF文档基本实现:

创建PDF文档( Creating a PDF Document) 添加页面( Adding Pages) 删除页面( Removing Pages) 读写文档属性( Document Properties) 添加文本( Adding Text) 添加多行( Adding Multiple Lines) 读取文本( Reading Text) 插入图像( Inserting Image) 加密PDF文档(Encrypting a PDF Document) 拆分PDF文档( Splitting a PDF Document) 合并多个PDF文档(Merging Multiple PDF Documents) 从PDF文档生成图像(Save Images) 添加矩形( Adding Rectangles)

详细参考PDFBOX官网

1.2 项目需求分析

项目中需要根据既有的电子图书进行信息化的归档,方便分类目查询。因为图书主要是以如下排版存在:
在这里插入图片描述

相对来说页面分为左右两部分,右侧是知识点的描述,比较规范。左侧是图文的说明,为了生动,各种形式,大小都有,基本上没有规律,所以无法进行解析。最终敲定方案如下:

右侧描述根据章节来生成知识点描述,可以按章节或者关键字检索。对应描述的左侧部分,需要整体生成辅助说明一个图片。辅助说明相应的知识点内容。

拆分成技术实现为:

指定区域进行PDF文字内容提取 指定区域进行PDF图片内容提取 1.3 代码实现 1.3.1 SpringBoot工程引入PDFBox依赖

POM.xml

org.apache.pdfbox pdfbox 2.0.18

PdfboxUtils.java

package com.gavinbj.common.utils; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.text.PDFTextStripperByArea; public class PdfboxUtils { public static final String REGION_NAME = "content"; /** * 根据指定文件页码的指定区域读取文字 * * @param filePath PDF文件路径 * @param iPage PDF页码 * @param textRrect 读取文字的区域 * @return 文字内容 */ public static String readRectangelText(String filePath, int iPage, Rectangle textRrect) { String textContent = ""; try(PDDocument pdfDoc = PDDocument.load(new File(filePath))) { // 获取指定的PDF页 PDPage pdfPage = pdfDoc.getPage(iPage); // 获取指定位置的文字(文字剥离器) PDFTextStripperByArea textStripper = new PDFTextStripperByArea(); textStripper.setSortByPosition(true); textStripper.addRegion(REGION_NAME, textRrect); textStripper.extractRegions(pdfPage); textContent = textStripper.getTextForRegion(REGION_NAME); // 释放资源 pdfDoc.close(); } catch (Exception ex) { ex.printStackTrace(); } return textContent; } /** * 根据指定文件页码的指定区域读取图片 * * @param filePath PDF文件路径 * @param iPage PDF页码 * @param imgRrect 读取图片的区域 * @return 图片内容 */ public static BufferedImage readRectangelImage(String filePath, int iPage, Rectangle imgRrect) { BufferedImage bufImage = null; try(PDDocument pdfDoc = PDDocument.load(new File(filePath))) { // 获取渲染器,主要用来后面获取BufferedImage PDFRenderer pdfRenderer = new PDFRenderer(pdfDoc); // 截取指定位置生产图片 bufImage = pdfRenderer.renderImage(iPage).getSubimage(imgRrect.x,imgRrect.y,imgRrect.width,imgRrect.height); // 释放资源 pdfDoc.close(); } catch (Exception ex) { ex.printStackTrace(); } return bufImage; } }

PdfTest.java:测试类

package com.gavinbj.common.utils; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class PdfTest { public static void main(String[] args) throws IOException { String pdfPath="C:\\PDFDemos\\pdf\\9.pdf"; Rectangle textRrect = new Rectangle(420, 80, 130, 245); String strContent = PdfboxUtils.readRectangelText(pdfPath, 0, textRrect); System.out.println(strContent); // 保存图片 Rectangle imgRrect = new Rectangle(0, 76, 420, 240); BufferedImage bufImage = PdfboxUtils.readRectangelImage(pdfPath, 0, imgRrect); File outputfile = new File("D:\\pdfImage2.png"); ImageIO.write(bufImage, "png", outputfile); } }

执行测试结果:

一、太阳辐射 1 …概念:太阳源源不断地 以电磁波的形式向四周放射能 量,被称为太阳辐射。 太阳辐射携带巨大的能量。 地球所接收到的太阳辐射能量仅 为太阳向宇宙空间放射的总辐射 能量的二十亿分之一。 在日地平均距离处与太 阳光垂直的地球大气上界单位 面积上在单位时间内所接收到 的太阳辐射的所有波长的总能 量,称为太阳常数。

在这里插入图片描述

结论:从上面例子可以看出使用PDFBOX相应的方法可以读取指定位置的文字。

并可以从指定位置提取图片并保存,不同于直接读取PDF中内嵌的对象,可以根据你的指定区域直接截取相应的内容作为图片保存,但是处理速度不敢恭维,特别慢。暂时没有想到优化的办法。


作者:黑白猿



pdfbox JAVA 图片 定位 pdf文档

需要 登录 后方可回复, 如果你还没有账号请 注册新账号