All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.afterturn.easypoi.pdf.watermark.WatermarkScanner Maven / Gradle / Ivy

package cn.afterturn.easypoi.pdf.watermark;

import org.apache.pdfbox.contentstream.PDFStreamEngine;
import org.apache.pdfbox.contentstream.operator.DrawObject;
import org.apache.pdfbox.contentstream.operator.Operator;
import org.apache.pdfbox.contentstream.operator.state.Concatenate;
import org.apache.pdfbox.contentstream.operator.state.Restore;
import org.apache.pdfbox.contentstream.operator.state.Save;
import org.apache.pdfbox.contentstream.operator.state.SetGraphicsStateParameters;
import org.apache.pdfbox.contentstream.operator.state.SetMatrix;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.util.Matrix;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

public class WatermarkScanner extends PDFStreamEngine {
    Logger logger = LoggerFactory.getLogger(WatermarkScanner.class);

    IWatermarkProcessor remover;
    int pageStartIndex;
    int pageLength;

    public WatermarkScanner(IWatermarkProcessor remover, int pageStartIndex, int pageLength) {
        addOperator(new Concatenate());
        addOperator(new DrawObject());
        addOperator(new SetGraphicsStateParameters());
        addOperator(new Save());
        addOperator(new Restore());
        addOperator(new SetMatrix());
        this.remover = remover;
        this.pageStartIndex = pageStartIndex;
        this.pageLength = pageLength;
    }

    /**
     * 开始扫描,检查所有水印
     */
    public void run() {
        try {
            for (int i = pageStartIndex; i < pageStartIndex + pageLength; i++) {
                if (i >= remover.getDocument().getNumberOfPages()) {
                    break;
                }
                processPage(remover.getDocument().getPage(i));
            }
        } catch (Exception e) {
            logger.error("【扫描页面水印出错】", e);
        }
    }

    /**
     * 处理读取的每一个点位
     */
    @Override
    protected void processOperator(Operator operator, List operands) throws IOException {
        String operation = operator.getName();
        if ("Tj".equals(operation)) {
            COSString textObj = (COSString) operands.get(0);
            String string = textObj.getString();
            // 检查是否是倾斜的水印
            Matrix matrix = getTextLineMatrix();

            if (matrix != null && matrix.getScaleY() != 0 && matrix.getScaleY() != 1 && matrix.getShearY() != 0) {
                if (!remover.isWatermarkWord(string)) {
                    remover.addWatermarkWord(string);
                }
            }
        } else {
            // 此代码必须,必须对else进行处理
            super.processOperator(operator, operands);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy