diff options
author | PJ Fanning <fanningpj@apache.org> | 2019-07-19 20:49:48 +0000 |
---|---|---|
committer | PJ Fanning <fanningpj@apache.org> | 2019-07-19 20:49:48 +0000 |
commit | ea58359b7c4f4a4b9f26803a94d5aadd289f2bac (patch) | |
tree | a2ff276e381ab183e0a831a2961952901d88d875 | |
parent | 10b5a462dcf52ea6e047cd0ccdb6a6dbce45123d (diff) | |
download | poi-ea58359b7c4f4a4b9f26803a94d5aadd289f2bac.tar.gz poi-ea58359b7c4f4a4b9f26803a94d5aadd289f2bac.zip |
[github-153] XWPFParagraph: easier way to create a link. Thanks to Thibaut Cuvelier. This closes #153
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1863433 13f79535-47bb-0310-9956-ffa450edef68
3 files changed, 45 insertions, 0 deletions
diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java index 8e7e383d45..884cc8ef11 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java @@ -273,6 +273,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody { // Get the hyperlinks // TODO: make me optional/separated in private function try { + hyperlinks = new ArrayList<>(); for (PackageRelationship rel : getPackagePart().getRelationshipsByType(XWPFRelation.HYPERLINK.getRelation())) { hyperlinks.add(new XWPFHyperlink(rel.getId(), rel.getTargetURI().toString())); } @@ -410,6 +411,15 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody { } } + // If the link was not found, rebuild the list (maybe a new link was added into the document) and check again. + initHyperlinks(); + for (XWPFHyperlink link : hyperlinks) { + if (link.getId().equals(id)) { + return link; + } + } + + // Link still not there? Giving up. return null; } diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java index 305626d9ce..4aec6eba84 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java @@ -1441,6 +1441,29 @@ public class XWPFParagraph implements IBodyElement, IRunBody, ISDTContents, Para } /** + * Appends a new hyperlink run to this paragraph + * + * @return a new hyperlink run + */ + public XWPFHyperlinkRun createHyperlinkRun(String uri) { + // Create a relationship ID for this link. + String rId = getPart().getPackagePart().addExternalRelationship( + uri, XWPFRelation.HYPERLINK.getRelation() + ).getId(); + + // Create the run. + CTHyperlink ctHyperLink = getCTP().addNewHyperlink(); + ctHyperLink.setId(rId); + ctHyperLink.addNewR(); + + // Append this run to the paragraph. + XWPFHyperlinkRun link = new XWPFHyperlinkRun(ctHyperLink, ctHyperLink.getRArray(0), this); + runs.add(link); + iruns.add(link); + return link; + } + + /** * insert a new Run in RunArray * * @param pos The position at which the new run should be added. diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFDocument.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFDocument.java index 15611bcf4b..f68dd50a13 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFDocument.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFDocument.java @@ -186,6 +186,18 @@ public final class TestXWPFDocument { } @Test + public void testAddHyperlink() throws IOException { + XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("SampleDoc.docx"); + XWPFParagraph p = doc.createParagraph(); + XWPFHyperlinkRun h = p.createHyperlinkRun("http://poi.apache.org/"); + h.setText("Apache POI"); + + assertEquals("http://poi.apache.org/", h.getHyperlink(doc).getURL()); + assertEquals(p.getRuns().size(), 1); + assertEquals(p.getRuns().get(0), h); + } + + @Test public void testRemoveBodyElement() throws IOException { XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("sample.docx"); assertEquals(3, doc.getParagraphs().size()); |