使用iText对pdf中敏感信息进行马赛克处理

使用iText对pdf中敏感信息进行马赛克处理

1.pom文件引入以下依赖

     <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

2.新建敏感信息实体类

 
public class TextLineMode {
    public static final float defaultHeight = 14;
    public static final float fixHeight = 4;
 
    private int curPage = 1;
    private float height = 0;
    private float width = 0;
    private float x = 0;
    private float y = 0;
 
    public int getCurPage() {
        return curPage;
    }
 
    public void setCurPage(int curPage) {
        this.curPage = curPage;
    }
 
    public float getHeight() {
        return height;
    }
 
    public void setHeight(float height) {
        this.height = height;
    }
 
    public float getWidth() {
        return width;
    }
 
    public void setWidth(float width) {
        this.width = width;
    }
 
    public float getX() {
        return x;
    }
 
    public void setX(float x) {
        this.x = x;
    }
 
    public float getY() {
        return y;
    }
 
    public void setY(float y) {
        this.y = y;
    }
 
}

3.对关键词进行查找并进行打码(ITextPdfUtil)

 
 
 
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
import com.example.demo.Listener.TextLineMode;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.RenderListener;
import com.itextpdf.text.pdf.parser.TextRenderInfo;
 
public class ITextPdfUtil {
/*
* 参数说明:
* src:原始文件
* dest:打码文件
* keywords:敏感词查找
* */
    public boolean manipulatePdf(String src, String dest, List<String> keywords) throws Exception {
        PdfReader pdfReader = null;
        PdfStamper stamper = null;
        try {
            pdfReader = new PdfReader(src);
            stamper = new PdfStamper(pdfReader, new FileOutputStream(dest));
            List<TextLineMode> list = renderText(pdfReader, keywords);
            if (list != null) {
                for (int i = 0; i < list.size(); i++) {
                    TextLineMode mode = list.get(i);
 
                    PdfContentByte canvas = stamper.getOverContent(mode.getCurPage());
                    //初始阶段完成 开始替换
                    canvas.saveState();
                    //黑色背景覆盖
                    canvas.setColorFill(BaseColor.LIGHT_GRAY);
                    // canvas.setColorFill(BaseColor.BLUE);
                    // 以左下点为原点,x轴的值,y轴的值,总宽度,总高度:
                    canvas.rectangle(mode.getX() - 2 , mode.getY(),
                            mode.getWidth()+2 , mode.getHeight());
//                     canvas.rectangle(mode.getX() - 1, mode.getY(),
//                     mode.getWidth() + 2, mode.getHeight());
                    //定位
                   // canvas.rectangle(0, mode.getY(), 10000, mode.getHeight());
                    //填充
                    canvas.fill();
                    //还原状态
                    canvas.restoreState();
                }
            }
            return true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (stamper != null)
                stamper.close();
            if (pdfReader != null)
                pdfReader.close();
        }
        return false;
    }
/*
* 查找关键词坐标*/
    public List<TextLineMode> renderText(PdfReader pdfReader, final List<String> keywords) {
        final List<TextLineMode> list = new ArrayList<TextLineMode>();
        try {
            PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);
            int pageNum = pdfReader.getNumberOfPages();
            for (int i = 1; i <= pageNum; i++) {
                final int curPage = i;
 
                pdfReaderContentParser.processContent(curPage, new RenderListener() {
                    @Override
                    public void renderText(TextRenderInfo textRenderInfo) {
                        String text = textRenderInfo.getText();
                        if (text != null) {
                            for (int j = 0; j < keywords.size(); j++) {
                                String keyword = keywords.get(j);
                                if (text.contains(keyword)) {
                                    com.itextpdf.awt.geom.Rectangle2D.Float bound = textRenderInfo.getBaseline()
                                            .getBoundingRectange();
                                    TextLineMode lineMode = new TextLineMode();
                                    lineMode.setHeight(bound.height == 0 ? TextLineMode.defaultHeight : bound.height);
                                    lineMode.setWidth(bound.width);
                                    lineMode.setX(bound.x);
                                    lineMode.setY(bound.y - TextLineMode.fixHeight);
                                    lineMode.setCurPage(curPage);
                                    list.add(lineMode);
                                }
                            }
                        }
                    }
                    @Override
                    public void renderImage(ImageRenderInfo arg0) {
                    }
                    @Override
                    public void endTextBlock() {
 
                    }
 
                    @Override
                    public void beginTextBlock() {
                    }
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
 
    public static void main(String[] args) throws Exception {
        List<String> keywords = new ArrayList<String>();
        keywords.add("09267703");//需要打码的文字
        new ITextPdfUtil().manipulatePdf("G:\\idea\\正常.pdf",
                "G:\\idea\\打码.pdf", keywords);
    }
}
 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值