自己记录一下,方便下次用,判断文件是否为pdf类型,并且解析文件内容
1.需要依赖的包

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.19</version>
</dependency>

2.Util类

import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.io.RandomAccessFile;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.PDFTextStripperByArea;
import sun.misc.BASE64Decoder;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;/*** 解析PDF文件內容* @author: Tang qiqi* @create: 2023-02-21 15:11* @Description:*/
@Slf4j
public class PDFParserUtils {public static final String PDF = "PDF";/*** base64文件字符串* @param base64Content* @return*/public static String parserFileContent(String base64Content, String fileName){// 判斷base64字符串內容是否為空if(base64Content == null || base64Content.trim().length() == 0) {return "";}FileOutputStream fos = null;try {File tempFile = File.createTempFile(fileName, ".PDF");fos = new FileOutputStream(tempFile);BASE64Decoder decoder = new BASE64Decoder();// Base64解码,对字节数组字符串进行Base64解码并生成文件byte[] byt = decoder.decodeBuffer(base64Content);for (int i = 0, len = byt.length; i < len; ++i) {// 调整异常数据if (byt[i] < 0) {byt[i] += 256;}}// 判断文件是否PDF类型,如果不是,直接返回String fileType = getFileType(byt);if(!PDF.equals(fileType)) {log.info("文件格式不是PDF");return "";}fos.write(byt);fos.flush();fos.close();String text = readFile(tempFile);tempFile.deleteOnExit();return text;} catch (Exception e) {e.printStackTrace();} finally {if(fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}return "";}/*** 一次獲取整個文件內容* @param file 文件* @return*/public static String readFile(File file) {if(file == null) {return "";}PDDocument doc = null;try {RandomAccessFile  is = new RandomAccessFile(file, "r");PDFParser parser = null;parser = new PDFParser(is);parser.parse();doc = parser.getPDDocument();PDFTextStripper textStripper = new PDFTextStripper();String content = textStripper.getText(doc);doc.close();return content;} catch (IOException e) {e.printStackTrace();log.info("解析PDF文件內容異常[{}]", e.getMessage());} finally {if(doc != null) {try {doc.close();} catch (IOException e) {e.printStackTrace();}}}return "";}/*** 分頁獲取文字內容,並將多頁內容拼接返回* @param file 文件* @return* @throws Exception*/public static String readPage(File file) {if(file == null) {return "";}StringBuilder sb = new StringBuilder("");PDDocument doc = null;try {RandomAccessFile is = new RandomAccessFile(file, "r");PDFParser parser = new PDFParser(is);parser.parse();doc = parser.getPDDocument();PDFTextStripper textStripper = new PDFTextStripper();for (int i = 1; i <= doc.getNumberOfPages(); i++) {textStripper.setStartPage(i);textStripper.setEndPage(i);// 一次输出多个页时,按顺序输出textStripper.setSortByPosition(true);String s = textStripper.getText(doc);sb.append(s);}doc.close();} catch (Exception e) {e.printStackTrace();log.info("解析PDF文件內容異常[{}]", e.getMessage());} finally {if(doc != null) {try {doc.close();} catch (IOException e) {e.printStackTrace();}}}return sb.toString();}/*** 读取文本内容和图片* @param file 文件路徑*/public static void readTextImage(File file) {if(file == null) {return;}PDDocument doc = null;try {doc = PDDocument.load(file);PDFTextStripper textStripper = new PDFTextStripper();for (int i = 1; i <= doc.getNumberOfPages(); i++) {textStripper.setStartPage(i);textStripper.setEndPage(i);
//                String s = textStripper.getText(doc);// 读取图片PDPage page = doc.getPage(i - 1);PDResources resources = page.getResources();// 获取页中的对象Iterable<COSName> xobjects = resources.getXObjectNames();if (xobjects != null) {Iterator<COSName> imageIter = xobjects.iterator();while (imageIter.hasNext()) {COSName cosName = imageIter.next();boolean isImageXObject = resources.isImageXObject(cosName);if (isImageXObject) {// 获取每页资源的图片PDImageXObject ixt = (PDImageXObject) resources.getXObject(cosName);File outputfile = new File("第 " + (i) + " 页" + cosName.getName() + ".jpg");ImageIO.write(ixt.getImage(), "jpg", outputfile);}}}}doc.close();} catch (IOException e) {e.printStackTrace();} finally {if(doc != null) {try {doc.close();} catch (IOException e) {e.printStackTrace();}}}}/**** @param file* @param x 指定的x坐标* @param y 指定的y坐标* @param width 矩形的宽度* @param height 矩形的高度* @return*/public static String readRectangle(File file, int x, int y, int width, int height){if(file == null) {return "";}PDDocument doc = null;try {doc = PDDocument.load(file);// y轴向下为正,x轴向右为正。PDFTextStripperByArea stripperByArea = new PDFTextStripperByArea();stripperByArea.setSortByPosition(true);// 划定区域Rectangle2D rect = new Rectangle(x, y, width, height);stripperByArea.addRegion("area", rect);PDPage page = doc.getPage(1);stripperByArea.extractRegions(page);// 获取区域的textString text = stripperByArea.getTextForRegion("area");text = text.trim();doc.close();return text;} catch (IOException e) {e.printStackTrace();} finally {if(doc != null) {try {doc.close();} catch (IOException e) {e.printStackTrace();}}}return "";}/*** 根據io流前4個字節,判斷文件類型* @param ioBytes* @return*/private static String getFileType(byte []ioBytes){if(ioBytes == null || ioBytes.length < 4){log.error("非正常文件");throw new ErrorException("Abnormal image file.");}byte[] b = new byte[4];for(int i = 0; i < 4; i ++){b[i] = ioBytes[i];}String type = bytesToHexString(b).toUpperCase();if (type.contains("25504446")){return "PDF";}else if(type.contains("504B0304")) {return "ZIP";} else if(type.contains("52617221")){return "RAR";}return "";}/*** byte数组转换成16进制字符串* @param src* @return*/private static String bytesToHexString(byte[] src){StringBuilder stringBuilder = new StringBuilder();if (src == null || src.length <= 0) {return null;}for (int i = 0; i < src.length; i++) {int v = src[i] & 0xFF;String hv = Integer.toHexString(v);if (hv.length() < 2) {stringBuilder.append(0);}stringBuilder.append(hv);}return stringBuilder.toString();}
/** 常用文件的文件头如下:
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Postscript. (eps.or.ps),文件头:252150532D41646F6265
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
*/
}

JAVA解析pdf文件相关推荐

  1. Java解析PDF文件(PDFBOX、itext解析PDF)导出PDF中的子图片,去除PDF中的水印

    前段时间,为了解析PDF,花了不少时间去学习PDFbox和itext,这两个都是处理PDF的开源库,有java和C#的.作为一个刚开始学习这两个开源库的,感觉百度上的资源还是太少了.我做的是一个关于P ...

  2. java解析pdf获取pdf中内容信息

    java解析pdf获取pdf中内容信息 今日项目中需要将pdf中的数据获取到进行校验数据,于是前往百度翻来覆去找到以下几种办法,做个笔记,方便日后查询. 废话不多说,我要直接上代码装逼了 第一种 使用 ...

  3. Java解析 PDF

    1.使用PDFBox处理PDF文档 PDF全称Portable Document Format,是Adobe公司开发的电子文件格式.这种文件格式与操作系统平台无关,可以在Windows.Unix或Ma ...

  4. java 解析PDF 含表格

    最近我们在项目上需要解析Pdf文件中的表格,然后对比两个相似的pdf文件中的表格数据,并返回对比结果. package Pdf.Pdf;import java.io.BufferedReader; i ...

  5. java 解析 csv 文件

    文章分类:JavaEye 一.貌似有bug,不行用 二.或 三. 的方法 Java代码   import java.io.BufferedReader; import java.io.FileInpu ...

  6. 用正则表达式和java解析csv文件

    用正则表达式和java解析csv文件 作者:弹着钢琴设计  来源:博客园  发布时间:2009-06-15 18:31  阅读:337 次  原文链接   [收藏]   在解析csv文件之前,先来看看 ...

  7. Java合并pdf文件

    Java合并pdf文件 今天帮老师整理资料需要合并pdf文件,下了许多软件发现都需要VIP才行,所以写了个程序来帮助合并,直接在主程序中修改文件路径即可,如下图: 主要代码如下: package co ...

  8. java解析dxf文件_浅析JVM方法解析、创建和链接

    一:前言 上周末写了一篇文章<你知道Java类是如何被加载的吗?>,分析了HotSpot是如何加载Java类的,干脆趁热打铁,本周末再来分析下Hotspot又是如何解析.创建和链接类方法的 ...

  9. python处理pdf实例_python使用pdfminer解析pdf文件的方法示例

    最近要做个从 pdf 文件中抽取文本内容的工具,大概查了一下 python 里可以使用 pdfminer 来实现.下面就看看怎样使用吧. PDFMiner是一个可以从PDF文档中提取信息的工具.与其他 ...

最新文章

  1. 阿里工程师力荐的计算机网络和算法资料,限时下载!
  2. 源码网站都有哪些_一个网站都包括哪些费用?
  3. mysql开启事务_MySQL入门之事务(上)
  4. Qt文档阅读笔记-Qt Core的官方解析
  5. bootstrap-导航
  6. 7款应用最广泛的Linux桌面环境盘点
  7. clientHeight、offsetHeight、innerHeight、ouerHeight 区别
  8. python123平台怎么上课_国内优秀的Python教学平台推荐-python123.io
  9. 项目邮件[置顶] 失业的程序员(十二):潜意识的智商
  10. 使用结构体输入参加某会议成员的信息,并计算男女比例C++
  11. 感应加热电源-谐振移相-感性移相
  12. 数据库SQL 某字段按首字母排序
  13. 长期招对日/赴日开发人才
  14. 侍魂微信第一个服务器,在游戏中,武者大大们来到的第一个地图叫什么名字?...
  15. 从装大象中我们学会了什么设计模式
  16. 碧桂园出品的机器人,能够代替公司人力吗?
  17. git(7)自定义 Git
  18. 微星MAG B650M mortar wifi主板设置温度墙
  19. 三极管PNP与NPN控制区别
  20. 数字标牌创建内容的一些基本技巧

热门文章

  1. 2018Python元年
  2. mendeley 安装Microsoft Word 插件 报错及解决
  3. linux关于usb的使用,linux之常见的使用USB设备,linuxusb设备这些USB设备包括U
  4. 篮球追逐梦想——怀旧《灌篮高手》
  5. 配置 default Jenkinsfile 文件
  6. AE平面跟踪和视觉效果插件mocha pro mac破解版
  7. Java求最大公约数与最小公倍数
  8. [C语言]求最大公约数和最小公倍数
  9. 百年理论预言被证实!《Nature》:我国科学家捕捉到水结冰的关键一瞬
  10. [Mysql] 1.MySQL查询练习