1.PDF можно разложить на Tiff если установлен Ghostscript
1.1 Используя ImageMagick-6.7.4-Q16 :
Set img = CreateObject("ImageMagickObject.MagickImage.1")
myarray(0)="8BIM:"
msgs = img.Convert("null:","-profile","8BIMTEXT:iptctext.txt",myarray)
....
Основной недостаток умирает на PDF больших файлах ( >30 страниц)
1.2 Использовать конвертер nconvert.exe XnView
Пример: обрабатываем файлы рамером меньше <100 страниц
@echo off
cscript step1.js
SET DIR_IN=.\image\
SET DIR_OUT=.\tif\
if not exist %DIR_IN% mkdir %DIR_IN%
if not exist %DIR_OUT% mkdir %DIR_OUT%
FOR %%i IN (%DIR_IN%*) DO CALL :0 %%i
:0
for /f " tokens=2 delims=:" %%a in ('""C:\Program Files\XnView\nconvert.exe" -info %1 | findstr /R /C:"Page.s.*:""') do Set /A nPage = %%a
if %nPage% GTR 100 goto xDel:
"C:\Program Files\XnView\nconvert.exe" -out tiff -xall -dpi 300 -o %DIR_OUT%%~nx1.####.jpg %1
:xDel
if %ERRORLEVEL% NEQ 0 GOTO EOF
DEL %1 /Q
goto EOF
:EOF
2. Для распознования можно использовать OCR MS Office (версии меньше 2010) MODI.Document
При распозновании многстраничного TIF MODI.Document часто сваливается в ошибку и вылетает из скрипта.
При распозновании отдельных страниц возникает исключение всегда на пустых страницах.
На заполненых страницах иногда (повторная обработка)
Скрипт предназначен для получения текстовой информации из графических файлов для системы полнотекстового поиска.
Графические файлы разбиты на страницы батником из пп 1.2.
Контроль за повторной обработкой через списки lgood_jpg,lbad_jpg.
порядок следования распознанных страниц из-за исключения может быть произвольным.
var FolderIMG=".\\tif\\"
var FolderTXT=".\\txt_jpg\\"
var fso = new ActiveXObject("Scripting.FileSystemObject")
var Document = WScript.CreateObject ("MODI.Document");
function CopyTextFromTIF(PathIn,PathOut)
{
Document.Create(PathIn);
WScript.Sleep(250)
Document.OCR(25,true,true);
WScript.Sleep(100)
// Document.Save()
var iFile=fso.OpenTextFile(PathOut,8,true)
iFile.WriteLine(PathIn)
for (var j=0; j< Document.Images.Count; j++)
{
iFile.WriteLine(Document.Images.item(j).Layout.Text)
WScript.Sleep(100)
}
iFile.Close()
Document.Close(false);
WScript.Sleep(100)
this.CollectGarbage();
WScript.Sleep(250)
}
var k=0
var
oTif ={}
try
{
var a = fso.OpenTextFile("lgood_jpg", 1).ReadAll().split(/(\r\n)|(\n)/)
for (var i=1; i <a.length;i++)
oTif[a[i]]=1
}
catch (e){}
var oBad ={}
try
{
var a = fso.OpenTextFile("lbad_jpg", 1,true).ReadAll().split(/(\r\n)|(\n)/)
for (var i=1; i <a.length;i++)
{
var x=a[i]
if (oBad[x]==null)
oBad[x]=0
oBad[x]++
}
}
catch (e){}
var vDir=fso.GetFolder(FolderIMG)
for(var lSub= new Enumerator(vDir.files);!lSub.atEnd();lSub.moveNext())
{
var n=lSub.item()
try
{
if (oTif[n.path]==null && (oBad[n.path]==null || oBad[n.path]<4))
{
WScript.Echo(n.path)
var fln=fso.OpenTextFile("lbad_jpg", 8,true)
fln.WriteLine(n.path)
fln.Close()
var aX=n.Name.split('.')
CopyTextFromTIF(n.path,".\\txt_jpg\\"+aX[0]+"."+aX[1]+"."+aX[2]+".txt")
var fln=fso.OpenTextFile("lgood_jpg", 8,true)
fln.WriteLine(n.path)
fln.Close()
} else{
WScript.Echo("-"+n.path)
if (oTif[n.path] || (oBad[n.path] && oBad[n.path]>=4))
n.Delete(true)
}
}
catch(e)
{
WScript.Echo("?" + e.number + " " + e.description)
}
WScript.Sleep(50)
}
Скрипт необходимо запускается несколько раз подряд из батника из-за возможных ошибок с вылетом из скрипта объект MODI.Document
SET DIR_OUT=.\tif\
:modi
cscript modi_pdf.js
if exist %DIR_OUT%*.jpg goto :modi