Page 1 of 1

hyperlinkToBookmark in header or footer

PostPosted: Wed Mar 08, 2017 2:19 am
by Frederic
Hi,

I try to replace a part of my docx by an hyperlink.

To be clearer, I try to replace
Code: Select all
<w:r w:rsidR="006838CC"><w:rPr><w:rStyle w:val="WW-DefaultParagraphFont"/><w:lang w:val="fr-FR"/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r>
<w:r w:rsidR="006838CC"><w:rPr><w:rStyle w:val="WW-DefaultParagraphFont"/><w:lang w:val="fr-FR"/></w:rPr><w:instrText xml:space="preserve"> REF TOTO \h </w:instrText></w:r>
<w:r w:rsidR="006838CC"><w:rPr><w:rStyle w:val="WW-DefaultParagraphFont"/><w:lang w:val="fr-FR"/></w:rPr></w:r>
<w:r w:rsidR="006838CC"><w:rPr><w:rStyle w:val="WW-DefaultParagraphFont"/><w:lang w:val="fr-FR"/></w:rPr><w:fldChar w:fldCharType="separate"/></w:r>
<w:r w:rsidR="006838CC" w:rsidRPr="00E24A00"><w:rPr><w:color w:val="2F5496" w:themeColor="accent5" w:themeShade="BF"/><w:lang w:val="fr-FR"/></w:rPr><w:t>TOTO</w:t></w:r>
<w:r w:rsidR="006838CC"><w:rPr><w:rStyle w:val="WW-DefaultParagraphFont"/><w:lang w:val="fr-FR"/></w:rPr><w:fldChar w:fldCharType="end"/></w:r>

by
Code: Select all
<w:hyperlink w:anchor="TOTO ">
   <w:r w:rsidDel="00000000" w:rsidR="00000000" w:rsidRPr="00000000">
      <w:rPr><w:color w:val="1155cc"/><w:u w:val="single"/><w:rtl w:val="0"/></w:rPr>
      <w:t xml:space="preserve">TOTO</w:t>
   </w:r>
</w:hyperlink>


I found a way to erase the first part and catch the ref.
I'd like to replace it by that :
Code: Select all
<w:hyperlink w:anchor="TODO"> <w:r><w:rPr></w:rPr><w:t xml:space="preserve">TOTO</w:t></w:r></w:hyperlink>


I don't find the solution from https://github.com/plutext/docx4j/blob/ ... rkAdd.java because sometimes the link will be in the main document but the hyperlink will be in the header.

Regards,
Fred

Re: hyperlinkToBookmark in header or footer

PostPosted: Wed Mar 08, 2017 4:23 am
by Frederic
I tried :
Code: Select all
org.docx4j.relationships.ObjectFactory factory = new org.docx4j.relationships.ObjectFactory();

org.docx4j.relationships.Relationship rel = factory.createRelationship();
rel.setType(Namespaces.HYPERLINK);
rel.setTarget(bookmarkLink);
rel.setTargetMode("Internal");

part.getRelationshipsPart().addRelationship(rel);
String hpl = "<w:hyperlink r:id=\"" + rel.getId() + "\" w:anchor=\"" + bookmarkLink + "\">" + //
      "<w:r>" + //
      "<w:rPr><w:color w:val=\"1155cc\"/><w:u w:val=\"single\"/><w:rtl w:val=\"0\"/></w:rPr>" + //
      "<w:t xml:space=\"preserve\">" + bookmarkLink + "</w:t>" + //
      "</w:r>" + //
      "</w:hyperlink>";
//System.out.println(hpl);
try {

   Hyperlink hyperlink = (Hyperlink) XmlUtils.unmarshalString(hpl);
   p1Content.set(fldCharBeginIndex, hyperlink);
} catch(JAXBException e) {
   System.out.println(bookmarkLink);
   e.printStackTrace();
}


But the error appears at Hyperlink hyperlink = (Hyperlink) XmlUtils.unmarshalString(hpl);
Code: Select all
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 46; The prefix "w" for element "w:hyperlink" is not bound.
   at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
   at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
   at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
   at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
   at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:284)
   at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:284)
   at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
   at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
   at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:841)
   at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770)
   at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
   at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
   at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
   at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:243)
   at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214)
   at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
   at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:125)
   at org.docx4j.XmlUtils.unmarshalString(XmlUtils.java:557)
   at org.docx4j.XmlUtils.unmarshalString(XmlUtils.java:530)
   at main.java.conversion.ConversionToGoogleDrive2.searchInstrText(ConversionToGoogleDrive2.java:137)
   at main.java.conversion.ConversionToGoogleDrive2.main(ConversionToGoogleDrive2.java:52)
P_TITLE
javax.xml.bind.JAXBException: Preprocessing exception
- with linked exception:
[org.docx4j.openpackaging.exceptions.Docx4JException: Cannot perform the transformation]
   at org.docx4j.XmlUtils.unmarshalString(XmlUtils.java:586)
   at org.docx4j.XmlUtils.unmarshalString(XmlUtils.java:530)
   at main.java.conversion.ConversionToGoogleDrive2.searchInstrText(ConversionToGoogleDrive2.java:137)
   at main.java.conversion.ConversionToGoogleDrive2.main(ConversionToGoogleDrive2.java:52)
Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: Cannot perform the transformation
   at org.docx4j.XmlUtils.transform(XmlUtils.java:1357)
   at org.docx4j.XmlUtils.unmarshalString(XmlUtils.java:581)
   ... 3 more
Caused by: javax.xml.transform.TransformerException: The prefix "w" for element "w:hyperlink" is not bound.
   at org.apache.xalan.transformer.TransformerImpl.fatalError(TransformerImpl.java:782)
   at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:758)
   at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1275)
   at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1253)
   at org.docx4j.XmlUtils.transform(XmlUtils.java:1355)
   ... 4 more

Re: hyperlinkToBookmark in header or footer

PostPosted: Wed Mar 08, 2017 7:42 am
by jason
Frederic wrote:The prefix "w" for element "w:hyperlink" is not bound.


Just declare the namespace in your string hpl. ie add xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" to w:hyperlink element

Re: hyperlinkToBookmark in header or footer

PostPosted: Wed Mar 08, 2017 7:54 pm
by Frederic
OMG :o
Thank you very very much :P