Różnice w wersjach Python i .NET
Aspose.Words dla Python via .NET jest opakowaniem Aspose.Words dla .NET, dlatego oba produkty mają prawie ten sam zestaw funkcji. Niemniej jednak istnieją pewne niuanse pracy i różnice w funkcjach i API, które są opisane na tej stronie.
Różnice w funkcjach
Ze względu na proces pakowania niektóre funkcje nie są dostępne w wersji Python. Oto lista najważniejszych funkcji, które obecnie nie są dostępne w wersji Python.
- Implementacja interfejsów nie jest jeszcze obsługiwana, dlatego nie można używać wywołań zwrotnych takich jak IWarningCallback, IReplacingCallback, IFieldUpdatingCallback, IFieldMergingCallback itp.
- Funkcja drukowania nie jest dostępna, ponieważ wersja Aspose.Words .NET Standard 2.0 jest używana jako zaplecze wersji Pythona, która również nie zapewnia tej funkcjonalności.
- Udostępniana jest tylko prosta funkcjonalność Mail Merge z tablicami nazw pól i wartości pól jako źródła danych.
- Implementacja DocumentVisitor nie jest obecnie możliwa z kodu Python.
Przesyłanie obiektów Aspose.Words do formatu Python
Chociaż rzutowanie typów nie jest czymś naturalnym dla programistów Python, niektórych zadań nie można wykonać bez rzutowania węzłów dokumentów lub pól na konkretny typ. Aspose.Words dla Python via .NET udostępnia specjalne metody umożliwiające rzutowanie obiektów tam, gdzie jest to konieczne.
Węzły rzutowania
Klasą bazową dla wszystkich węzłów dokumentu w formacie Aspose.Words DOM jest klasa Node. Na przykład zwracana metoda get_child i instancja klasy Node, ale jeśli chcesz zmodyfikować zwrócony węzeł, w większości przypadków powinieneś rzutować go na konkretny typ. Poniższy kod demonstruje, jak zmienić kolor czcionki pierwszego Run w dokumencie:
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")
Casting może być również wymagany w przypadku stosowania metody 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")
Jak zapewne zauważyłeś, gdzie w kodzie C# do rzutowania użyjesz (Paragraph)node
, w Python musisz użyć metody node.as_paragraph()
. W wersji Python klasy Aspose.Words Node wprowadza się następujące łącze metod as_xxx
:
- as_document()
- as_section()
- as_body()
- as_header_footer()
- as_table()
- as_row()
- as_cell()
- as_paragraph()
- as_bookmark_start()
- as_bookmark_end()
- as_editable_range_start()
- as_editable_range_end()
- as_group_shape()
- as_shape()
- as_comment()
- as_footnote()
- as_run()
- as_field_start()
- as_field_separator()
- as_field_end()
- as_form_field()
- as_special_char()
- as_smart_tag()
- as_structured_document_tag()
- as_structured_document_tag_range_start()
- as_structured_document_tag_range_end()
- as_glossary_document()
- as_building_block()
- as_comment_range_start()
- as_comment_range_end()
- as_office_math()
- as_sub_document()
- as_composite_node()
Metoda as_xxx
wywołuje RuntimeError
z komunikatem podobnym do poniższego, jeśli w węźle nie można dopasować wielkości liter do określonego typu:
RuntimeError: Proxy error(InvalidCastException): Unable to cast object of type ‘Aspose.Words.XXX’ to type ‘Aspose.Words.Drawing.YYY’.
Pola odlewnicze
Ta sama sytuacja dotyczyła pól. Poniższy przykład kodu demonstruje, jak zastąpić łącza hiperłączy:
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")
Jak zapewne zauważyłeś, obiekt Field udostępnia również zestaw metod as_xxx
, które są wymienione poniżej:
- as_field_unknown()
- as_field_merge_barcode()
- as_field_display_barcode()
- as_field_print()
- as_field_private()
- as_field_advance()
- as_field_form_check_box()
- as_field_form_drop_down()
- as_field_index()
- as_field_rd()
- as_field_ta()
- as_field_toa()
- as_field_ask()
- as_field_auto_text()
- as_field_auto_text_list()
- as_field_bibliography()
- as_field_citation()
- as_field_dde()
- as_field_dde_auto()
- as_field_fill_in()
- as_field_glossary()
- as_field_import()
- as_field_include()
- as_field_shape()
- as_field_database()
- as_field_skip_if()
- as_field_list_num()
- as_field_rev_num()
- as_field_section()
- as_field_section_pages()
- as_field_data()
- as_field_embed()
- as_field_ocx()
- as_field_auto_num()
- as_field_auto_num_lgl()
- as_field_auto_num_out()
- as_field_add_in()
- as_field_barcode()
- as_field_bidi_outline()
- as_field_eq()
- as_field_footnote_ref()
- as_field_info()
- as_field_user_address()
- as_field_user_initials()
- as_field_user_name()
- as_field_include_picture()
- as_field_page()
- as_field_create_date()
- as_field_edit_time()
- as_field_print_date()
- as_field_save_date()
- as_field_go_to_button()
- as_field_author()
- as_field_comments()
- as_field_file_name()
- as_field_file_size()
- as_field_keywords()
- as_field_last_saved_by()
- as_field_num_chars()
- as_field_num_pages()
- as_field_num_words()
- as_field_subject()
- as_field_template()
- as_field_title()
- as_field_formula()
- as_field_symbol()
- as_field_quote()
- as_field_set()
- as_field_address_block()
- as_field_compare()
- as_field_date()
- as_field_doc_property()
- as_field_doc_variable()
- as_field_greeting_line()
- as_field_hyperlink()
- as_field_if()
- as_field_include_text()
- as_field_link()
- as_field_macro_button()
- as_field_merge_field()
- as_field_merge_rec()
- as_field_merge_seq()
- as_field_next()
- as_field_next_if()
- as_field_note_ref()
- as_field_page_ref()
- as_field_ref()
- as_field_seq()
- as_field_style_ref()
- as_field_tc()
- as_field_time()
- as_field_toc()
- as_field_xe()
- as_field_form_text()
Style castingowe
Do pracy ze stylami tabel wymagane jest również rzutowanie:
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")
Sterowanie odlewaniem Ole
Poniższy przykład kodu ilustruje sposób odczytywania właściwości kontrolki 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)
Przesyłanie źródeł czcionek
Klasa FontSourceBase udostępnia zestaw metod as_xxx
, które są wymienione poniżej:
- as_file_font_source()
- as_folder_font_source()
- as_memory_font_source()
- as_stream_font_source()
- as_system_font_source()
Dostęp do właściwości indeksatora
Aspose.Words dla Python zezwala na właściwości indeksatora tylko według typu int, w .NET można jednak użyć innych typów, na przykład ciągów znaków. Aby wypełnić tę lukę poniższe klasy posiadają dodatkowe metody:
- FormFieldCollection * get_by_name(bookmark_name)
- FontInfoCollection * get_by_name(name)
- CustomXmlPartCollection * get_by_id(id)
- CustomXmlPropertyCollection * get_by_name(name)
- BuiltInDocumentProperties * get_by_name(name)
- CustomDocumentProperties * get_by_name(name)
- BookmarksOutlineLevelCollection * get_by_name(name)
- VbaModuleCollection * get_by_name(name)
- BookmarkCollection * get_by_name(bookmark_name)
- BorderCollection * get_by_border_type(border_type)
- HeaderFooterCollection * get_by_header_footer_type(header_footer_type)
- StyleCollection * get_by_name(name) * get_by_style_identifier(sti)
- VariableCollection * get_by_name(name)
Nazewnictwo członków API
Aby być bliżej świata Python, członkowie API Aspose.Words dla Python via .NET używają Pythona w stylu węża, jednak w większości przypadków mają analogi jeden do jednego w Aspose.Words dla .NET API. Te analogi można znaleźć w pliku plik XML.