<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6987</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6987&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS, Jscript: объект типа OCR для чтения и распознавания PDF».]]></description>
		<lastBuildDate>Fri, 20 Apr 2012 19:53:10 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=59601#p59601</link>
			<description><![CDATA[<p>ghostscript -pDEVICE=tifflzw -pOutputFile=file.tif &lt; file.pdf + modi.document</p>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Fri, 20 Apr 2012 19:53:10 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=59601#p59601</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58833#p58833</link>
			<description><![CDATA[<div class="quotebox"><cite>dab00 пишет:</cite><blockquote><p>штрих-код - это же шрифт, устанавливай и &quot;распознавай&quot; <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p></blockquote></div><p>dab00,</p><p>а Вы сами-то пробовали так сделать? <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Slav)]]></author>
			<pubDate>Wed, 04 Apr 2012 13:08:29 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58833#p58833</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58832#p58832</link>
			<description><![CDATA[<p>Извините, раньше не мог.</p><p>Работает так.<br />У каждого делопроизводителя есть обычные листки, на которых четко указана его фамилия - обычная распечатка.<br />Регистрируя документ, он кладет его оригинал в стопку таких же, а сверху кладет этот самый листочек со своей фамилией.<br />Перед тем как пойти попить чайку, делопроизводитель берет свою пачку, а заодно и такие же пачки со столов своих коллег.<br />Все это соединяется в одну общую пачку и закладывается в сетевой сканер.<br />Тот сканирует эту пачку, выдавая один большой PDF-файл.<br />Мой скрипт разбирает этот PDF и по листкам-закладкам рассылает каждый по адресу соответствующего делопроизводителя.<br />Разбирает так: <br />Проходит по каждой странице исходного PDF, каждую страницу сохраняет отдельно в виде PDF.<br />Если PDF с одной страницей &quot;большой&quot; (в моем случае &gt;10 Кбайт) - он тут же удаляется.<br />Если PDF с одной страницей &quot;маленький&quot; (&lt;10 Кбайт) - он тут же средствами объекта AcroExch.PDDoc пересохраняется как TIF.<br />И этот TIF поступает в OCR (MODI).<br />Если в распознанном тексте находится фамилия одного из делопроизводителей - страница признается разделителем.<br />В этом случае происходит вырезание в исходном PDF соответствующего диапазона страниц, сохранение в формате PDF, отсылки этого документа по почте соответствующему делопроизводителю.</p><p>Для работы требуется полноценный ACROBAT (объекта AcroExch.PDDoc) и MS Office не ниже 2003 (объект MODI).</p><br /><div class="codebox"><pre><code>&#039;
&#039; 1) разделить PDF постранично
&#039; 2) страницу-разделитель сохранить как TIF
&#039; 3) TIF передать в OCR MS MODI
&#039;

  rootDir = Left(WScript.ScriptFullName, instrrev(WScript.ScriptFullName,&quot;\&quot;))

  FileName = rootDir + &quot;Scan002.pdf&quot;

&#039; открыть PDF
  Set oPDFDoc = CreateObject(&quot;AcroExch.PDDoc&quot;)

  If (Not oPDFDoc.Open(FileName)) Then
    Set oPDFDoc = Nothing
    WScript.Echo &quot;Файл не найден : &quot; &amp; FileName
    WScript.Quit 1
  End If

&#039; сохранить как TIF
  Set oTIFDoc = CreateObject(&quot;AcroExch.PDDoc&quot;)
&#039; OCR MODI
  Set ocrMODI = CreateObject(&quot;MODI.Document&quot;)

  Set JSO = oPDFDoc.GetJSObject

  x_start = -1
  for x = 0 to JSO.numPages - 1
    FLNew = rootDir &amp; &quot;temp&quot; &amp; right(x + 1001,3) &amp;&quot;.pdf&quot;
    JSO.extractPages x, x, FLNew

&#039; размер файла
    Set tmpPDF = objFSO.GetFile(FLNew)
      theSize = tmpPDF.Size

&#039; проверить - закладка или нет
    flZakladka = False
    if (theSize &lt; 10000) then  &#039;  10000 - максимальный размер файла закладки
       &#039; сохранить как TIF
       retCod = oTIFDoc.Open(FLNew)
         Set JSTif = oTIFDoc.GetJSObject
           FLTif = rootDir &amp; &quot;temp&quot; &amp; right(x + 1001,3) &amp; &quot;.tif&quot;
           retCod = JSTif.SaveAs(FLTif, &quot;com.adobe.acrobat.tiff&quot;)
         Set JSTif = Nothing
       oTIFDoc.Close
       &#039; OCR MODI
       ocrMODI.Create(FLTif)
          ocrMODI.Images.item(0).OCR
          strResult = ocrMODI.Images.item(0).Layout.Text
          strResult = Replace(strResult, vbCrLf, &quot;&quot;)
       ocrMODI.Close()
       &#039; удаляем временный TIF
       Set tmpTIF = objFSO.GetFile(FLTif)
         tmpTIF.Delete(true)
       Set tmpTIF = Nothing

       flZakladka = True
    end if

&#039; удаляем временный PDF
      tmpPDF.Delete(true)
    Set tmpPDF = Nothing

&#039; закладка
    if (flZakladka) then
       if (x_start &gt;= 0) then
          x1 = x - 1
          FLPart = rootDir &amp; strSave &amp; &quot;_Документ_&quot; &amp; right(x_start+1001, 3) &amp; &quot;_&quot; &amp; right(x1+1001,3) &amp; &quot;.pdf&quot;
          JSO.extractPages x_start, x1, FLPart
            currFile = FLPart
            Call SendEmail
       end if
       x_start = x + 1
       strSave = strResult

       if (strSave = &quot;ИВАНОВ&quot;)  then SendToAddr = &quot;ivanov@domen.ru&quot;
       if (strSave = &quot;ПЕТРОВ&quot;)  then SendToAddr = &quot;petrov@domen.ru&quot;
       if (strSave = &quot;СИДОРОВ&quot;) then SendToAddr = &quot;sidorov@domen.ru&quot;
    end if

  next

&#039; последний документ
          x1 = x - 1
          FLPart = rootDir &amp; strSave &amp; &quot;_Документ_&quot; &amp; right(x_start+1001, 3) &amp; &quot;_&quot; &amp; right(x1+1001,3) &amp; &quot;.pdf&quot;
          JSO.extractPages x_start, x1, FLPart
            currFile = FLPart
            Call SendEmail

  oPDFDoc.Close

  Set JSO = Nothing
  Set ocrMODI = Nothing
  Set oTIFDoc = Nothing
  Set oPDFDoc = Nothing

  Set objFSO = Nothing

WScript.Echo &quot;The End&quot;

WScript.Quit 0


&#039; *** отправка по почте

Sub SendEmail
...
 здесь используем SendToAddr
...
End Sub</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Slav)]]></author>
			<pubDate>Wed, 04 Apr 2012 12:59:45 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58832#p58832</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58495#p58495</link>
			<description><![CDATA[<div class="quotebox"><cite>Slav пишет:</cite><blockquote><p>кто-нибудь может посоветовать библиотеку для распознавания штрих-кодов?<br />Для начала хотелось бы бесплатную... <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p></blockquote></div><p>штрих-код - это же шрифт, устанавливай и &quot;распознавай&quot; <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (dab00)]]></author>
			<pubDate>Wed, 28 Mar 2012 05:40:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58495#p58495</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58493#p58493</link>
			<description><![CDATA[<p>badik,</p><p>спасибо за практически готовое решение.</p><p>Задачу решил, скрипт выложу чуть позже.</p><p>Пока хочу задать дополнительный вопрос - кто-нибудь может посоветовать библиотеку для распознавания штрих-кодов?<br />Для начала хотелось бы бесплатную... <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Slav)]]></author>
			<pubDate>Wed, 28 Mar 2012 04:53:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58493#p58493</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58375#p58375</link>
			<description><![CDATA[<p>1.PDF можно разложить на Tiff если установлен&nbsp; <strong>Ghostscript</strong><br />&nbsp; 1.1 Используя <strong>ImageMagick-6.7.4-Q16 </strong>:<br /></p><div class="codebox"><pre><code>Set img = CreateObject(&quot;ImageMagickObject.MagickImage.1&quot;)
myarray(0)=&quot;8BIM:&quot;
msgs = img.Convert(&quot;null:&quot;,&quot;-profile&quot;,&quot;8BIMTEXT:iptctext.txt&quot;,myarray)
....</code></pre></div><p>Основной недостаток умирает на PDF больших файлах ( &gt;30 страниц) </p><p> 1.2 Использовать конвертер nconvert.exe <strong>XnView</strong> <br />Пример: обрабатываем файлы рамером&nbsp; меньше &lt;100 страниц<br /></p><div class="codebox"><pre><code>@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 &quot; tokens=2 delims=:&quot; %%a in (&#039;&quot;&quot;C:\Program Files\XnView\nconvert.exe&quot; -info %1 | findstr  /R /C:&quot;Page.s.*:&quot;&quot;&#039;) do  Set /A  nPage = %%a
if %nPage% GTR 100 goto xDel:
&quot;C:\Program Files\XnView\nconvert.exe&quot; -out tiff -xall -dpi 300  -o %DIR_OUT%%~nx1.####.jpg %1  

:xDel
if %ERRORLEVEL% NEQ 0 GOTO EOF
DEL %1 /Q
goto EOF
:EOF</code></pre></div><p>2. Для распознования&nbsp; можно использовать OCR&nbsp; MS Office&nbsp; (версии меньше 2010) <strong>MODI.Document</strong><br />При распозновании многстраничного TIF&nbsp; MODI.Document часто сваливается в ошибку и вылетает из скрипта.<br />При распозновании отдельных страниц возникает исключение всегда на пустых страницах. <br />На заполненых страницах иногда (повторная обработка) </p><p>Скрипт предназначен для получения текстовой информации из графических файлов для системы полнотекстового поиска.<br />Графические файлы разбиты на страницы батником из пп 1.2.<br />Контроль за повторной обработкой через списки lgood_jpg,lbad_jpg.<br />порядок следования распознанных страниц из-за исключения может быть произвольным.</p><div class="codebox"><pre><code>var FolderIMG=&quot;.\\tif\\&quot;
var FolderTXT=&quot;.\\txt_jpg\\&quot;

var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;)
var Document = WScript.CreateObject (&quot;MODI.Document&quot;);

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&lt; 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(&quot;lgood_jpg&quot;, 1).ReadAll().split(/(\r\n)|(\n)/)
for (var i=1; i &lt;a.length;i++)
oTif[a[i]]=1
}
catch (e){}

var oBad ={}
try
{
var a = fso.OpenTextFile(&quot;lbad_jpg&quot;, 1,true).ReadAll().split(/(\r\n)|(\n)/)
for (var i=1; i &lt;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 &amp;&amp; (oBad[n.path]==null ||  oBad[n.path]&lt;4))
{
WScript.Echo(n.path)

var fln=fso.OpenTextFile(&quot;lbad_jpg&quot;, 8,true)
fln.WriteLine(n.path)
fln.Close()

var aX=n.Name.split(&#039;.&#039;)
CopyTextFromTIF(n.path,&quot;.\\txt_jpg\\&quot;+aX[0]+&quot;.&quot;+aX[1]+&quot;.&quot;+aX[2]+&quot;.txt&quot;)
var fln=fso.OpenTextFile(&quot;lgood_jpg&quot;, 8,true)
fln.WriteLine(n.path)
fln.Close()
} else{
WScript.Echo(&quot;-&quot;+n.path)
if (oTif[n.path]  || (oBad[n.path] &amp;&amp;  oBad[n.path]&gt;=4))
n.Delete(true)
}
}
catch(e)
{
WScript.Echo(&quot;?&quot; + e.number + &quot; &quot; + e.description)
}
WScript.Sleep(50)
}</code></pre></div><p>Скрипт необходимо запускается несколько раз подряд из батника из-за возможных ошибок с вылетом из скрипта объект <strong>MODI.Document</strong></p><div class="codebox"><pre><code>SET DIR_OUT=.\tif\
:modi
cscript modi_pdf.js
if  exist %DIR_OUT%*.jpg goto :modi</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (badik)]]></author>
			<pubDate>Mon, 26 Mar 2012 07:22:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58375#p58375</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58347#p58347</link>
			<description><![CDATA[<div class="quotebox"><cite>JSman пишет:</cite><blockquote><p>GetJSObject() возвращает данные о PDF-яваскриптe. К получению данных извне он не имеет никакого отношения.</p></blockquote></div><p>JSman,</p><p>вероятно, я не очень точно сформулировал задачу.<br />Никаких внешних данных мне получать не нужно.</p><p>Есть готовый многостраничный PDF - по большому счету как он получен вообще не важно (в моем случае он отсканирован с МФУ).<br />Весь этот файл состоит только из графических объектов - результатов сканирования.<br />На <em>первом</em> этапе мне просто надо пройтись по всем этим графическим объектам.<br />А уже на <em>втором</em> - передать каждый из них в OCR, проанализировать и если это страница-разделитель то предпринять соответствующие действия.</p><p>Вот с первым этапом пока проблема.<br />Аналог из VBA.<br />Откройте, например, WORD, вставьте туда пару картинок и запустите макро:<br /></p><div class="codebox"><pre><code>Sub Test01()
  MsgBox ActiveDocument.InlineShapes.Count
End Sub</code></pre></div><p>Понятно - есть коллекция графических объектов, по этой коллекции можно пройтись, каждый элемент можно передать в OCR и т.д.</p><p>Есть ли что-то похожее в Acrobate?</p>]]></description>
			<author><![CDATA[null@example.com (Slav)]]></author>
			<pubDate>Sun, 25 Mar 2012 05:20:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58347#p58347</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58345#p58345</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Для него, наверное, Acrobat нужен, не Reader?</p></blockquote></div><p>alexii,</p><p>да, нужен полный Acrobat - только Reader это объект не ставит.</p>]]></description>
			<author><![CDATA[null@example.com (Slav)]]></author>
			<pubDate>Sun, 25 Mar 2012 05:06:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58345#p58345</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58310#p58310</link>
			<description><![CDATA[<p>GetJSObject() возвращает данные о PDF-яваскриптe. К получению данных извне он не имеет никакого отношения.</p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Sat, 24 Mar 2012 07:08:34 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58310#p58310</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58304#p58304</link>
			<description><![CDATA[<div class="quotebox"><cite>Slav пишет:</cite><blockquote><p>кто работал с объектом AcroExch.PDDoc ?</p></blockquote></div><p>Для него, наверное, Acrobat нужен, не Reader?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 23 Mar 2012 18:31:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58304#p58304</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58299#p58299</link>
			<description><![CDATA[<p>Сформулирую вопрос по другому:</p><p>кто работал с объектом AcroExch.PDDoc ?</p><p>Я открываю PDF-файл этим объектом - как с его помощью пройтись по всем картинкам, которые в нем?<br />Т.е. найти первую, затем цикл по всем остальным?</p><p>Рою в направлении метода GetJSObject() - но пока не получается.</p>]]></description>
			<author><![CDATA[null@example.com (Slav)]]></author>
			<pubDate>Fri, 23 Mar 2012 10:45:45 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58299#p58299</guid>
		</item>
		<item>
			<title><![CDATA[VBS, Jscript: объект типа OCR для чтения и распознавания PDF]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58284#p58284</link>
			<description><![CDATA[<p>Добрый день, коллеги.</p><p>Постановка задачи: на входе PDF-файл, в котором много разных документов.<br />Документы разделены любым способом - например, пустой страницей.<br />По хорошему хотелось бы, конечно, на странице-разделителе указаны атрибуты документа - например, номер, исполнитель и т.д.<br />В последнем случае разделитель имеет любую фиксированную структуру - типа начинается с фразы &quot;Это новый документ&quot;.</p><p>Скрипт открывает этот PDF и делит один файл на то количество файлов, сколько документов было отсканировано.<br />Делает он это - как вы догадываетесь - по тем страницам-разделителям, которые были заложены при сканировании.<br />Хорошо бы файлы называть осмысленно - именно для этого и хотелось бы не пустышку-разделитель, а разделитель с некой инфой, например номер документа.</p><p>Т.е. на разделителе сразу печатается, например:<br /><em>Это новый документ<br />Файл: 123456.pdf</em></p><p>Пока вижу одно решение - найти какой-нибудь OCR-объект, который понимает PDF.<br />Порекомендуйте, пожалуйста, какие есть?</p><p>Любые альтернативные идеи приветствуются.<br />Спасибо.</p>]]></description>
			<author><![CDATA[null@example.com (Slav)]]></author>
			<pubDate>Fri, 23 Mar 2012 07:06:08 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58284#p58284</guid>
		</item>
	</channel>
</rss>
