5 小时以前 9bad721754fe8bbe2e5f459d0706e0fefac569f3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package cn.iocoder.yudao.module.qcreport.service.aiimport.document;
 
/**
 * 一种输入格式的抽取器。
 * <p>
 * 之所以做适配器而不是在一个大类里 {@code switch (extension)}:三类输入的抽法毫无共同点
 * (图片什么都不用做、PDF 要先判断有没有文本层、Office 要按格式解析表格),
 * 塞进一个类会得到一个既读不了也改不动的分支塔。
 * <p>
 * 实现按 {@code @Order} 固定顺序排列,门面取<b>第一个</b> {@link #supports} 为真的——
 * 顺序固定是为了消除歧义(PDF 可能同时被 PDF 适配器和 Office 适配器「认领」),
 * 而不是为了择优。
 */
public interface QcReportImportAdapter {
 
    /**
     * 是否能处理这个文件。
     *
     * @param extension 小写、去点的扩展名,如 {@code pdf};没有扩展名时为空串
     * @param contentType 浏览器上报的 MIME 类型,可能为 null(本地文件常见)
     */
    boolean supports(String extension, String contentType);
 
    /**
     * 抽取。
     * <p>
     * 不做「返回 null 表示失败」这种约定:读不出内容、格式不支持、页数超限都是**确定的失败原因**,
     * 各自对应一个错误码,让用户知道下一步该做什么(换个格式 / 拆页 / 重新扫描)。
     *
     * @param content          文件字节
     * @param originalFilename 原始文件名,用于错误与提示文案
     * @return 抽取结果
     */
    QcReportDocumentExtract extract(byte[] content, String originalFilename);
 
}