码迷,mamicode.com
首页 > 编程语言 > 详细

Java根据PDF中的关键字位置判定PDF文件是否合法

时间:2020-03-07 20:55:01      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:als   amp   tin   pdf   public   坐标   auth   用户   ati   

业务中需判定PDF文件是否为指定PDF文件,如果不是则不允许上传,并且提醒用户上传合法PDF文件

此贴需要参考我的上上篇帖子,定位PDF中关键字的位置

测试结果:

技术图片

 

 

maven配置

<!-- 引入pdf -->
    <dependency>
      <groupId>com.itextpdf</groupId>
      <artifactId>itextpdf</artifactId>
      <version>5.5.13</version>
    </dependency>

校验PDF是否包含指定关键字Java文件CheckPdfHelper.java

package com.alphajuns.util;

import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;

import java.io.IOException;

/**
 * @ClassName CheckPdfHelper
 * @Description 校验PDF是否为指定文件
 * @Author AlphaJunS
 * @Date 2020/3/7 19:31
 * @Version 1.0
 */
public class CheckPdfHelper {
    // 定义PDF中关键字及其坐标位置,用于判断校验上传的PDF文件是否合法
    private static String KEY_WORD = "ANPQP";
    private static float POINT_X = (float) 36.0;
    private static float POINT_Y = (float) 810.2003;

    /**
     * 检验PDF是否合格
     * @param filePath
     * @return
     */
    public static int checkPdf(String filePath) {
        String suffix = filePath.substring(filePath.lastIndexOf(".") + 1);
        if ("pdf".equals(suffix.toLowerCase())) {
            return checkSinglePdf(filePath);
        } else {
            return 1;
        }
    }

    /**
     * 检验单个pdf是否合格
     * @param filePath
     * @return
     */
    private static int checkSinglePdf(String filePath) {
        float[] point = getKeyWordsByPath(filePath);
        if (point != null) {
            if(isEqualOfFloat(point[0], POINT_X) && isEqualOfFloat(point[1], POINT_Y)) {
                return 0;
            } else {
                return 1;
            }
        }
        return 1;
    }

    /**
     * @Author AlphaJunS
     * @Date 18:01 2020/3/7
     * @Description 根据路径获取pdf中关键字的坐标
     * @param  filepath
     * @return float[]
     */
    private static float[] getKeyWordsByPath(String filepath) {
        float[] coordinate = null;
        try{
            PdfReader pdfReader = new PdfReader(filepath);
            coordinate = getKeyWords(pdfReader);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return coordinate;
    }

    /**
     * @Author AlphaJunS
     * @Date 18:02 2020/3/7
     * @Description 根据pdfreader获取pdf中关键字的坐标
     * @param pdfReader
     * @return float[]
     */
    private static float[] getKeyWords(PdfReader pdfReader) {
        float[] coordinate = null;
        int page = 0;
        try{
            int pageNum = pdfReader.getNumberOfPages();
            PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);
            CustomRenderListener renderListener = new CustomRenderListener();
            renderListener.setKeyWord(KEY_WORD);
            for (page = 1; page <= pageNum; page++) {
                renderListener.setPage(page);
                pdfReaderContentParser.processContent(page, renderListener);
                coordinate = renderListener.getPcoordinate();
                if (coordinate != null) break;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return coordinate;
    }

    /**
     * @Author AlphaJunS
     * @Date 18:05 2020/3/7
     * @Description 判断两个浮点数是否一致
     * @param a
     * @param b
     * @return boolean
     */
    public static boolean isEqualOfFloat(float a, float b){
        if(Math.abs(Math.floor(a) - Math.floor(b)) <= 0) {
            return true;
        } else {
            return false;
        }
    }
}

 

Java根据PDF中的关键字位置判定PDF文件是否合法

标签:als   amp   tin   pdf   public   坐标   auth   用户   ati   

原文地址:https://www.cnblogs.com/alphajuns/p/12436672.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!