Python 및 .NET 버전 차이점
Aspose.Words for Python via .NET는 Aspose.Words for .NET의 래퍼이므로 두 제품의 기능 세트가 거의 동일합니다. 그럼에도 불구하고 이 페이지에 설명된 기능과 API에는 작업의 미묘한 차이와 차이점이 있습니다.
기능 차이점
래핑 프로세스로 인해 Python 버전에서는 사용할 수 없는 일부 기능이 있습니다. 다음은 현재 Python 버전에서 사용할 수 없는 가장 주목할만한 기능 목록입니다.
- 인터페이스 구현은 아직 지원되지 않으므로 IWarningCallback, IReplacingCallback, IFieldUpdatingCallback, IFieldMergingCallback 등과 같은 콜백을 사용할 수 없습니다.
- Aspose.Words의 .NET Standard 2.0 버전이 Python 버전의 백엔드로 사용되므로 인쇄 기능을 사용할 수 없습니다. 이 버전 역시 이 기능을 제공하지 않습니다.
- 필드 이름과 필드 값의 배열을 데이터 소스로 하는 간단한 Mail Merge 기능만 제공됩니다.
- 현재 Python 코드에서는 DocumentVisitor 구현이 불가능합니다.
Python에서 Aspose.Words 객체 캐스팅
Python 개발자에게는 유형 캐스팅이 자연스럽지 않지만 문서 노드나 필드를 구체적인 유형으로 캐스팅하지 않으면 일부 작업을 수행할 수 없습니다. Python via .NET용 Aspose.Words는 필요한 경우 객체 캐스팅을 허용하는 특별한 방법을 제공합니다.
캐스팅 노드
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()
메서드를 사용해야 합니다. Aspose.Words Node 클래스의 Python 버전에서는 다음과 같은 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()
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
메서드 세트도 제공합니다
- 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()
캐스팅 스타일
테이블 스타일을 사용하려면 캐스팅도 필요합니다
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")
캐스팅 올레 컨트롤
다음 코드 예제에서는 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
메서드 세트를 제공합니다
- as_file_font_source()
- as_folder_font_source()
- as_memory_font_source()
- as_stream_font_source()
- as_system_font_source()
인덱서 속성에 액세스
Python용 Aspose.Words는 int 유형별로만 인덱서 속성을 허용하지만 .NET에서는 문자열과 같은 다른 유형을 사용할 수도 있습니다. 이 격차를 메우기 위해 다음 클래스에는 추가 메서드가 있습니다
- 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)
API 회원 이름 지정
Python 세계에 더 가까워지기 위해 Python via .NET용 Aspose.Words의 API 멤버는 Pythonic Snake 스타일을 사용하지만 대부분의 경우 .NET API용 Aspose.Words에는 일대일 아날로그가 있습니다. XML 파일에서 이러한 아날로그를 찾을 수 있습니다.