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

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

yotun

Участник
Топикстартер
Сообщения
21
Реакции
46
Всем привет.
Бьюсь уже несколько дней, но просвета нет
Задача следующая: получить содержимое макета из индизайна, включая картинки, очень желательно с оригинальным расположением иллюстраций, даже если они не анкорены.
Спасибо Евгениусу, подсказал обход по Stories, с получением GeometricBounds

Но вот с получением стилей текста реальная проблема.
Каждый "кусок" стилизованного текста хранится в TextStyleRanges(n), но никакой привязки к параграфу нет.

for Paragraphs было бы зачетно, но там нет инфы о стилях примененных непосредственно к некоторым частям текста, если же обратиться к его TextStyleRanges то там ВСЕ параграфы и найти текущий параграф как-то не получилось


На выходе нужен некий xml, в котором будет информация о принадлежности того или иного текста к некоему параграфу, с сохранением стилей для каждого изменения.
Перебор по Characters для каждого параграфа не пройдет, слишком долго и бессмысленно
Подскажите алгоритм для любого языка, будь то js или vb.
 

imma

15 лет на форуме
Сообщения
3 089
Реакции
2 185
Ответ: Извлечение текста с получением стилей CS6

Задача следующая: получить содержимое макета из индизайна, включая картинки
А в чем заключается сверхзадача, если не секрет?
 

yotun

Участник
Топикстартер
Сообщения
21
Реакции
46
Ответ: Извлечение текста с получением стилей CS6

А в чем заключается сверхзадача, если не секрет?
Ничего экстраординарного, мне нужно полноценное xml-представление книги-журнала, количество которых может исчисляться сотнями.
на ручное "исправление" каждого макета нет ни сил, ни времени.
или я неправильно понял вопрос?
 

imma

15 лет на форуме
Сообщения
3 089
Реакции
2 185
Ответ: Извлечение текста с получением стилей CS6

или я неправильно понял вопрос?
Думаю, что правильно, но ответ не прозвучал. Вы пытаетесь реализовать намеченный вами способ решения какой-то задачи. Пока стало понятно, что речь идет о попытке автоматизации какого-то "ручного исправления". Возможно, внятно сформулировав основную задачу, найдуться более простые решения, а может быть уже есть и готовые. Но это как хотите, разумеется.
 

yotun

Участник
Топикстартер
Сообщения
21
Реакции
46
Ответ: Извлечение текста с получением стилей CS6

Думаю, что правильно, но ответ не прозвучал. Вы пытаетесь реализовать намеченный вами способ решения какой-то задачи. Пока стало понятно, что речь идет о попытке автоматизации какого-то "ручного исправления". Возможно, внятно сформулировав основную задачу, найдуться более простые решения, а может быть уже есть и готовые. Но это как хотите, разумеется.

Эээээ, основная задача - ИЗВЛЕЧЕНИЕ текста и иллюстраций из макета книги. НЕ экспорт, НЕ сохранение текста в некий из поддерживаемых индизайном форматов.
Мне нужна возможность работы с текстом, графикой и стилями через Interop.Adobe.dll
Я подключаю указанную библиотеку к проекту на .NET и работаю с COM-объектами, представленными этой библиотекой.

Как бы еще сформулировать ОБЩУЮ задачу?)

В частности звучит так: как из параграфа получить куски текста с РАЗНЫМИ стилями, не перебирая посимвольно?
для примера один из частных случаев: "Да здравствует индусский код!
Индусский код - самый клевый код в мире.
Индусы, пишите больше!"
Итого у нас ТРИ параграфа, и как минимум 5 стилей
В первом параграфе у нас сейчас как минимум пять TextStyleRanges.
Параграф об этом не знает ровным счетом ничего, если я правильно понимаю модель адоба.
Информация о разностилевых блоках находится в textStyleRanges.Texts параграфа, но в нем самом нет инфы о том что тот или иной кусок относится к текущему параграфу.

Если и сейчас не объяснил - простите, по другому не могу)
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Извлечение текста с получением стилей CS6

но в нем самом нет инфы о том что тот или иной кусок относится к текущему параграфу.
Есть:
Код:
textStyleRange.paragraphs
Чтобы понять, как это работает, выделяем символ и получаем сначала textStyleRange, к которому он относится:
Код:
var doc = app.activeDocument;
var sel = doc.selection[0];
var tsr = sel.textStyleRanges[0];
tsr.select();
... а потом и абзац, в котором находится этот textStyleRange:
Код:
tsr.paragraphs[0].select();
 

imma

15 лет на форуме
Сообщения
3 089
Реакции
2 185
Ответ: Извлечение текста с получением стилей CS6

Как бы еще сформулировать ОБЩУЮ задачу?
Ну, если задача состоит в том, чтобы просто "извлечь текст и иллюстрации из макета" и получить "возможность работы с текстом, графикой и стилями через Interop.Adobe.dll", то, наверное, вы справились. Если же "извлечение текста и иллюстраций из макета" и наличие "возможности работы с текстом, графикой и стилями через Interop.Adobe.dll" подразумевает получение какого-то нового продукта/издания/или зачем-то еще, то нет.)) Я пытаюсь понять, что вы хотите получить в итоге после того как извлечете текст и иллюстрации и покромсаете все это на куски и стили особым способом.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Ответ: Извлечение текста с получением стилей CS6

можно и xml тэги назначить по стилям перед экспортом
 

yotun

Участник
Топикстартер
Сообщения
21
Реакции
46
Ответ: Извлечение текста с получением стилей CS6

XML, просто XML, из которого я могу сделать буквально что угодно, главное чтобы в нем была инфа выведенная из дурацкого представления адобовских кодеров
 

pirate-party

Участник
Сообщения
42
Реакции
150
Ответ: Извлечение текста с получением стилей CS6

Если экспортировать документ в IDML и раскрыть его, то в файлике Story_ХХХ.xml можно сразу найти такую разбивку:


Код:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<idPkg:Story xmlns:idPkg="http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging" DOMVersion="6.0">
    <Story Self="u112" AppliedTOCStyle="n" TrackChanges="false" StoryTitle="$ID/" AppliedNamedGrid="n">
        <StoryPreference OpticalMarginAlignment="false" OpticalMarginSize="12" FrameType="TextFrameType" StoryOrientation="Horizontal" StoryDirection="LeftToRightDirection"/>
        <InCopyExportOption IncludeGraphicProxies="true" IncludeAllResources="false"/>
        <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/Normal">
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" FillColor="Color/Word_R220_G38_B27" PointSize="13">
                <Content>[B]Да[/B]</Content>
            </CharacterStyleRange>
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" FillColor="Color/Word_R38_G38_B38" PointSize="13">
                <Content>[B] здра[/B]</Content>
            </CharacterStyleRange>
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" FillColor="Color/Word_R38_G38_B38" PointSize="13" Underline="true">
                <Properties>
                    <UnderlineColor type="object">Color/Word_R38_G38_B38</UnderlineColor>
                </Properties>
                <Content>[B]вс[/B]</Content>
            </CharacterStyleRange>
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" FillColor="Color/Word_R0_G36_B187" PointSize="13">
                <Content>[B]тв[/B]</Content>
            </CharacterStyleRange>
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" FillColor="Color/Word_R38_G38_B38" PointSize="13" Underline="true">
                <Properties>
                    <UnderlineColor type="object">Color/Word_R38_G38_B38</UnderlineColor>
                </Properties>
                <Content>[B]уе[/B]</Content>
            </CharacterStyleRange>
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" FillColor="Color/Word_R38_G38_B38" PointSize="13">
                <Content>[B]т ин[/B]</Content>
            </CharacterStyleRange>
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" FillColor="Color/Word_R38_G38_B38" FontStyle="Bold" PointSize="13">
                <Content>[B]дусск[/B]</Content>
            </CharacterStyleRange>
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" FillColor="Color/Word_R38_G38_B38" PointSize="13">
                <Content>[B]ий код![/B]</Content>
                <Br/>
            </CharacterStyleRange>
        </ParagraphStyleRange>
        <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/Paragraph Style 1">
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]">
                <Content>[B]Индусский код - самый клевый код в мире.[/B]</Content>
                <Br/>
            </CharacterStyleRange>
        </ParagraphStyleRange>
        <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/Normal">
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" FillColor="Color/Word_R38_G38_B38" PointSize="13">
                <Content>[B]Индусы, [/B]</Content>
            </CharacterStyleRange>
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" FillColor="Color/Word_R115_G243_B44" PointSize="13">
                <Content>[B]пишите [/B]</Content>
            </CharacterStyleRange>
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]" FillColor="Color/Word_R38_G38_B38" PointSize="13">
                <Content>[B]больше![/B]</Content>
            </CharacterStyleRange>
        </ParagraphStyleRange>
    </Story>
</idPkg:Story>

Возможно, будет проще преобразовать этот XML в вашу структуру, чем формировать заново.
 

yotun

Участник
Топикстартер
Сообщения
21
Реакции
46
Ответ: Извлечение текста с получением стилей CS6

Спасибо.
Я пробовал отсмотреть IDML, но при таком экспорте не смог найти файла связи между графикой и текстом, где-то она есть, но пока найти не могу
 

pirate-party

Участник
Сообщения
42
Реакции
150
Ответ: Извлечение текста с получением стилей CS6

Чем не подходит тег <Image>? Для картинок свободно расположенных на странице его можно найти в файле Spread_XXX.xml, а для помещенных в тексте - он в файле Story_ХХХ.xml
 

yotun

Участник
Топикстартер
Сообщения
21
Реакции
46
Ответ: Извлечение текста с получением стилей CS6

нет привязки к тексту, ДО он текстового фрейма, ПОСЛЕ, посредине между двумя?
 

pirate-party

Участник
Сообщения
42
Реакции
150
Ответ: Извлечение текста с получением стилей CS6

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

yotun

Участник
Топикстартер
Сообщения
21
Реакции
46
Ответ: Извлечение текста с получением стилей CS6

Не согласен с вами, если оперировать объектами, которые предоставляет скриптинг, то можно получить всю упомянутую мной информацию, у большинства тех самых объектов есть GeometricBounds, который и определяет то самое расположение, до, после, а если вдуматься, то и "поверх", иначе говоря картинка может быть background'ом для некоего текста.
 

pirate-party

Участник
Сообщения
42
Реакции
150
Ответ: Извлечение текста с получением стилей CS6

Я хотел сказать, что информация о взаимосвязях принципиально отсутствует в верстке. Книжная верстка делается людьми и только для людей. Безусловно, ориентируясь на значения GeometricBounds можно строить предположения относительно связей элементов верстки между собой. Для простых версток, возможно, это даст неплохой результат. Но только попробуйте программно найти взаимосвязи на такой странице:

Посмотреть вложение 55168
 

yotun

Участник
Топикстартер
Сообщения
21
Реакции
46
Ответ: Извлечение текста с получением стилей CS6

К сожалению ссылка не открывается, не могу ничего ответить.
Не сказал бы что ваше утверждение истинно, на мой взгляд верстка вообще не для людей, верстка для печати, а я как раз хочу получить представление "для людей".
 

dik973

15 лет на форуме
Сообщения
578
Реакции
77
Ответ: Извлечение текста с получением стилей CS6

Можно определить положение 1 и последнего символа textStyleRange
PHP:
app.activeDocument.stories[0].paragraphs[0].textStyleRanges[i].characters[0].insertionPoints[0].index
app.activeDocument.stories[0].paragraphs[0].textStyleRanges[i].characters[-1].insertionPoints[0].index

Может это поможет?
 

yotun

Участник
Топикстартер
Сообщения
21
Реакции
46
Ответ: Извлечение текста с получением стилей CS6

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