Различия в версиях Python и .NET

Aspose.Words для Python via .NET является оболочкой Aspose.Words для .NET, поэтому оба продукта обладают практически одинаковым набором функций. Тем не менее, есть некоторые нюансы работы и различия в функциях и API, которые описаны на этой странице.

Различия в характеристиках

Из-за процесса обновления некоторые функции недоступны в версии Python. Вот список наиболее заметных функций, которые в настоящее время недоступны в версии Python.

  • Реализация интерфейсов пока не поддерживается, поэтому невозможно использовать обратные вызовы, такие как IWarningCallback, IReplacingCallback, IFieldUpdatingCallback, IFieldMergingCallback и т.д.
  • Функция печати недоступна, поскольку версия .NET Standard 2.0 из Aspose.Words используется в качестве серверной части версии python, которая также не предоставляет эту функциональность.
  • С массивами имен полей и значений полей в качестве источника данных обеспечивается только простая функциональность Mail Merge.
  • DocumentVisitor реализация в настоящее время невозможна из кода Python.

Преобразование Aspose.Words объектов в Python

Хотя приведение типов не является естественным для разработчиков Python, некоторые задачи невозможно выполнить без приведения узлов или полей документов к конкретному типу. Aspose.Words для Python via .NET предусмотрены специальные методы, которые позволяют приводить объекты, где это необходимо.

Узлы литья

Базовым классом для всех узлов документа в Aspose.Words DOM является класс Node. Например, метод get_child возвращает экземпляр класса Node, но если вам нужно изменить возвращаемый узел, в большинстве случаев вам следует привести его к конкретному типу. Следующий код демонстрирует, как изменить цвет первого шрифта Run в документе:

doc = aw.Document(docs_base.my_dir + "Document.docx")

# Get the first Run node and cast it to Run object.
run = doc.get_child(aw.NodeType.RUN, 0, True).as_run()

# Make changes to the run 
run.font.color = drawing.Color.red

# Save the result
doc.save(docs_base.artifacts_dir + "WorkingWithNode.change_run_color.docx")

Приведение также может потребоваться при использовании метода clone:

doc = aw.Document(docs_base.my_dir + "Document.docx")

clone = doc.clone().as_document()
clone.save(docs_base.artifacts_dir + "CloneAndCombineDocuments.cloning_document.docx")

Как вы могли заметить, там, где в коде C# вы использовали бы (Paragraph)node для приведения в действие, в коде Python вы должны использовать метод node.as_paragraph(). В версии Python класса Aspose.Words Node представлена следующая ссылка на as_xxx метода:

Метод as_xxx вызывает RuntimeError с сообщением, подобным следующему, если узел не может быть привязан к указанному типу:

RuntimeError: Proxy error(InvalidCastException): Unable to cast object of type ‘Aspose.Words.XXX’ to type ‘Aspose.Words.Drawing.YYY’.

Литейные поля

Аналогичная ситуация сложилась и с полями. В следующем примере кода показано, как заменить гиперссылки:

doc = aw.Document(docs_base.my_dir + "Hyperlinks.docx")

for field in doc.range.fields :
            
    if field.type == aw.fields.FieldType.FIELD_HYPERLINK:
                
        hyperlink = field.as_field_hyperlink()
    
        # Some hyperlinks can be local (links to bookmarks inside the document), ignore these.
        if hyperlink.sub_address != None :
            continue
    
        hyperlink.address = "https:#www.aspose.com"
        hyperlink.result = "Aspose - The .net & Java Component Publisher"

doc.save(docs_base.artifacts_dir + "WorkingWithFields.replace_hyperlinks.docx")

Как вы могли заметить, объект Field также предоставляет набор методов as_xxx, которые перечислены ниже:

Стили кастинга

Приведение также требуется для работы со стилями таблиц:

doc = aw.Document()
builder = aw.DocumentBuilder(doc)

table = builder.start_table()
builder.insert_cell()
builder.write("Name")
builder.insert_cell()
builder.write("Value")
builder.end_row()
builder.insert_cell()
builder.insert_cell()
builder.end_table()

# Add a table style and modify it's properties.
tableStyle = doc.styles.add(aw.StyleType.TABLE, "MyTableStyle1").as_table_style()
tableStyle.borders.line_style = aw.LineStyle.DOUBLE
tableStyle.borders.line_width = 1
tableStyle.left_padding = 18
tableStyle.right_padding = 18
tableStyle.top_padding = 12
tableStyle.bottom_padding = 12

table.style = tableStyle

doc.save(docs_base.artifacts_dir + "WorkingWithTableStylesAndFormatting.create_table_style.docx")

Приведение в действие элементов управления Ole

Следующий пример кода демонстрирует, как считывать свойства элемента управления ActiveX:

doc = aw.Document(docs_base.my_dir + "ActiveX controls.docx")

properties = ""
for shape in doc.get_child_nodes(aw.NodeType.SHAPE, True) :
            
    shape = shape.as_shape()
            
    if shape.ole_format == None :
        break
    
    oleControl = shape.ole_format.ole_control
    if oleControl.is_forms2_ole_control :
                
        checkBox =  oleControl.as_forms2_ole_control()
        properties = properties + "\nCaption: " + checkBox.caption
        properties = properties + "\nValue: " + checkBox.value
        properties = properties + "\nEnabled: " + str(checkBox.enabled)
        properties = properties + "\nType: " + str(checkBox.type)
    
        if checkBox.child_nodes != None :
            properties = properties + "\nChildNodes: " + checkBox.child_nodes
    
        properties += "\n"

properties = properties + "\nTotal ActiveX Controls found: " + str(doc.get_child_nodes(aw.NodeType.SHAPE, True).count)
print("\n" + properties)

Приведение в действие источников шрифтов

класс FontSourceBase предоставляет набор из as_xxx методов, которые перечислены ниже:

Доступ к свойствам индексатора

Aspose.Words для Python допускает свойства индексатора только по типу int, однако в .NET можно использовать другие типы, например strings. Чтобы заполнить этот пробел, в следующих классах есть дополнительные методы:

API Присвоение имен членам

Чтобы быть ближе к миру Python, в API элементах Aspose.Words для Python via .NET используется стиль питонической змеи, однако в большинстве случаев они имеют однозначный аналог в Aspose.Words для .NET API. Вы можете найти эти аналоги в xml-файле.