使用Python和win32com检查Microsoft Word中的超链接

时间:2017-03-09 19:41:14

标签: python python-3.x win32com

我正在开发一个程序,它将打开Word文档并检查该文档中的所有链接。它应该报告是否有任何链接被破坏。

我可以使用win32com库来完成所有这些工作。

但是,目前我正在使用HyperLink.follow()来检查每个链接。问题是它实际打开每个文档,我的屏幕很快就会被打开的文档填满(我的测试文件有大约15个指向不同文档的链接,在生产中我希望它可以达到数百个)。

如何阻止这种情况发生?我有一些想法,但不知道如何去做任何一个:

  • 优选地,文档根本不会被打开:我只需要知道链接是否有效,也许可以在不实际跟踪链接的情况下完成。我不知道有办法做到这一点。
  • 也许文档可以通过编程方式关闭。我还没有找到一种方法来引用新打开的文件。
  • 最后,也许文件可以无形加载。这不太理想,但我注意到client.Dispatch()支持无形打开应用程序,所以也许可以完成。

当前节目:

#settings
debug = True

# Open a specified word document
wordapp = win32com.client.Dispatch('Word.Application')
wordapp.Visible = debug

directory = os.path.dirname(__file__)
filename = '0 - Cover.docx'
document_location = os.path.join(directory, filename)

if debug == True:
    print(document_location)

document = wordapp.Documents.Open(document_location)

if debug == True:
    print("Document opened succesfully.")

# Gimme the links
wordapp.ActiveDocument

for link in (wordapp.ActiveDocument.HyperLinks):
    print(link.Name)

    try:
        link.Follow()
    except:
        print("This link is broken.")
    else:
        print("This link did not raise an error.")

1 个答案:

答案 0 :(得分:1)

超链接有两个属性 - 地址,(对于本地文件)包含文件系统上的某些位置;和 SubAddress (对于本地文件)是指引用项目中的位置 - Word书签的名称,或Excel命名的单元格范围等。

检查Address是否映射到文件系统上的文件可能就足够了,而根本不打开文档。 OTOH这不会告诉你链接是否完全正常,因为 SubAddress 可能引用一个不存在的名称。

如果要检查超链接的完整功能,并且所有这些超链接都需要引用Word文档,则可能会在当前应用程序的上下文中打开它们。如果是这种情况,那么您可以使用名称以编程方式访问新打开的文档,并将其关闭:

import os

opened_doc = wordapp.Documents(os.path.basename(link.Address))
opened_doc.Close()

注意事项:

  • 以上内容仅适用于加载到当前应用程序的文档。这不包括其他文件类型(Excel电子表格,Powerpoint演示文稿)或在其他应用程序实例中打开的Word文档。
  • client.Dispatch支持无形加载文件并不十分准确;它是Word对象模型,默认情况下加载不可见。在任何情况下,这与Hyperlink.Follow无关,npm install -g concurrently npm install -g lite-server npm install -g typescript npm uninstall lite-server (如果我理解正确的话)依赖于系统API来打开相应应用程序的相关文档。