Извлечение текста с получением стилей CS6

  • Автор темы Автор темы yotun
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
Ответ: Извлечение текста с получением стилей CS6

Не согласен с вами, если оперировать объектами, которые предоставляет скриптинг, то можно получить всю упомянутую мной информацию, у большинства тех самых объектов есть GeometricBounds, который и определяет то самое расположение, до, после, а если вдуматься, то и "поверх", иначе говоря картинка может быть background'ом для некоего текста.
Если все-таки решите ковырять IDML, то координаты объектов можно получить вот так: http://forum.rudtp.ru/showthread.php?t=46353
 
Ответ: Извлечение текста с получением стилей CS6

похоже надо сменить подход)))
второй час бью голову над тем как это применить, позицию начала и кончала tsr)
 
Ответ: Извлечение текста с получением стилей CS6

позицию начала и кончала
:) никак. Здесь нужна информация о точках соприкосновения двух (или более) абзацев в рамках одного TextStyleRange, такой инфы нет.
Как вариант - сначала для каждой Story создать базу TextStyleRanges примерно такой структуры
PHP:
basa = {
	<TextStyleRange.index>: {
		<paragraph.id>: [firstInsertionPoint, lastInsertionPoint],
		<paragraph.id>: [firstInsertionPoint, lastInsertionPoint],
		...
	}
	...
}
Разбивку на абзацы каждой TextStyleRange производить через поиск в ней символов "\r", и запоминать эти данные для каждого абзаца в firstInsertionPoint и lastInsertionPoint
И потом уже при обработке абзацев обращаться к этой базе.
 
Ответ: Извлечение текста с получением стилей CS6

Ура, получилось, с помощью Dik973
Если отобразилось криво - простите, не понял как тут код правильно вставлять:)

Если кому пригодится код (VB .NET), перевод на нужный язык не должен составить труда
mTag = xElement(.NET'овский xElement, не перепутайте)
_XMLCorrect - самопальная функция, заменяющая не XML'ные символы на "?"
Код:
For rangeIndex = 1 To _story.TextStyleRanges.Count
 Dim mRange As InDesign.TextStyleRange = _story.TextStyleRanges(rangeIndex)
 rStart = mRange.Characters(1).InsertionPoints(1).index
        rEnd = mRange.Characters(-1).InsertionPoints(1).index
        For paragraphIndex = 1 To mRange.Paragraphs.Count
                Dim mParagraph As InDesign.Paragraph = mRange.Paragraphs(paragraphIndex)
                If mParagraph.ParentTextFrames.count > 0 Then
                   pStart = mParagraph.Characters(1).InsertionPoints(1).index
                   pEnd = mParagraph.Characters(-1).InsertionPoints(1).index
                   If pStart >= rStart Then
                    If IsNothing(mTag) = False Then
                         ' Я новый параграф, делайте со мной что хотите
                   End If
                   Dim _max = Math.Max(rStart, pStart)
                   Dim _min = Math.Min(rEnd, pEnd)
                   pText = (_XMLCorrect(Mid(mRange.Texts(1).contents, _max - rStart + 1, _min - _max + 1)))
                        'Я кусок стилизованного текста относящийся к "текущему" параграфу, стили типа bold, underline спрашивайте у mRange 
                 End If
       Next
Next
 
Ответ: Извлечение текста с получением стилей CS6

Да, оказалось все очень просто. Я недооценил параметр index, думал что он будет давать значение в рамках параграфа.
Спасибо, я сейчас как раз тоже решаю задачку по выгрузке верстки в html, и этот рецепт будут в самый раз.
 
Ответ: Извлечение текста с получением стилей CS6

Самое забавное во всей этой выгрузке - работа с картинками, они не заякорены, и в html и epub попадают не по месту.
Пришлось люто копать как устроен InDesign чтобы в конечном файле они были по месту:)
 
Ответ: Извлечение текста с получением стилей CS6

Я с позиционированием картинок решил не возиться, проще html подправить.

Вот еще вариант:
PHP:
PARS = app.selection[0].paragraphs;
for( i = 0; i < PARS.length; i++ ){
	PAR = PARS[i];
	for( z = 0; z < PAR.textStyleRanges.length ; z++ ){
		textStyleRange = PAR.textStyleRanges[z];
		firstChar = textStyleRange.characters[0].paragraphs[0] == PAR ? textStyleRange.characters[0] : PAR.characters[0];
		lastChar = textStyleRange.characters.lastItem().paragraphs[0] == PAR ? textStyleRange.characters.lastItem() : PAR.words.lastItem().characters.lastItem();
		// показываем
		PAR.characters.itemByRange( firstChar, lastChar ).select();
		alert( textStyleRange.fontStyle );
		}
	}
 
Ответ: Извлечение текста с получением стилей CS6

Я слабо понимаю php, но, эээ, меня несколько смущает то, что вы всегда используете ПЕРВЫЙ параграф из Range, мне кажется что в некий определенный момент, когда в TextStyleRanges будет более одного параграфа и один из параграфов будет не целиком, а только частично - возникнет удивление полученным результатом:)

Если картинок сотни полторы-две, то правка html'я затянется, ведь для каждой картинки надо будет глазами найти место вставки и перетащить ее туда...
 
Ответ: Извлечение текста с получением стилей CS6

Да это не php, а javascript.
ПЕРВЫЙ параграф из Range
textStyleRange.characters[0].paragraphs[0] - параграф, к которому принадлежит символ, а не Range.
Я уже прогнал этот код на материале - работает четко.
Если картинок сотни полторы-две
Конечно, такие объемы нужно забарывать автоматом.
 
Ответ: Извлечение текста с получением стилей CS6

если соберетесь извлекать картинки, то алгоритм примерно такой
Код:
for each page in doc.pages
for each rectangle in page.rectangles
for each image in rectangle.images
получили image
чтобы понять где он находится, надо взять у rectangle его geometricBounds
next
next
next
алгоритм работает ТОЛЬКО по doc.pages, если попробовать for each rectangle in doc.Rectangles
получите полную хрень, по крайней мере у меня interop так поступает

в коде получения параграфов, ЕСЛИ у параграфа есть ParentTextFrames(0) - спрашиваете его GeometricBounds

кроме этого и для картинки и для TextFrame надо получить:
index spread'а
номер страницы на развороте
собственный Index


все найденные параграфы и картинки скидываются в одну структуру, после чего сортируются по номерам страниц, собственным индексам и left и Top от geometricBounds.
полученные объекты окажутся на своих местах в 95% случаев, исключения возможны в многоколоночных текстах, там надо сортировку другую
и если TextFrame расположен НА rectangle, хотя второе можно изящно обойти как раз для html'я, сделать картинку background'ом для текста
 
Ответ: Извлечение текста с получением стилей CS6

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