Page 1 of 1

Hyperlink to external file

PostPosted: Sun Nov 13, 2011 12:19 am
by Levitskiy
Hello!
My task is to insert into *.doc file hyperlink to another file placed in the same directory as used *.doc file.
I have looked for example and find HyperLinkTest.java. While trying to run this one I have a lot for exceptions:

Code: Select all
3469 [main] ERROR org.docx4j.openpackaging.parts.JaxbXmlPart  - javax.xml.bind.MarshalException
javax.xml.bind.MarshalException
- with linked exception:
- with linked exception:
[com.sun.istack.internal.SAXException2: unable to marshal type "org.docx4j.dml.CTHyperlink" as an element because it is missing an @XmlRootElement annotation]
[com.sun.istack.internal.SAXException2: unable to marshal type "org.docx4j.dml.CTHyperlink" as an element because it is missing an @XmlRootElement annotation]
   at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:317)
   at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:243)
   at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:197)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:175)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:245)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:194)
   at org.docx4j.openpackaging.io.SaveToZipFile.savePart(SaveToZipFile.java:410)
   at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:373)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:164)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:105)
   at org.docx4j.openpackaging.packages.WordprocessingMLPackage.save(WordprocessingMLPackage.java:219)
   at com.rniirs.mk.reports.export.ReportEngine.exportReport(ReportEngine.java:270)
   at com.rniirs.mk.reports.export.Test.main(Test.java:42)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
Caused by: com.sun.istack.internal.SAXException2: unable to marshal type "org.docx4j.dml.CTHyperlink" as an element because it is missing an @XmlRootElement annotation
   at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:216)
   at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:286)
   at com.sun.xml.internal.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:103)
   at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:141)
   at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:306)
   at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:664)
   at com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:141)
   at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:306)
   at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:561)
   at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:290)
   at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:462)
   at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:314)
   ... 18 more
3469 [main] ERROR org.docx4j.openpackaging.io.SaveToZipFile  - javax.xml.bind.MarshalException
org.docx4j.openpackaging.exceptions.Docx4JException: Failed to add parts from relationships
- with linked exception:
   at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:378)
[com.sun.istack.internal.SAXException2: unable to marshal type "org.docx4j.dml.CTHyperlink" as an element because it is missing an @XmlRootElement annotation]
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:164)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:105)
   at org.docx4j.openpackaging.packages.WordprocessingMLPackage.save(WordprocessingMLPackage.java:219)
   at com.rniirs.mk.reports.export.ReportEngine.exportReport(ReportEngine.java:270)
   at com.rniirs.mk.reports.export.Test.main(Test.java:42)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: Problem saving part word/document.xml
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:303)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:194)
   at org.docx4j.openpackaging.io.SaveToZipFile.savePart(SaveToZipFile.java:410)
   at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:373)
   ... 10 more
Caused by: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.internal.SAXException2: unable to marshal type "org.docx4j.dml.CTHyperlink" as an element because it is missing an @XmlRootElement annotation]
   at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:317)
   at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:243)
   at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:197)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:175)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:245)
   ... 13 more
Caused by: com.sun.istack.internal.SAXException2: unable to marshal type "org.docx4j.dml.CTHyperlink" as an element because it is missing an @XmlRootElement annotation
   at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:216)
   at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:286)
   at com.sun.xml.internal.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:103)
   at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:141)
   at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:306)
   at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:664)
   at com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:141)
   at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:306)
   at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:561)
   at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:290)
   at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:462)
   at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:314)
   ... 18 more
Exception in thread "main" org.docx4j.openpackaging.exceptions.Docx4JException: Failed to add parts from relationships
   at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:378)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:164)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:105)
   at org.docx4j.openpackaging.packages.WordprocessingMLPackage.save(WordprocessingMLPackage.java:219)
   at com.rniirs.mk.reports.export.ReportEngine.exportReport(ReportEngine.java:270)
   at com.rniirs.mk.reports.export.Test.main(Test.java:42)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: Problem saving part word/document.xml
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:303)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:194)
   at org.docx4j.openpackaging.io.SaveToZipFile.savePart(SaveToZipFile.java:410)
   at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:373)
   ... 10 more
Caused by: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.internal.SAXException2: unable to marshal type "org.docx4j.dml.CTHyperlink" as an element because it is missing an @XmlRootElement annotation]
   at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:317)
   at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:243)
   at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:197)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:175)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:245)
   ... 13 more
Caused by: com.sun.istack.internal.SAXException2: unable to marshal type "org.docx4j.dml.CTHyperlink" as an element because it is missing an @XmlRootElement annotation
   at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:216)
   at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:286)
   at com.sun.xml.internal.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:103)
   at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:141)
   at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:306)
   at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:664)
   at com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:141)
   at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:306)
   at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:561)
   at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:290)
   at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:462)
   at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:314)
   ... 18 more


What should i do to solve this problem?

Re: Hyperlink to external file

PostPosted: Sun Nov 13, 2011 10:22 am
by jason
Your problem is that your code is trying to marshall the hyperlink as org.docx4j.dml.CTHyperlink (which is a DrawingML hyperlink), rather than as the WordML one: org.docx4j.wml.P.Hyperlink

http://www.docx4java.org/svn/docx4j/tru ... kTest.java won't do that.

What does your code look like?

Re: Hyperlink to external file

PostPosted: Tue Nov 15, 2011 12:00 am
by Levitskiy
Thanks. It helps me. But i have another problem. While creating hyperlinks to external file absolute path of linked files has spaces. For example "d://my folder//file.pdf".
In this situation word application shows error message "could not open OPEN XML file"

When i change absolute path to "d://my_folder//file.pdf" - all works fine. But i can't do this way in my programm. Can you advice me something?

My code is :
Code: Select all
public static P.Hyperlink createHyperlink(WordprocessingMLPackage wordMLPackage,ReportFileLink rfl )
    {
     try
     {
                    String url=rfl.url;
                    String text=rfl.text;
                    System.out.println(url);
                    org.docx4j.relationships.ObjectFactory factory = new org.docx4j.relationships.ObjectFactory();
                    org.docx4j.relationships.Relationship rel = factory.createRelationship();
                    rel.setType( Namespaces.HYPERLINK  );
                    rel.setTarget(url);
                    rel.setTargetMode("External");
                    wordMLPackage.getMainDocumentPart().getRelationshipsPart().addRelationship(rel);
                    String hpl = "<w:hyperlink r:id=\"" + rel.getId() + "\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" " +
                                 "xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" >" +
                                 "<w:r>" +
                                 "<w:rPr>" +
                                 "<w:rStyle w:val=\"Hyperlink\" />" +  // TODO: enable this style in the document!
                                 "</w:rPr>" +
                                 "<w:t>"+text+"</w:t>" +
                                 "</w:r>" +
                                 "</w:hyperlink>";
                  return (P.Hyperlink)XmlUtils.unmarshalString(hpl, Context.jc, P.Hyperlink.class);
     }

Re: Hyperlink to external file

PostPosted: Tue Nov 15, 2011 1:21 am
by jason
%20 ?

Otherwise, create a hyperlink in Word which contains spaces, and unzip the docx and look at the result