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

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

  • 需求背景
  • 实现逻辑
  • 实现代码
    • 定位敏感词坐标
    • 对敏感信息进行马赛克
    • 敏感信息实体类

需求背景

系统需要发送部分pdf文件给客户,但是原pdf中有部分敏感信息需要进行屏蔽。

实现逻辑

  1. 定位敏感信息在pdf中的位置。
  2. 覆盖敏感信息
  3. 将处理后的文件发送给客户

实现代码

定位敏感词坐标

通过监听pdf渲染过程,获取敏感词的坐标信息

  //查找所有敏感词的坐标
        List<WordItem> wordItems = new ArrayList<>();
        PdfReader src = new PdfReader(inputStream);
        PdfReaderContentParser parser = new PdfReaderContentParser(src);
        int pageNum = src.getNumberOfPages();
        for (int i = 1; i < pageNum; i++) {
            KeyWordPositionRenderListener listener = new KeyWordPositionRenderListener(findTextList, i);
            parser.processContent(i, listener);
            wordItems.addAll(listener.getRsWordItems());
        }
        if (wordItems.isEmpty()) {
            Logs.error("替换敏感词的坐标集合为空!!!!请排查问题原因");
        }
/**
 * @author FeianLing
 * @date 2019/8/21
 * pdf 渲染监听,获取到关键词对应的坐标 x y h w
 */
@Data
public class KeyWordPositionRenderListener implements RenderListener {
    /**
     * 要查找的关键字集合
     */
    private List<String> findText;
    /**
     * 出现无法取到值默认为12
     */
    private float defaultH = 12F;
    /**
     * 可能出现无法完全覆盖,提供修正参数,默认2
     */
    private float fixHeight = 2F;
    /**
     * pdf 渲染页码
     */
    private Integer pageNum;
    /**
     * 匹配的坐标集合
     */
    private List<WordItem> rsWordItems = new ArrayList<>();

    /**
     * 构造器1
     *
     * @param findText
     */
    public KeyWordPositionRenderListener(List<String> findText, Integer pageNum) {
        this.findText = findText;
        this.pageNum = pageNum;
    }

    /**
     * 构造器2
     *
     * @param findText
     * @param defaultH
     * @param fixHeight
     */
    public KeyWordPositionRenderListener(List<String> findText, float defaultH, float fixHeight) {
        this.findText = findText;
        this.defaultH = defaultH;
        this.fixHeight = fixHeight;
    }

    @Override
    public void beginTextBlock() {

    }

    @Override
    public void renderText(TextRenderInfo info) {
        String text = info.getText();
        if (null != text) {
            for (String keyword : findText) {
                if (text.contains(keyword)) {
                    Rectangle2D.Float bound = info.getBaseline().getBoundingRectange();
                    WordItem item = new WordItem();
                    item.setContent(keyword);
                    item.setX(bound.x);
                    item.setY((bound.y - fixHeight));
                    item.setH(bound.height == 0 ? defaultH : bound.height);
                    item.setW(bound.width);
                    item.setPageNum(pageNum);
                    rsWordItems.add(item);
                }
            }
        }
    }

    @Override
    public void endTextBlock() {

    }

    @Override
    public void renderImage(ImageRenderInfo imageRenderInfo) {

    }

对敏感信息进行马赛克

遍历上一步得到的敏感信息坐标,逐个进行打码处理。
distPath :缓存处理后的pdf文件路径

PdfReader dest = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(dest, new FileOutputStream(distPath));
        for (WordItem item : wordItems) {
            PdfContentByte canvas = stamper.getOverContent(item.getPageNum());
            //初始阶段完成 开始替换
            canvas.saveState();
            System.out.println("更新背景:" + item);
            //黑色背景覆盖
            canvas.setColorFill(BaseColor.BLACK);
            String site = keyMap.get(item.getContent());
            Float siteF = 0F;
            if (!Strings.isNullOrEmpty(site)) {
                siteF = Float.valueOf(site);
            }
            Logs.info("y坐标偏移:{}", siteF);
            //定位
            canvas.rectangle(item.getX(), item.getY() + siteF, item.getW(), item.getH());
            //填充
            canvas.fill();
            //还原状态
            canvas.restoreState();
        }

敏感信息实体类

/**
 * @author FeianLing
 * @date 2019/8/21
 */
@Data
public class WordItem implements Serializable {
    /**
     * 关键词
     */
    private String content;
    /**
     * pdf x坐标
     */
    private Float x;
    /**
     * pdf y坐标
     */
    private Float y;
    /**
     * pdf h坐标
     */
    private Float h;
    /**
     * pdf w坐标
     */
    private Float w;
    /**
     * pdf 页码
     */
    private Integer pageNum;
}

你可能感兴趣的:(java,iText修改pdf,java编辑pdf)