使用C#的IronOCR处理PDF后出现文件占用无法重复处理的问题
C# IronOCR处理PDF文件被占用问题
问题场景
使用C#结合IronOCR监听指定文件夹提取PDF文本,首次运行正常,但再次放入相同或其他PDF时触发错误:
System.IO.IOException: 'The process cannot access the file 'D:\TestOCR\C01.pdf' because it is being used by another process.'
错误指向代码行:
using (var input = new OcrInput(pdfFileToProcess))
原处理代码:
var ocr = new IronTesseract(); using (var input = new OcrInput(pdfFileToProcess)) { input.Deskew(); input.Binarize(); var ocrResult = ocr.Read(input); textFromOCRResult = ocrResult.Text; }
解决方案
1. 复制到临时文件再处理
原文件可能被写入进程锁定,或IronOCR未正确释放原文件句柄,通过临时文件规避锁定问题:
// 生成唯一临时PDF路径 var tempFilePath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.pdf"); File.Copy(pdfFileToProcess, tempFilePath, overwrite: true); var ocr = new IronTesseract(); using (var input = new OcrInput(tempFilePath)) { input.Deskew(); input.Binarize(); var ocrResult = ocr.Read(input); textFromOCRResult = ocrResult.Text; } // 处理完成后清理临时文件 File.Delete(tempFilePath);
2. 确保文件完全写入后再处理
FileSystemWatcher可能在文件未完全写入时触发处理,导致文件被锁定,添加文件就绪检查:
// 检查文件是否可被独占访问,判断是否写入完成 private bool IsFileAccessible(string filePath) { try { using (var stream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { return true; } } catch (IOException) { return false; } } // 在监听事件中调用 if (!IsFileAccessible(pdfFileToProcess)) { // 延迟重试,避免处理未写入完成的文件 await Task.Delay(1500); // 重新执行PDF处理逻辑 }
3. 使用文件流加载PDF
改用文件流实例化OcrInput,手动控制文件访问权限,降低锁定概率:
var ocr = new IronTesseract(); // 以共享读写模式打开文件流 using (var fileStream = new FileStream(pdfFileToProcess, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (var input = new OcrInput(fileStream)) { input.Deskew(); input.Binarize(); var ocrResult = ocr.Read(input); textFromOCRResult = ocrResult.Text; }
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

