package com.smppw.modaq.application.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;

/**
 * @author wangzaijun
 * @date 2024/9/12 14:00
 * @description 自定义的文本去水印方法，发现水印基本是旋转文字并且比报告内其他文字都大
 * @see CustomTabulaTextStripper 区别于表格文字去水印的实现
 */
public class CustomPDFTextStripper extends PDFTextStripper {
    private final boolean sortByPosition;
    private final String wordSeparator;

    public CustomPDFTextStripper(boolean sortByPosition, String wordSeparator) {
        this.sortByPosition = sortByPosition;
        this.wordSeparator = wordSeparator;
    }

    @Override
    public boolean getSortByPosition() {
        return sortByPosition;
    }

    @Override
    public String getWordSeparator() {
        return wordSeparator;
    }

    @Override
    protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
        // 水印文字基本都是有角度的，统计有旋转角度的文字高度
        List<TextPosition> rotationTexts = ListUtil.list(false);
        // 去除水印后的文字
        List<String> newTexts = ListUtil.list(false);
        for (TextPosition textPosition : textPositions) {
            float[][] values = textPosition.getTextMatrix().getValues();
            double degrees = Math.toDegrees(Math.atan2(values[0][1], values[0][0]));
            // 如果旋转角度除90的余数大于0.1就说明是水印文字
            if (degrees % 90. > 0.1) {
                rotationTexts.add(textPosition);
            } else {
                String unicode = textPosition.getUnicode();
                if (StrUtil.isBlank(unicode)) {
                    continue;
                }
                newTexts.add(unicode);
            }
        }
        // 集合为空表示text的内容没有水印影响，直接输出该内容
        if (CollUtil.isNotEmpty(newTexts)) {
            super.writeString(String.join(StrUtil.EMPTY, newTexts));
        }
    }
}
