package com.simuwang.daq.components;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.StrUtil;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;

import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

import static com.simuwang.base.common.conts.Constants.WATERMARK_REPLACE;

/**
 * @author wangzaijun
 * @date 2024/9/12 14:00
 * @description 自定义的文本去水印方法，发现水印基本是旋转文字并且比报告内其他文字都大
 * @see CustomTabulaTextStripper 区别于表格文字去水印的实现
 */
public class CustomPDFTextStripper extends PDFTextStripper {
    @Override
    protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
        // 水印文字基本都是有角度的，统计有旋转角度的文字高度
        List<Float> heights = textPositions.stream().filter(e -> e.getTextMatrix().getValue(0, 1) != 0.)
                .map(TextPosition::getHeight).collect(Collectors.toList());
        // 集合为空表示text的内容没有水印影响，直接输出该内容
        if (CollUtil.isEmpty(heights)) {
            super.writeString(text);
            return;
        }
        // 如果全是水印文字则直接去除
        if (textPositions.size() == heights.size()) {
            super.writeString(WATERMARK_REPLACE);
            return;
        }
        // 否则去除水印（文字没有旋转角度，并且水印字体大小没有包含当前文字时说明是正常文字；否则识别为水印并用特殊符号代替）
        List<String> newTexts = ListUtil.list(false);
        for (TextPosition textPosition : textPositions) {
            float col = textPosition.getTextMatrix().getValue(0, 1);
            float height = textPosition.getHeight();
            newTexts.add(col == 0. && !heights.contains(height) ? textPosition.getUnicode() : WATERMARK_REPLACE);
        }
        super.writeString(String.join(StrUtil.EMPTY, newTexts));
    }
}
