스캔 전처리와 구조화된 OCR

HPDFScanPreprocess는 호출자가 소유한 Graphics.TBitmap을 받아 라이브러리 내부에서 소유하는 보정 이미지와 역변환 가능한 지오메트리를 돌려주고, HPDFScanOCRWorkflow는 기존 IHPDFOCREngine을 재사용해 매핑된 단어와 의미 구조 레이아웃을 반환합니다

제공되는 인수 프로필은 Delphi와 Windows FPC/Lazarus 기준이고, Tesseract OSD 프로세스 어댑터는 Windows API를 쓰기 때문에 네이티브 Linux 헤드리스 문서 프로필에는 포함되지 않습니다

보정과 근거

보정 순서는 호출자가 지정한 원근 사변형 적용, 시계 방향 회전 판별, 연속 각도 기울기 보정이며, 이중 선형 역보간 샘플링을 사용하고 지정한 소스 영역 밖은 흰색으로 채웁니다

명시적 방향은 시계 방향 0, 90, 180, 270도를 지원하고, 자동 방향 판별은 탐지기를 필요로 하며 근거가 부족하거나 형식이 맞지 않으면 거절합니다

HPDFScanOrientationTesseract는 실행 파일 경로와 osd.traineddata가 들어 있는 tessdata 디렉터리를 명시적으로 받는 실제 Windows용 Tesseract OSD 어댑터를 제공하며, 셸을 거치지 않고 숨김 프로세스에서 --psm 0 -l osd --dpi 300을 바로 실행합니다

기본 raw 방향 마진 임계값은 15이고, LastOrientationScore에는 Tesseract 점수가 그대로 남습니다. 정규화된 신뢰도는 점수를 15로 나눈 뒤 [0, 1]로 잘라낸 값인데, 이 정규화는 근거의 스케일일 뿐 보정된 확률은 아닙니다

자동 기울기 보정은 실제 어두운 픽셀을 샘플링해 제한된 각도 범위에서 행 투영 집중도를 비교합니다. 기본 범위는 0.25도 간격 ±10도이고 근거 임계값은 0.2이며, 근거가 부족하면 명시적 각도를 그대로 두고 DeskewAccepted = False를 기록합니다

명시적 기울기 보정은 -180도부터 180도까지 연속 각도를 모두 받고, 자동 탐색은 반경 최대 45도까지 지원하며 스텝은 0.1도에서 5도 사이여야 합니다

원근 보정에는 소스 래스터 안에 좌상단, 우상단, 우하단, 좌하단 순서로 정렬된 유한한 볼록 사변형과 명시적 대상 크기가 필요하고, 사변형 자동 탐지는 제공하지 않습니다

정리와 유한한 예산

기본 동작은 타일 국소 그림자를 정규화하고 연속된 어두운 가장자리 행과 열을 제거하며 그레이스케일 출력을 유지합니다. 3×3 미디언 노이즈 제거와 이진 출력은 옵션으로 켤 수 있습니다

정리 단계는 좌표 원점을 바꾸지 않고 가장자리 픽셀을 흰색으로 만들며, RemovedBorderPixels가 영향받은 픽셀 수를 알려주고 균일한 빈 래스터는 OCR을 건너뜁니다

기본 상한은 차원당 32768픽셀, 입력·출력 각 16777216픽셀, 보수적으로 잡은 512 MiB 작업 할당 추정치, 500000000 작업 단위, 20000회 기울기 보정 샘플이고, 소스 픽셀 수는 부호 있는 정수 인덱스 범위 안에도 들어와야 합니다

이 추정치는 내부에서 소유하는 래스터 복제본, 그레이스케일 배열, 출력 저장소, 샘플, 히스토그램을 대상으로 하며, 호출자 소스 비트맵이나 운영체제 그래픽 할당, 임의의 외부 OCR 엔진에는 상한을 두지 않습니다

Tesseract OSD는 별도로 픽셀과 stdout/stderr 합산 크기에 상한을 두고 25밀리초마다 취소 여부와 출력 크기를 확인하며, 타임아웃·취소·출력 초과 시 자식 프로세스를 종료합니다. 타임아웃은 1~3600000밀리초, 출력 상한은 1024~1048576바이트여야 합니다

소유권과 롤백

HPDFPreprocessScan은 소스 비트맵을 절대 수정하지 않고, 성공하면 호출자가 OutputBitmap을 해제하며 실패하면 nil과 진단 근거가 담긴 상태를 반환합니다

탐지기에는 내부 복제본이 전달되고, 취소는 행·후보 각도·프로세스 대기·단어 처리 경계에서 협력적으로 처리됩니다. 넘겨준 OCR 엔진도 요청 토큰과 자체 프로세스·출력 상한을 지켜야 합니다

워크플로는 실패할 때마다 단어, 의미 레이아웃, 행 사변형을 지우고, 어댑터는 변경 가능한 마지막 리포트 상태를 유지하므로 직렬로 사용해야 합니다

지오메트리와 구조화된 OCR

래스터 좌표는 좌상단 원점과 픽셀 중심을 기준으로 하고, 동차 행렬은 열 벡터 (X, Y, 1)에 작용한 뒤 세 번째 좌표로 나눕니다. 변환 곱 A × B는 B가 먼저 적용됩니다

SourceToOutput과 OutputToSource는 아핀 또는 프로젝티브 변환 전체를 그대로 유지하며, 공개 헬퍼를 쓸 때는 입력과 출력 레코드를 따로 매핑하세요

OCR 래퍼는 보정된 래스터와 회전하지 않은 임시 PDF 경계를 엔진에 넘긴 뒤 UTF-16과 유한한 단어 사각형을 검증하고, 신뢰도가 부족하거나 매핑할 수 없는 단어는 버린 후 사각형, 베이스라인, 네 꼭짓점을 원본 래스터로 되돌려 매핑합니다

PageQuad와 의미 경계는 들어온 PDF 페이지 박스, DPI, 0/90/180/270도 페이지 회전을 반영하고, 읽기 순서는 지오메트리를 되돌려 매핑하기 전에 보정된 반듯한 프레임에서 분석합니다

문자 구간은 OCR 단어 박스에서 보간한 값이라 근사치로 남고, 행 사변형은 축 정렬 경계로는 표현할 수 없는 회전과 원근을 그대로 보존합니다

HPDFScanOCRLayoutToDOM은 분석 순서대로 소유권이 있는 편집 가능한 스택을 만들며, 탐지된 제목은 heading 노드, 나머지 행은 text 노드로 배치합니다

예제

Options := HPDFDefaultScanOCRWorkflowOptions;
Options.Preprocess.AutoOrientation := True;
Detector := HPDFCreateTesseractOrientationDetector(
  TesseractExecutable, OSDModelDirectory,
  HPDFDefaultTesseractOrientationOptions);
Adapter := HPDFCreateScanPreprocessingOCREngine(
  ExistingOCREngine, Options, Detector);
if Adapter.Recognize(Request, Words, Diagnostic) then
begin
  Report := Adapter.LastReport;
  DOM := HPDFScanOCRLayoutToDOM(Report);
  try
    // Consume the editable semantic output here
  finally
    DOM.Free;
  end;
end;

검증

비 GUI Delphi 스위트는 명시적 방향, ±179.25도까지 되돌릴 수 있는 연속 각도, 실제 Tesseract 자동 0/90/180/270도 방향 판별과 빈 이미지 거부, 실제 5도 자동 기울기 보정, 노이즈·그림자 정리, 원근 꼭짓점, 예산, 취소, 소스 불변성, 그리고 37.5도 기울어진 스캔을 포함한 여섯 래스터 변형에 대한 실제 영어 OCR을 검사합니다

실제 OCR 케이스에서 받아들인 모든 단어 꼭짓점은 역변환으로 되돌려 보정된 래스터 기준 1e-6픽셀 안에서 검사하고, FPC 스모크 스위트는 여기에 실제 기울기 보정, 취소, 할당 상한, 180도 및 빈 이미지 OSD, 실제 영어 OCR 레이아웃을 추가로 실행합니다

생성된 공개 헤더는 관리되는 OCR 리포트, 기본값 인터페이스 인자, 지오메트리 변환, DOM 소유권을 포함해 C++Builder Win32와 Win64x에서 컴파일됩니다

HOTPDF_TESSERACT_EXE, OSD 모델용 HOTPDF_TESSDATA, 영어 모델용 HOTPDF_OCR_TESSDATA를 설정하면 외부 엔진 검증이 활성화되고, 선택적 런타임 설정이 빠져 있으면 실제 OCR 인수 검증은 성립하지 않습니다