Отступы маркеров в режиме совместимости PowerPoint 2007 через проблему взаимодействия .NET - PullRequest
3 голосов
/ 01 февраля 2010

У меня действительно сложная ошибка, и я не вижу исправления. Сюжет сводит меня с ума по-настоящему долго. Давайте рассмотрим следующий сценарий:

1) Есть презентация PowerPoint 2003. Он содержит единственный слайд и единственную фигуру, но фигура содержит текстовый фрейм, включающий маркированный список со случайной структурой текстового представления.

2) Требуется получить отступы для каждого маркированного абзаца с помощью PowerPoint 2007. Я могу удовлетворить требование, открыв презентацию в режиме совместимости и применив следующий скрипт VBA:

With ActivePresentation
  Dim sl As Slide: Set sl = .Slides(1)
  Dim sh As Shape: Set sh = sl.Shapes(1)
  Dim i As Integer
  For i = 1 To sh.TextFrame.TextRange.Paragraphs.Count
    Dim para As TextRange: Set para = sh.TextFrame.TextRange.Paragraphs(i, 1)
    Debug.Print para.Text; para.indentLevel, sh.TextFrame.Ruler.Levels(para.indentLevel).FirstMargin
  Next i
End With

, который производит следующий вывод:

A 1 0 
B 1 0 
C 2 24 
D 3 60 
E 5 132 

Очевидно, что на самом деле все идеально: он показал правильный текст элемента списка, уровень элемента списка и отступ от маркера. Но я не могу понять, как я могу достичь того же результата, используя C #. Давайте добавим COM-ссылку на Microsoft.Office.Interop.PowerPoint 2.9.0.0 (взято из MSPPT.OLB, MS Office 12):

// presentation = ...("presentation.ppt")... // a PowerPoint 2003 presentation
Slide slide = presentation.Slides[1];
Shape shape = slide.Shapes[1];
for (int i = 1; i<=shape.TextFrame.TextRange.Paragraphs(-1, -1).Count; i++) {
    TextRange paragraph = shape.TextFrame.TextRange.Paragraphs(i, 1);
    Console.WriteLine("{0} {1} {2}", paragraph.Text, paragraph.IndentLevel, shape.TextFrame.Ruler.Levels[paragraph.IndentLevel].FirstMargin);
}

О, чувак ... Что это? У меня здесь проблемы. Сначала значение paragraph.Text обрезается до тех пор, пока не будет найден символ '\r' (однако paragraph.Text[0] действительно возвращает первый символ O_o). Но это нормально, я могу закрыть глаза на это. Но ... Но, во-вторых, я не могу понять, почему первые поля всегда равны нулю, и не имеет значения, к какому уровню они принадлежат. Они всегда равны нулю в режиме совместимости ... В это трудно поверить ... :) Так есть ли способ исправить это или просто найти обходной путь? Я хотел бы принять любую помощь относительно решения вопроса. Я даже не могу найти ни одной статьи, связанной с этой проблемой. :( Возможно, вы когда-либо сталкивались с этим лицом к лицу ... Или это просто ошибка без исправления, и о ней нужно сообщить в Microsoft?

Спасибо.

...