超链接在 Word 文档中起到了提供交互性和导航功能的作用,使读者能够方便地浏览相关内容,并且促进了文档的易读性和互动性。本文将介绍如何使用 Spire.Doc for Python 在 Python 中添加和删除 Word 文档中的超链接。
安装 Spire.Doc for Python
本教程需要使用 Spire.Doc for Python 和 plum-dispatch v1.7.4。您可以通过以下 pip 命令将它们轻松安装到 Windows 中。
pip install Spire.Doc
如果您不确定如何安装,请参考此教程:如何在 Windows 中安装 Spire.Doc for Python
Python 添加超链接到 Word 文档
Spire.Doc for Python 提供了Paragraph.AppendHyperlink() 方法,可以将网页链接、电子邮件链接、文件链接或书签链接添加到段落内的文本或图像中。下面是详细的步骤:
- 创建 Document 类的对象。
- 使用 Document.AddSection() 方法添加一个章节和使用 Section.AddParagraph() 方法添加一个段落。
- 使用 Paragraph.AppendHyerplink(link: str, text: str, type: HyperlinkType) 方法给文本添加超链接。
- 使用 Paragraph.AppendPicture() 方法向段落中添加图像。
- 使用 Paragraph.AppendHyerplink(link: str, picture: DocPicture, type: HyperlinkType) 方法给图像添加超链接。
- 使用 Document.SaveToFile() 方法保存结果文档。
- Python
from spire.doc import *
from spire.doc.common import *
# 创建一个文档对象
doc = Document()
# 添加一个章节
section = doc.AddSection()
# 创建字符格式对象
characterFormat = CharacterFormat(doc)
# 设置字体为宋体
characterFormat.FontName = "宋体"
# 设置字号为12
characterFormat.FontSize = 12
# 添加段落
paragraph = section.AddParagraph()
# 在段落中添加网页链接
field = paragraph.AppendHyperlink("https://www.e-iceblue.cn/", "网站主页", HyperlinkType.WebLink)
# 应用字符格式到超链接
field.ApplyCharacterFormat(characterFormat)
# 在段落中添加换行符
paragraph.AppendBreak(BreakType.LineBreak)
paragraph.AppendBreak(BreakType.LineBreak)
# 在段落中添加邮件链接
field = paragraph.AppendHyperlink("mailto:support @e-iceblue.com", "发邮件给我们", HyperlinkType.EMailLink)
# 应用字符格式到超链接
field.ApplyCharacterFormat(characterFormat)
paragraph.AppendBreak(BreakType.LineBreak)
paragraph.AppendBreak(BreakType.LineBreak)
# 定义文件路径
filePath = "report.xlsx"
# 在段落中添加文件链接
field = paragraph.AppendHyperlink(filePath, "单击来打开一个Excel报告", HyperlinkType.FileLink)
# 应用字符格式到超链接
field.ApplyCharacterFormat(characterFormat)
# 在段落中添加换行符
paragraph.AppendBreak(BreakType.LineBreak)
paragraph.AppendBreak(BreakType.LineBreak)
# 添加第二个章节
section2 = doc.AddSection()
# 添加段落并插入书签
bookmarkParagrapg = section2.AddParagraph()
bookmarkParagrapg.AppendText("一个书签")
start = bookmarkParagrapg.AppendBookmarkStart("myBookmark")
bookmarkParagrapg.Items.Insert(0, start)
bookmarkParagrapg.AppendBookmarkEnd("myBookmark")
# 在段落中添加链接,跳转到文档内的书签位置
field = paragraph.AppendHyperlink("myBookmark", "跳转到该文档中的一个书签位置", HyperlinkType.Bookmark)
# 应用字符格式到超链接
field.ApplyCharacterFormat(characterFormat)
# 在段落中添加换行符
paragraph.AppendBreak(BreakType.LineBreak)
paragraph.AppendBreak(BreakType.LineBreak)
# 定义图片路径
image = "logo.png"
# 在段落中插入图片
picture = paragraph.AppendPicture(image)
# 在段落中添加图片的网页链接
field = paragraph.AppendHyperlink("https://www.e-iceblue.cn/", picture, HyperlinkType.WebLink)
# 应用字符格式到超链接
field.ApplyCharacterFormat(characterFormat)
# 保存文档
doc.SaveToFile("添加超链接.docx", FileFormat.Docx2016)
# 关闭文档
doc.Close()
# 释放资源
doc.Dispose()
Python 从 Word 文档中删除超链接
要一次性删除 Word 文档中的所有超链接,您需要找到文档中的所有超链接,然后创建一个名为 FlattenHyperlinks() 的自定义方法来依次删除。以下是详细步骤:
- 创建 Document 类的对象。
- 使用 Document.LoadFromFile() 方法加载一个 Word 文档。
- 使用自定义方法 FindAllHyperlinks() 找到文档中的所有超链接。
- 循环遍历超链接,并使用自定义方法 FlattenHyperlinks() 将它们全部删除掉。
- 使用 Document.SaveToFile() 方法保存结果文档。
- Python
from spire.doc import *
from spire.doc.common import *
# 定义函数 FindAllHyperlinks,查找文档中的所有超链接
def FindAllHyperlinks(document):
# 存储超链接列表的变量
hyperlinks = []
for i in range(document.Sections.Count):
# 获取当前节
section = document.Sections.get_Item(i)
for j in range(section.Body.ChildObjects.Count):
# 获取当前节中的子对象
sec = section.Body.ChildObjects.get_Item(j)
# 判断子对象是否为段落
if sec.DocumentObjectType == DocumentObjectType.Paragraph:
for k in range((sec if isinstance(sec, Paragraph) else None).ChildObjects.Count):
# 获取段落中的子对象
para = (sec if isinstance(sec, Paragraph)
else None).ChildObjects.get_Item(k)
# 判断子对象是否为域
if para.DocumentObjectType == DocumentObjectType.Field:
# 将子对象转换为域类型
field = para if isinstance(para, Field) else None
# 判断域类型是否为超链接
if field.Type == FieldType.FieldHyperlink:
# 将超链接对象添加到列表中
hyperlinks.append(field)
# 返回超链接列表
return hyperlinks
# 定义函数 FlattenHyperlinks,移除超链接
def FlattenHyperlinks(field):
# 获取超链接所属段落在文本主体中的索引
ownerParaIndex = field.OwnerParagraph.OwnerTextBody.ChildObjects.IndexOf(
field.OwnerParagraph)
# 获取超链接在所属段落中的索引
fieldIndex = field.OwnerParagraph.ChildObjects.IndexOf(field)
# 获取超链接分隔符所在段落
sepOwnerPara = field.Separator.OwnerParagraph
# 获取超链接分隔符所在段落在文本主体中的索引
sepOwnerParaIndex = field.Separator.OwnerParagraph.OwnerTextBody.ChildObjects.IndexOf(
field.Separator.OwnerParagraph)
# 获取超链接分隔符在所在段落中的索引
sepIndex = field.Separator.OwnerParagraph.ChildObjects.IndexOf(
field.Separator)
# 获取超链接结束符在所属段落中的索引
endIndex = field.End.OwnerParagraph.ChildObjects.IndexOf(field.End)
# 获取超链接结束符所在段落在文本主体中的索引
endOwnerParaIndex = field.End.OwnerParagraph.OwnerTextBody.ChildObjects.IndexOf(
field.End.OwnerParagraph)
FormatFieldResultText(field.Separator.OwnerParagraph.OwnerTextBody,
sepOwnerParaIndex, endOwnerParaIndex, sepIndex, endIndex)
# 删除超链接结束符
field.End.OwnerParagraph.ChildObjects.RemoveAt(endIndex)
for i in range(sepOwnerParaIndex, ownerParaIndex - 1, -1):
if i == sepOwnerParaIndex and i == ownerParaIndex:
for j in range(sepIndex, fieldIndex - 1, -1):
# 删除超链接所在段落中的对象
field.OwnerParagraph.ChildObjects.RemoveAt(j)
elif i == ownerParaIndex:
for j in range(field.OwnerParagraph.ChildObjects.Count - 1, fieldIndex - 1, -1):
# 删除超链接所在段落中的对象
field.OwnerParagraph.ChildObjects.RemoveAt(j)
elif i == sepOwnerParaIndex:
for j in range(sepIndex, -1, -1):
# 删除分隔符所在段落中的对象
sepOwnerPara.ChildObjects.RemoveAt(j)
else:
# 删除超链接所属段落所在文本主体中的对象
field.OwnerParagraph.OwnerTextBody.ChildObjects.RemoveAt(i)
# 定义函数 FormatFieldResultText,将超链接对象转换为文本并清除文本格式
def FormatFieldResultText(ownerBody, sepOwnerParaIndex, endOwnerParaIndex, sepIndex, endIndex):
for i in range(sepOwnerParaIndex, endOwnerParaIndex + 1):
para = ownerBody.ChildObjects[i] if isinstance(
ownerBody.ChildObjects[i], Paragraph) else None
if i == sepOwnerParaIndex and i == endOwnerParaIndex:
for j in range(sepIndex + 1, endIndex):
if isinstance(para.ChildObjects[j], TextRange):
FormatText(para.ChildObjects[j])
elif i == sepOwnerParaIndex:
for j in range(sepIndex + 1, para.ChildObjects.Count):
if isinstance(para.ChildObjects[j], TextRange):
FormatText(para.ChildObjects[j])
elif i == endOwnerParaIndex:
for j in range(0, endIndex):
if isinstance(para.ChildObjects[j], TextRange):
FormatText(para.ChildObjects[j])
else:
for j, unusedItem in enumerate(para.ChildObjects):
if isinstance(para.ChildObjects[j], TextRange):
FormatText(para.ChildObjects[j])
# 格式化文本
def FormatText(tr):
tr.CharacterFormat.TextColor = Color.get_Black()
tr.CharacterFormat.UnderlineStyle = UnderlineStyle.none
# 创建一个文档对象
doc = Document()
# 加载一个Word文档
doc.LoadFromFile("示例文档.docx")
# 获取所有的超链接
hyperlinks = FindAllHyperlinks(doc)
# 删除所有的超链接
for i in range(len(hyperlinks) - 1, -1, -1):
FlattenHyperlinks(hyperlinks[i])
# 保存到一个新Word文档
doc.SaveToFile("删除超链接.docx", FileFormat.Docx2016)
# 关闭文档
doc.Close()
# 释放资源
doc.Dispose()
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。