脱敏非常慢,而且经常中间退出

您好:
我的测试结果中 一个pdf 文件有23张图片, 其中要对 33个关键字 进行脱敏处理, 结果发现 OCR的调用次数非常多。
后经多次验证, 对OCR的调用次数 好像是 关键字的数量 * 图片的数量。 这样我这个测试需要调用 33*23=759次
这导致对该pdf文件 脱敏过程非常缓慢,而且脱敏过程中经常突然中断。

这个是否可以进行优化, 对RecognizedImage recognize(InputStream imageStream) 的调用 按照图片的数量进行调用, 对每次调用recognize, 将所有要脱敏的关键字 交给 OCR系统 进行识别 并返回所有关键字对应的结果。

@weilin

您能否分享有问题的/源文件和示例代码? 然后我们将研究这个问题。

下面是代码调用部分
public final RecognizedImage recognize(InputStream imageStream)
{
savefile(imageStream);
return new RecognizedImage(new TextLine[0]);
}

@RequestMapping(“/skyguard”)
public class RedactionController {
@Autowired
private ABBYYOcrConnectorFactory abbyyOcrConnectorFactory;

@PostMapping("/redaction")
public Object redaction(@NonNull @RequestBody RedactionOptions redactionOptions,
                        HttpServletResponse httpServletResponse) {

	if(Files.isRegularFile(Paths.get(redactionOptions.getSourcePath()))) {
		try(OutputStream outputStream = Files.newOutputStream(Paths.get(redactionOptions.getTargetPath()), StandardOpenOption.CREATE)) {
            ABBYYOcrConnector connector = abbyyOcrConnectorFactory.createABBYYOcrConnector(getKeywordList(redactionOptions));
            RedactorSettings settings = new RedactorSettings(connector);
			Redactor redactor = new Redactor(redactionOptions.getSourcePath(), new LoadOptions(), settings);
			List<Redaction> redactions = getRedactions(redactionOptions);
			RedactorChangeLog redactorChangeLog = redactor.apply(redactions.toArray(new Redaction[]{}));

			if (redactorChangeLog.getStatus() != RedactionStatus.Failed) {
			    RasterizationOptions rasterizationOptions = new RasterizationOptions();
			    rasterizationOptions.setEnabled(false);
			    redactor.save(outputStream, rasterizationOptions);

			    httpServletResponse.setStatus(HttpServletResponse.SC_OK);
			} else {
			    httpServletResponse.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
			}
        } catch (Exception e) {
            httpServletResponse.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }

    } else {
        httpServletResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);
    }
    return null;
}

}

测试样本:
test_w1.pdf (78.7 KB)
样本包含 2 张图片

测试关键字: 2个关键字
[{“blockcolor”: “0,0,0”, “keyword”: “leveraging”}, {“blockcolor”: “0,0,0”, “keyword”: “come from”}]

测试结果:
recognize 方法 被调用了4次 (2个关键字 * 2张图片 =4 次) 生成4张图片。
下面是图片内容
output1698462280762.png (135.8 KB)

output1698462280762.png (135.8 KB)

output1698462280762.png (135.8 KB)

output1698462280762.png (135.8 KB)

@weilin

我们已在内部问题跟踪系统中打开以下新票证,并将根据 Free Support Policies 中提到的条款提供修复。

 问题 ID:REDACTIONJAVA-182

如果您需要优先支持,以及直接联系我们的付费支持管理团队,您可以获取 Paid Support Services

@weilin

事实上,我们不会对 OCR 请求进行缓存,因此,如果您启用 OCR 并提供文本模式,则将为每个图像模式对请求一次 OCR 连接器。 这种缓存应该是 GroupDocs.Redaction API 的一部分这一点并不明显。 首先,它使用我们的库消耗进程的内存资源。 其次,并非所有客户端和用例都需要此类缓存。 例如,GroupDocs.Redaction 应用程序仅支持一种模式,并请求给定文件中的每个图像一次以匹配该模式。 如果用户的环境负载较高,则负载平衡将是客户端的选择,具体取决于实际需要。 例如,您可以将 OCR 连接器实现为 SOAP/REST 服务的客户端,该服务拥有自己的缓存和资源。 请注意,OCR 连接器是一个接口,而不是实现,实现是用户的选择和责任。

@atir.tahir 非常感谢您的回复。 看了您的回复, 感觉我们之间的理解上有一点差入。
我不是需要对OCR进行缓存, 我理解 OCR的调用次数 应该等于 图片的数量, 也就是每张图片 都会 调用一次 OCR, 每次调用 OCR的时候 将所有需要匹配的关键字 送给OCR服务, OCR服务 能够一次性 返回 所有关键字对应的坐标, 这样 对 recognize 的调用次数就会 等于 图片的数量, 而不是 等于 图片的数量 * 需要屏蔽关键字的数量。

@weilin

感谢您的澄清。 我们将进一步调查此事。

@atir.tahir 您好
我测试一个pdf文件 总共27页,通过我们的脱敏系统分离出来29张图片
其中要对 13个关键字 进行脱敏处理

RecognizedImage recognize(InputStream imageStream)
方法被调用 29*13=377次, 调用OCR服务377次, 脱敏花费时间:27分钟

每张图片调用的时候 我都将13个关键字送给OCR服务,并返回对应的坐标,
所以看下是不是 RecognizedImage recognize(InputStream imageStream)可以按照图片的数量调用,这样调用次数就由原来的377次减少到29次。

我们希望购买贵公司产品来实现我们对图片的脱敏功能, 目前这个测试时间 很难接受,希望能尽快得到回复,非常感谢!

@weilin

我们正在调查此事。 如有任何更新,您将收到通知。