1 (изменено: DD, 2020-04-09 03:53:02)

Тема: AHK: Правка распознанного теста в LibreOffice Writer

Привет. Как бы компенсируя отсутствие поиска по регулярным выражениям в ФайнРидере, возникла идея подгрузить страницу в GUI и искать в нем. В архиве пример такой страницы — https://yadi.sk/d/hvU-kxEnc0omyQ. При этом изображение и текст внутри страницы прокручиваются одновременно (см. скриншот), а редактирование HTML-страницы обеспечивается следующим плагином. Надо создать файл «Edit.HTM» с содержимым —


<HTML>
<SCRIPT LANGUAGE="JavaScript" defer>
var parentwin=external.menuArguments;
var doc=parentwin.document;
doc.designMode="On";
</SCRIPT>
</HTML>

И запустить следующий REG-файл, после чего в IE по правой кнопке мыши появится пункт "Режим редактирования" —


Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\&Режим редактирования]
@="E:\\ПУТЬ__К__ФАЙЛУ\\Edit.HTM"
"Contexts"=dword:00000001

И вот интересует, предусмотрен поиск по Regex в GUI?

2

Re: AHK: Правка распознанного теста в LibreOffice Writer

Нет, поиск по RegEx предусмотрен только в строке.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: DD, 2020-04-06 21:43:58)

Re: AHK: Правка распознанного теста в LibreOffice Writer

Решил попробовать сделать следующее: править сохраненный из ФайнРидера документ в LibreOffice Writer (бесплатный аналог Ворда), в котором есть поддержка регулярных выражений и чтобы при переходе на определенную страницу, AHK выводил изображение этой страницы в своем окне. Но не удается получить видимый в левом нижнем углу номер активной страницы, через AhkSpy в том числе. Помню, к Ворду как-то получали особый доступ, есть то же самое для LibreOffice?

4

Re: AHK: Правка распознанного теста в LibreOffice Writer

Я мало что понял, но если у вас есть html-код страницы, текст из него вы можете получить так:

filePath := "D:\Downloads\Synchronized.htm"
FileRead, html, % filePath

doc := ComObjCreate("htmlfile")
doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")
doc.write(html)

MsgBox, % doc.documentElement.innerText
DD пишет:

LibreOffice Writer (бесплатный аналог Ворда)

Вы можете купить ключ к полному пакету Microsoft Office на eBay за ~300 руб.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: DD, 2020-04-06 22:46:20)

Re: AHK: Правка распознанного теста в LibreOffice Writer

Суть в том, что при распознавании документа непосредственно в ФайнРидере, в документе содержится множество однотипных ошибок распознавания, которые при простом поиске нельзя находить и автоматически исправлять. Поэтому возник вариант сохранить документ из ФайнРидера как текст (doc|odt) и править его там, где есть поддержка регулярных выражений. А это (в отличие от Ворда, где нет рег. выражений) — LibreOffice. То есть в нём появляется возможность править текст с применением рег. выражений, но при этом отсутствует возможность видеть изображение страницы — тот оригинал, с которого она распознана. Поэтому хотелось бы настроить, чтобы скрипт циклически получал номер активной страницы открытого в LibreOffice документа и выводил соответствующее этой странице изображение, которые будут в разрозненном (в виде картинок) виде находится отдельно.

6

Re: AHK: Правка распознанного теста в LibreOffice Writer

https://www.mythicsoft.com/filelocatorpro/

7 (изменено: DD, 2020-04-07 23:06:23)

Re: AHK: Правка распознанного теста в LibreOffice Writer

Вроде, там нет поиска по выведенной во фрейме странице. По ходу вспомнил о другой похожей программе — DtSearch, но в ней нет поиска по рег. в. В целом конечно они только ищут, а нужна и замена, поэтому предпочтительней LibreOffice. Пока что смотрю возможности макросов в LibreOffice, чтобы оттуда передавался номер страницы.

8

Re: AHK: Правка распознанного теста в LibreOffice Writer

В LibreOffice есть api:
https://api.libreoffice.org/
Так что, наверное, ничего не должно быть сложного.

+ DD

9 (изменено: DD, 2020-04-08 01:00:02)

Re: AHK: Правка распознанного теста в LibreOffice Writer

Смотрел примеры работы с этим api:

https://www.autohotkey.com/boards/viewt … mp;t=26570
https://www.autohotkey.com/boards/viewt … mp;t=23885

С api.libreoffice.org отобрал скорее всего относящиеся к номеру страницы команды:

sun::star::ui::dialogs::XWizardPage
sun::star::drawing::PageShape
sun::star::text::textfield

которые в скрипте надо записывать через точку:

sun.star.ui.dialogs.XWizardPage
sun.star.drawing.PageShape
sun.star.text.textfield

В итоге как запускать скрипт, чтобы в вывод попала активная страница?

1::
page := ComObjCreate("com.sun.star.drawing.PageShape")
MsgBox, % page
return

10

Re: AHK: Правка распознанного теста в LibreOffice Writer

Не то ищите.
Вам нужно получить объектную модель документа.
После чего получить нужную часть статус бара:

msgbox % oDoc.CurrentController.frame.layoutmanager.getElement("private:resource/statusbar/statusbar").RealInterface.AccessibleContext.getAccessibleChild(0).Text

11

Re: AHK: Правка распознанного теста в LibreOffice Writer

Что-то наклевывается). Вот так получается создать/открыть новый документ и получить инфу о страницах, — а надо бы получать из уже открытого —

1::
oSM := ComObjCreate("com.sun.star.ServiceManager")
oDesk := oSM.createInstance("com.sun.star.frame.Desktop")
oArray := ComObjArray(0xC, 2) ;VT_VARIANT := 0xC
oDoc := oDesk.loadComponentFromURL("private:factory/swriter", "_blank", 0, oArray)

msgbox % oDoc.CurrentController.frame.layoutmanager.getElement("private:resource/statusbar/statusbar").RealInterface.AccessibleContext.getAccessibleChild(0).Text
return

12

Re: AHK: Правка распознанного теста в LibreOffice Writer

Если вы внимательно почитаете примеры кодов по вашим же ссылкам, то поймете как подсоединяться к открытому документу.

+ DD

13

Re: AHK: Правка распознанного теста в LibreOffice Writer

А-а, вот оно, спасибо

1::
oSM := ComObjCreate("com.sun.star.ServiceManager")
oDesk := oSM.createInstance("com.sun.star.frame.Desktop")
oArray := ComObjArray(0xC, 2) ;VT_VARIANT := 0xC
oDoc := oDesk.CurrentComponent("private:factory/simpress", "_blank", 0, Array)

msgbox % oDoc.CurrentController.frame.layoutmanager.getElement("private:resource/statusbar/statusbar").RealInterface.AccessibleContext.getAccessibleChild(0).Text
return

14 (изменено: Malcev, 2020-04-08 07:01:03)

Re: AHK: Правка распознанного теста в LibreOffice Writer

Так как у вас работает с 2 ошибками, то это

oArray := ComObjArray(0xC, 2) ;VT_VARIANT := 0xC
oDoc := oDesk.CurrentComponent("private:factory/simpress", "_blank", 0, Array)

можно заменить на это:

oDoc := oDesk.CurrentComponent()

Да и нет смысла каждый раз новый ком объект создавать, достаточно будет так:

oSM := ComObjCreate("com.sun.star.ServiceManager")
oDesk := oSM.createInstance("com.sun.star.frame.Desktop")
f1:: msgbox % oDesk.CurrentComponent.CurrentController.frame.layoutmanager.getElement("private:resource/statusbar/statusbar").RealInterface.AccessibleContext.getAccessibleChild(0).Text
+ DD

15

Re: AHK: Правка распознанного теста в LibreOffice Writer

Жаль, в LibreOffice нельзя настроить, чтобы страница всегда отображалась только целиком, без непрерывной прокрутки. Иначе можно было бы в зависимости от клика в определенной области экрана, показывать ту же часть на изображении страницы.

16 (изменено: DD, 2020-04-09 01:42:07)

Re: AHK: Правка распознанного теста в LibreOffice Writer

Вот имеющийся код:

SetBatchLines, -1
#SingleInstance Force

pic_name_width := "4" 		; ширина счётчика в названиях изображений: 0001.jpg, 0002.jpg...
WidthOrNot := "1" 		; 0 — если названия изображений не имеют ширины: 1.jpg, 2.jpg...
pic_ext := "tif" 		; расширение изображений страниц
pic_pth := "E:\SCANz\"		; папка с изображениями страниц

oSM := ComObjCreate("com.sun.star.ServiceManager")

Gui, -Caption +AlwaysOnTop ;+Lastfound 
Gui, Margin, 0, 0
Gui, Add, Pic, h700 w600 vGuiPic, %pic_pth%%page%.%pic_ext%     ; x96 y20
OnMessage(0x201, "WM_LBUTTONDOWN")

loop
{
sleep 30

global pic_ext
global pic_pth
global WidthOrNot
global pic_name_width

If WinActive("ahk_exe soffice.bin")
{
   oDesk := oSM.createInstance("com.sun.star.frame.Desktop")
   page := oDesk.CurrentComponent.CurrentController.frame.layoutmanager.getElement("private:resource/statusbar/statusbar").RealInterface.AccessibleContext.getAccessibleChild(0).Text

   page := RegExReplace(page, "s)^[^\d]*(\d+) .*", "$1")
   If WidthOrNot
      page := Format("{:0" . pic_name_width . "u}", page)
   ;tooltip %pic_pth%%page%.%pic_ext%

   If NOT (pg_tmp = page) {
      Gui, Show, NA
      GuiControl,, GuiPic, %pic_pth%%page%.%pic_ext%
      pg_tmp := page
   }
}
else
   sleep 1000
}
return

WM_LBUTTONDOWN()
{
 WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
 PostMessage, WM_NCLBUTTONDOWN, HTCAPTION
}

17

Re: AHK: Правка распознанного теста в LibreOffice Writer

DD пишет:

Жаль, в LibreOffice нельзя настроить, чтобы страница всегда отображалась только целиком, без непрерывной прокрутки.

view->zoom->entire page

?

18 (изменено: DD, 2020-04-09 02:24:55)

Re: AHK: Правка распознанного теста в LibreOffice Writer

В этом случае страница впишется в экран вся, но при прокрутке (либо при использовании диалога поиска-замены) этот вид будет меняться и она не будет целиком видна — видна будет и часть другой страницы. Если бы прокрутка целиком сменяла страницу, тогда появилась бы возможность относительно экрана опознавать, куда относительно этой страницы поставлен курсор, чтобы вывести ту же увеличенную область на изображении страницы.

19

Re: AHK: Правка распознанного теста в LibreOffice Writer

Накладывайте события на перемещение курсора.
Если лень в это углубляться можете через ahk определять, что страница изменилась и посылать зум на всю страницу.

20

Re: AHK: Правка распознанного теста в LibreOffice Writer

По-моему, если страницы непрерывно прокручиваются — это уже нерешаемо. То есть, скрипт будет отрабатывать, будто на экране целая страница, хотя на экране будут две половины двух идущих одна за другой страниц, в разном размере. И поэтому в скрипте не пропишешь, что курсор стоит в первой половине второй страницы, или во второй половине первой страницы, потому что не опознается граница между двумя страницами. В «Файл->Просмотр печати» (Ctrl+Shift+O) есть нужная функция постраничной прокрутки, но там нет возможности замен.

21

Re: AHK: Правка распознанного теста в LibreOffice Writer

Я понял, что вы сказали, надо попробовать.

22

Re: AHK: Правка распознанного теста в LibreOffice Writer

Можно прокручивать pgup, pgdwn и следить за кареткой:

setbatchlines -1
oSM := ComObjCreate("com.sun.star.ServiceManager")
oDesk := oSM.createInstance("com.sun.star.frame.Desktop")
loop
{
   page := oDesk.CurrentComponent.CurrentController.ViewCursor.getPage
   if (oldpage != page)
   {
      oldpage := page
      oDesk.CurrentComponent.CurrentController.ViewSettings.ZoomType := 2
   }
   sleep 1
} 
+ DD

23 (изменено: DD, 2020-04-10 04:44:02)

Re: AHK: Правка распознанного теста в LibreOffice Writer

Юзабельно получается) С обработкой областей и кареткой пока застрял, далеко не банально.

SetBatchLines, -1
#SingleInstance Force

pic_name_width := "4" 		; ширина счётчика в названиях изображений: 0001.jpg, 0002.jpg...
WidthOrNot := "1" 		; 0 — если названия изображений не имеют ширины: 1.jpg, 2.jpg...
pic_ext := "tif" 		; расширение изображений страниц
pic_pth := "E:\SCANz\"		; папка с изображениями страниц

oSM := ComObjCreate("com.sun.star.ServiceManager")

Gui, 2:-Caption +AlwaysOnTop +Resize +HWNDhWin  ;+Lastfound 
Gui, 2:Margin, 0, 0
Gui, 2:Add, Pic, h700 w600 vGuiPic, %pic_pth%%page%.%pic_ext%     ; x96 y20
Gui, 2:Font, s10 norm
OnMessage(0x201, "WM_LBUTTONDOWN")
OnMessage(0x204, "WM_RBUTTONDOWN")

loop
{
sleep 1

global pic_ext
global pic_pth
global WidthOrNot
global pic_name_width

If WinActive("ahk_exe soffice.bin")
{
   oDesk := oSM.createInstance("com.sun.star.frame.Desktop")

   page := oDesk.CurrentComponent.CurrentController.ViewCursor.getPage
   If WidthOrNot
      page := Format("{:0" . pic_name_width . "u}", page)

   if (oldpage != page) {
      oldpage := page
      oDesk.CurrentComponent.CurrentController.ViewSettings.ZoomType := 2
      Gui, 2:Show, NA
      GuiControl, 2:, GuiPic, %pic_pth%%page%.%pic_ext%
   }
}
else
   sleep 1000
}
return

WM_LBUTTONDOWN()
{
 WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
 PostMessage, WM_NCLBUTTONDOWN, HTCAPTION
}

WM_RBUTTONDOWN()
{
   Menu, Tray, NoStandard
   Menu, Tray, Add, Выход, ExitApp
   Menu, Tray, Show
}