Борьба с таблицами

Статус
Закрыто для дальнейших ответов.

Eugen

Участник
Топикстартер
Сообщения
31
Реакции
0
Цель: содержимому всех таблиц присвоить стиль "table".
.applyStyle(myDoc.paragraphStyles.item('table')) привязываеться к параграфу, т.е. нужно добираться к каждой ячейке?
Помогайте, плиз, кто чем может!
 

Kuzmin

15 лет на форуме
Сообщения
236
Реакции
92
Ответ: Борьба с таблицами

Dim myInD As InDesign.Application

Private Sub Main()
Set myInD = CreateObject("InDesign.Application.CS")
If myInD.Documents.Count > 0 Then
Call PerformActiveDoc
End If
End Sub

Private Sub PerformActiveDoc() 'обработка активного документа
Set myItems = myInD.ActiveDocument.AllPageItems
itemCount = myItems.Count
If itemCount > 0 Then
For i = 1 To itemCount
If TypeName(myItems.Item(i)) = "TextFrame" Then
Set curFrame = myItems.Item(i)
Call PerformFrame(curFrame) ' для всех текстовых фреймов
End If
Next
End If
End Sub

Private Sub PerformFrame(curFrame) 'обработка текстового фрейма
If curFrame.ParentStory.Paragraphs.Count > 0 Then
If ExistTable(curFrame.ParentStory) Then 'если во фрейме есть хоть одна таблица
For i = 1 To curFrame.ParentStory.Paragraphs.Count
Set curPara = curFrame.ParentStory.Paragraphs.Item(i)
Call PerformPara(curPara) 'для всех параграфов во фрейме
Next
End If
End If
End Sub

Private Sub PerformPara(curPara) 'обработка параграфа
If curPara.Characters.Count > 0 Then
If ExistTable(curPara) Then 'если в параграфе есть хоть одна таблица
If curPara.Characters.Count > 0 Then
If ExistTable(curPara) Then
Set curCharacters = curPara.Characters
For i = 1 To curCharacters.Count
Set curChar = curCharacters.Item(i)
Call PerformChar(curChar) 'для всех символов в параграфе
Next
End If
End If
End If
End If
End Sub

Private Sub PerformChar(curChar) 'обработка символа
If ExistTable(curChar) Then 'если это таблица
If curChar.Tables.Count > 0 Then
Set curTable = curChar.Tables.Item(1)
Call PerformTable(curTable) 'обрабатываем талицу
End If
End If
End Sub

Private Sub PerformTable(curTable) 'обработка таблицы
If curTable.Cells.Count > 0 Then
For i = 1 To curTable.Cells.Count
Set curCell = curTable.Cells.Item(i)
Call PerformCell(curCell) 'для каждой ячейки таблицы
Next
End If
End Sub

Private Sub PerformCell(curCell) 'обработка ячейки
If curCell.Paragraphs.Count > 0 Then
For i = 1 To curCell.Paragraphs.Count 'для каждого параграфа в ячейке
Set curPara = curCell.Paragraphs.Item(i)
Call ApplyStyleToCell(curPara) 'назначаем стиль
Call PerformPara(curPara) 'обрабатываем параграф на случай обнаружения вложенных таблиц
Next
End If
End Sub

Private Function ExistTable(textObj) As Boolean 'проверка наличия таблиц в текстовом объекте
ExistTable = False
If textObj.Tables.Count > 0 Then 'таблицы есть
ExistTable = True
End If
End Function

Private Function ApplyStyleToCell(curPara) 'назначение стиля параграфу
n = 2 'номер стиля, для примера 2-й
curPara.ApplyStyle (myInD.ActiveDocument.ParagraphStyles.Item(n))
End Function
 

Eugen

Участник
Топикстартер
Сообщения
31
Реакции
0
Ответ: Борьба с таблицами

Большое спасибо! Спасены десятки часов времени!
 

Shlyapa

Участник
Сообщения
4 838
Реакции
1
Ответ: Борьба с таблицами

Если материал (Story) состоит из нескольких связанных фреймов, то скрипт обрабатывает этот материал столько раз, из скольких фреймов он состоит. Соответсвенно, и каждую таблицу обрабатывает многократно. А это производительности не добавляет.

Чтобы обработка была однократной, нужно исправить две подпрограммки:

Private Sub PerformActiveDoc() ' обработка активного документа
Set myItems = myInD.ActiveDocument.Stories
itemCount = myItems.Count
If itemCount > 0 Then
For i = 1 To itemCount
Set curStory = myItems.Item(i)
Call PerformStory(curStory) ' для всех Story
Next
End If
End Sub

Private Sub PerformStory(curStory) ' обработка Story
If curStory.Paragraphs.Count > 0 Then
If ExistTable(curStory) Then ' если в Story есть хоть одна таблица
For i = 1 To curStory.Paragraphs.Count
Set curPara = curStory.Paragraphs.Item(i)
Call PerformPara(curPara) ' для всех параграфов в Story
Next
End If
End If
End Sub
 

Kuzmin

15 лет на форуме
Сообщения
236
Реакции
92
Ответ: Борьба с таблицами

Точно. Спасибо.
 

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
Ответ: Борьба с таблицами

Замени строчку:
Код:
Set myInD = CreateObject("InDesign.Application.CS")
на
Код:
Set myID = New InDesign.Application
и скрипт будет работать и в CS, в CS2.
 

Kuzmin

15 лет на форуме
Сообщения
236
Реакции
92
Ответ: Борьба с таблицами

Хорошо. Спасибо.
 

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
Ответ: Борьба с таблицами

а) Не подключен в References Adobe InDesign CS Type Lybrary.
б) Запуск приложения извне.

У меня работает – sZam 4•1 именно так и сделан.
 

Kuzmin

15 лет на форуме
Сообщения
236
Реакции
92
Ответ: Борьба с таблицами

Я пытался это сделать в VBS.
С exe-файлом получается, но библиотеки то у CS и CS2 разные, подключить обе не получается, т.е. все равно приходится компилировать две версии?
 

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
Ответ: Борьба с таблицами

Да, библиотеки-то не подключаются у уже откомпилированного файла, там только ссылка на зарегистрированный ActiveX. Так что цепляй, например, Adobe InDesign CS2 Type Library и играйся. Правда, в CS могут отдельные вещи не совпадать, ну, делай "обвязки", обходы и прочие проверки-перепроверки :) Компилировать две версии не нужно. Достаточно одной.
А VBS – да, не понимает. Прошше набросать на JS :)
 

Kuzmin

15 лет на форуме
Сообщения
236
Реакции
92
Ответ: Борьба с таблицами

Угу, понял. Спасибо.
 
Статус
Закрыто для дальнейших ответов.