Java|Java 删除Word文档中的所有超链接

Word文档中的超链接是很方便的工具,可以用来跳转到网页、文件、邮箱等,甚至可以跳转该文档中的某一部分。虽然超链接本身是很实用的,但是有时我们获取的文档中包含大量不需要的超链接,尤其是从网络下载复制的内容。如果手动逐一删除又会非常浪费时间,这时便可以用程序来帮助我们快速去除超链接。本文将介绍一种使用程序快速删除Word文档中所有超链接的方法。
本文所使用的方法需要用到免费的Jar:Free Spire.Doc for Java,可通过如下途径引入Jar文件。
1. 使用Maven
复制下面的代码到项目文件夹下的“pom.xml“文件中

com.e-iceblue e-iceblue https://repo.e-iceblue.com/nexus/content/groups/public/ e-iceblue spire.doc.free 5.2.0

2. 官网下载 在Spire.Doc for Java免费版官网下载免费版,解压后,在“Project Structure“中,找到”Modules“,然后在其中的“Dependencies”中,添加解压出的“lib”文件夹下的Spire.Doc.jar文件。
删除Word文档中的所有超链接
删除所有超链接除了引用引入的Jar中的方法外,还需要自定义两个方法,具体操作步骤如此下:
  • 创建 Document 的对象。
  • 用 Document.loadFromFile() 从磁盘中加载 Word 文档。
  • 用自定义的 FindAllHyperlinks() 方法找到文档中所有超链接。
  • 循环所有超链接,用自定义的 FlattenHyperlinks() 方法移除所有超链接及格式。
  • 用 Document.saveToFile() 方法保存文档到文件。
代码示例如下,自定义的FindAllHyperlinks()和FlattenHyperlinks()方法可在如下代码中获取:
Java import com.spire.doc.*; import com.spire.doc.documents.DocumentObjectType; import com.spire.doc.documents.Paragraph; import com.spire.doc.documents.UnderlineStyle; import com.spire.doc.fields.Field; import com.spire.doc.fields.TextRange; import java.awt.*; import java.util.ArrayList; public class removeHyperlink { public static void main(String[] args) { //创建 Document 的对象,并从磁盘加载Word文档 String input = "D:/示例/示例.docx"; Document doc = new Document(); doc.loadFromFile(input); //找到所有超链接 ArrayList hyperlinks = FindAllHyperlinks(doc); // 循环所有超链接,移除超链接及格式 for (int i = hyperlinks.size() -1; i >= 0; i--) { FlattenHyperlinks(hyperlinks.get(i)); } //保存文档到文件 String output = "D:/javaOutput/移除超链接.docx"; doc.saveToFile(output, FileFormat.Docx); }//创建 FindAllHyperlinks() 方法来获取文档中所有超链接 private static ArrayList FindAllHyperlinks(Document document) { ArrayList hyperlinks = new ArrayList(); //在文档中循环查找所有超链接 for (Section section : (Iterable)document.getSections()) { for (DocumentObject object : (Iterable)section.getBody().getChildObjects()) { if (object.getDocumentObjectType().equals(DocumentObjectType.Paragraph)) { Paragraph paragraph = (Paragraph) object; for (DocumentObject cObject : (Iterable)paragraph.getChildObjects()) { if (cObject.getDocumentObjectType().equals(DocumentObjectType.Field)) { Field field = (Field) cObject; if (field.getType().equals(FieldType.Field_Hyperlink)) { hyperlinks.add(field); } } } } } } return hyperlinks; }//创建 FlattenHyperlinks() 方法来移除超链接及格式 public static void FlattenHyperlinks(Field field) { int ownerParaIndex = field.getOwnerParagraph().ownerTextBody().getChildObjects().indexOf(field.getOwnerParagraph()); int fieldIndex = field.getOwnerParagraph().getChildObjects().indexOf(field); Paragraph sepOwnerPara = field.getSeparator().getOwnerParagraph(); int sepOwnerParaIndex = field.getSeparator().getOwnerParagraph().ownerTextBody().getChildObjects().indexOf(field.getSeparator().getOwnerParagraph()); int sepIndex = field.getSeparator().getOwnerParagraph().getChildObjects().indexOf(field.getSeparator()); int endIndex = field.getEnd().getOwnerParagraph().getChildObjects().indexOf(field.getEnd()); int endOwnerParaIndex = field.getEnd().getOwnerParagraph().ownerTextBody().getChildObjects().indexOf(field.getEnd().getOwnerParagraph()); FormatFieldResultText(field.getSeparator().getOwnerParagraph().ownerTextBody(), sepOwnerParaIndex, endOwnerParaIndex, sepIndex, endIndex); field.getEnd().getOwnerParagraph().getChildObjects().removeAt(endIndex); for (int i = sepOwnerParaIndex; i >= ownerParaIndex; i--) { if (i == sepOwnerParaIndex && i == ownerParaIndex) { for (int j = sepIndex; j >= fieldIndex; j--) { field.getOwnerParagraph().getChildObjects().removeAt(j); } } else if (i == ownerParaIndex) { for (int j = field.getOwnerParagraph().getChildObjects().getCount() - 1; j >= fieldIndex; j--) { field.getOwnerParagraph().getChildObjects().removeAt(j); } } else if (i == sepOwnerParaIndex) { for (int j = sepIndex; j >= 0; j--) { sepOwnerPara.getChildObjects().removeAt(j); } } else { field.getOwnerParagraph().ownerTextBody().getChildObjects().removeAt(i); } } }//创建 FormatFieldResultText() 方法来移除超链接的字体颜色和下划线格式 private static void FormatFieldResultText(Body ownerBody, int sepOwnerParaIndex, int endOwnerParaIndex, int sepIndex, int endIndex) { for (int i = sepOwnerParaIndex; i <= endOwnerParaIndex; i++) { Paragraph para = (Paragraph) ownerBody.getChildObjects().get(i); if (i == sepOwnerParaIndex && i == endOwnerParaIndex) { for (int j = sepIndex + 1; j < endIndex; j++) { FormatText((TextRange)para.getChildObjects().get(j)); } } else if (i == sepOwnerParaIndex) { for (int j = sepIndex + 1; j < para.getChildObjects().getCount(); j++) { FormatText((TextRange)para.getChildObjects().get(j)); } } else if (i == endOwnerParaIndex) { for (int j = 0; j < endIndex; j++) { FormatText((TextRange)para.getChildObjects().get(j)); } } else { for (int j = 0; j < para.getChildObjects().getCount(); j++) { FormatText((TextRange)para.getChildObjects().get(j)); } } } }//创建 FormatText() 方法把字体颜色改为黑色并移除下划线 private static void FormatText(TextRange tr) { //将字体设置为黑色 tr.getCharacterFormat().setTextColor(Color.black); //将下划线设置为无下划线 tr.getCharacterFormat().setUnderlineStyle(UnderlineStyle.None); } }

删除效果示意: 【Java|Java 删除Word文档中的所有超链接】Java|Java 删除Word文档中的所有超链接
文章图片

以上引用均来自免费的Jar。

    推荐阅读