1

Тема: AHK: изменение свойств редактируемых полей файла pdf

Доброго времени суток.
Суть задачи. Имеется файл pdf с полями для ввода текста. Необходимо изменить названия этих полей. В документации acrobat sdk api reference не описано способа программно изменять названия полей. На их форуме предлагается решение в виде чтения номера страницы, типа поля и его координат (rect), а затем добавления нового поля с новым именем и такими же координатами с последующим удалением "старого" поля. В принципе эта операция делается без проблем. Однако вновь созданное поле обладает свойствами по-умолчанию, а не такими же как у изначального (что не удивительно). Меня конкретно интересует свойство comb, т.е. комбинация символов. В документации приведён пример реализации того, что мне нужно:

var f = myDoc.addField("Name.Last", "text", 0,[ inch, Bbox[1]-inch, 3*inch, Bbox[1]- inch - 14 ] );
	f.comb = true; // Declare this is a comb field
	f.charLimit = 10; // Max number of characters

Как видно из примера, после свойства comb должно быть charLimit. Свойство comb установить не удаётся никак вообще. Применить charLimit получается, но поле не становится comb, а просто приобретает ограничение на количество символов. Как уже только ни пробовал и как в интернетах ни копался - всё без толку. Буду благодарен, если кто-то сможет помочь или хотя бы что-то посоветовать. Привожу код примера для ahk:

fileName:="test.pdf"
newFieldName:="newF"
oldFieldName:="oldF"
gApp:=ComObjCreate("AcroExch.app")
avDoc:=ComObjCreate("AcroExch.AVDoc")
If avDoc.Open(fileName, "") 
{
	gApp.show()
	pdDoc:=avDoc.GetPDDoc()
	jso:=pdDoc.GetJSObject
	fdPage:=jso.getField(oldFieldName).Page
	fdRect:=jso.getField(oldFieldName).rect
	field:=jso.addField(newFieldName,"text",fdPage,fdRect) ; До этого момента всё работает как задумано
	field.comb:=true	; Error:  0x80070057 - Параметр задан неверно. Specifically: comb
	field.charLimit:=10	; код срабатывает, но результат не тот, который ожидался
}

2

Re: AHK: изменение свойств редактируемых полей файла pdf

Попробуйте так:

field.comb := -1

Или так:

VarSetCapacity(var, 24, 0)
vref := ComObject(0x400B, &var)
vref[] := -1
field.comb := vref
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: изменение свойств редактируемых полей файла pdf

teadrinker
Спасибо за отклик, но, к сожалению, оба варианта приводят к той же самой ошибке.

4

Re: AHK: изменение свойств редактируемых полей файла pdf

Тогда возможно это получится сделать только в контексте реального джаваскрипта. Из AHK джаваскрипт можно запустить с помощью JsRT.

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

5

Re: AHK: изменение свойств редактируемых полей файла pdf

teadrinker
Спасибо, это решение помогло.
Опишу подробнее с какими нюансами столкнулся.
1. При попытке открыть pdf файл у меня появилась ошибка: "Произошла ошибка при открытии данного документа." и дальше какие-то кракозябры. Я подумал, что следует в скрипте указать кодировку, но это неверно. Затем задумался: "у меня ведь acrobat на английском, почему ошибка на русском?" Сменил в настройках reader язык на русский и смог дочитать ошибку: "Синтаксическая ошибка в имени файла, имени папки или метки тома." В общем, в пути к файлу нужно указывать слэши, а не обратные слэши
2. При сохранении файла нужно указывать параметр PDSave с каким-то из возможных флагов.  В документе acrobat sdk iac guide представлены следующие варианты:

PDSaveIncremental = 0x0000, /* write changes only */
PDSaveFull = 0x0001, /* write entire file */
PDSaveCopy = 0x0002, /* write copy w/o affecting current state */
PDSaveLinearized = 0x0004, /* write the file linearized for
** page-served remote (net) access. */
PDSaveBinaryOK = 0x0010, /* OK to store binary in file */
PDSaveCollectGarbage = 0x0020 /* perform garbage collection on
** unreferenced objects */

При попытке передать параметр "0x0001" в pdDoc.Save возникала ошибка. Так же как и со всеми остальными. Решение: параметр нужно передавать в десятичном виде, т.е. в данном случае - 1.
3. Тоже касается значений boolean - вместо true, нужно 1.
В конечном счёте получился следующий код:

#NoEnv
#Include ActiveScript.ahk
js := new ActiveScript("JScript")
code = 
(
    var newFieldName="newF";
    var oldFieldName="oldF";
    var fileName="C:/test.pdf";
    var newFileName="C:/Users/Intel/Desktop/Новая папка/test.pdf"
    var gApp = new ActiveXObject("AcroExch.App");
    var avDoc = new ActiveXObject("AcroExch.AVDoc");  
    avDoc.Open(fileName, "");
    var pdDoc = avDoc.GetPDDoc();
    var jso=pdDoc.GetJSObject();
    var fdPage=jso.getField(oldFieldName).Page;
    var fdRect=jso.getField(oldFieldName).rect;
    var field=jso.addField(newFieldName,"text",fdPage,fdRect);
    field.comb=true;
    field.charLimit=10;
    jso.removeField(oldFieldName);
    pdDoc.Save(1,newFileName);
    avDoc.Close(1)
)
js.Exec(code)

6

Re: AHK: изменение свойств редактируемых полей файла pdf

Из ахк так неправильно:

field.comb:=true

Отправляйте так:

ComObj(0xB, -1)

7

Re: AHK: изменение свойств редактируемых полей файла pdf

Malcev
Ваш код не вызывает ошибки, но и результата не даёт, т.е. поле остаётся с ограничением по количеству символов, но не становится comb.

8

Re: AHK: изменение свойств редактируемых полей файла pdf

Я ничего под adobe не кодил и поэтому их апи не читал.
Но у меня показывает разные input при закоментированном и не закоментированном field.comb:

fileName:=a_scriptdir "\test.pdf"
arr := ComObjArray(VT_VARIANT:=12, 4)
arr[0] := 100
arr[1] := 200
arr[2] := 300
arr[3] := 400
gApp:=ComObjCreate("AcroExch.app")
avDoc:=ComObjCreate("AcroExch.AVDoc")
avDoc.Open(fileName, "")
gApp.show()
pdDoc:=avDoc.GetPDDoc()
jso:=pdDoc.GetJSObject
field:=jso.addField("fieldName","text",0,arr)
; field.comb:=ComObj(0xB, -1)
field.charLimit:=10

9

Re: AHK: изменение свойств редактируемых полей файла pdf

Malcev
Перепроверил, это у меня ошибка была, извиняюсь. Ваш вариант работает, и он попроще Спасибо.