Page 1 of 1

Auto update TOC after merging documents

PostPosted: Mon Jun 15, 2015 8:48 pm
by patell.pranav
Hi All,

Here is what I am doing
1. Generating 2 (or more) word documents using Docx4j
2. Using the trial version of Enterprise docx4j to merge these documents which works perfectly fine
3. However I cant get the TOC at the start of merged document to auto update, currently I have to right click on the TOC field and generate it manually.

I looked at the Enterprise Edition features and it states "support for TOC generate/update" but any help on how to do this will be appreciated.

Thanks
Pranav

Re: Auto update TOC after merging documents

PostPosted: Mon Jun 15, 2015 9:16 pm
by jason
Please see p38 of the Manual (included in the zip file):

create a TocGenerator object:
TocGenerator tocGenerator = new TocGenerator(wordMLPackage);

You can update an existing TOC by invoking updateToc.

For example:
tocGenerator.updateToc( false);


boolean skipPageNumbering argument is provided so you can control whether the helper generates indicative page numbers or not

We'll have a solution for accurate page numbers soon...

Re: Auto update TOC after merging documents

PostPosted: Mon Jun 15, 2015 10:03 pm
by patell.pranav
Hi Jason,

Thanks for your quick reply.

I will try out your suggestion to use "tocGenerator" and confirm if it works in my scenario soon, however accurate page numbering is quite essential to my requirements.

Do you know when do you think this is likely to be resolved please?

Thanks
Pranav

Re: Auto update TOC after merging documents

PostPosted: Mon Jun 15, 2015 11:35 pm
by patell.pranav
Hi Jason,

Tried the TocGenerator and getting this exception, was hoping to work straight away as per the example you suggested.

Exception loading default template "org/docx4j/convert/out/fo/docx2fo.xslt", Cannot convert argument/return type in call to method 'org.docx4j.convert.out.common.XsltCommonFunctions.notImplemented(reference, node-type, string)'
(javax.xml.transform.TransformerConfigurationException: Cannot convert argument/return type in call to method 'org.docx4j.convert.out.common.XsltCommonFunctions.notImplemented(reference, node-type, string)')

Code I am trying.
Code: Select all
   
            DocumentBuilder documentBuilder = new DocumentBuilder();
            WordprocessingMLPackage mergedWordMLPackage = documentBuilder.buildOpenDocument(blockRanges);
            TocGenerator tocGenerator = new TocGenerator(mergedWordMLPackage);
            tocGenerator.generateToc(false);
            //tocGenerator.generateToc(1, " INDEX \\e \"  \" \\c \"1\" \\z \"1033\" ", false); - eventually i would also like to add Alphabatic Index in this work document
            tocGenerator.updateToc(false);
            mergedWordMLPackage.save(baOutStream);


Thanks again for your help.

Pranav

Re: Auto update TOC after merging documents

PostPosted: Tue Jun 16, 2015 6:34 pm
by jason
What version of docx4j are you using?

Regarding accurate page numbering, is your use case PDF output, or something else?

Re: Auto update TOC after merging documents

PostPosted: Tue Jun 16, 2015 7:00 pm
by patell.pranav
I am using docx4j 3.2.0 and Plutext 3.2.0.4 and I am generating word document files.

Re: Auto update TOC after merging documents

PostPosted: Tue Jun 16, 2015 11:48 pm
by jason
What is the full stack trace please?

Do you have Xalan 2.7.1 on your classpath?

Re: Auto update TOC after merging documents

PostPosted: Thu Jun 18, 2015 3:47 am
by patell.pranav
ERROR [org.docx4j.XmlUtils] (http-/0.0.0.0:8080-6) Cannot convert argument/return type in call to method 'org.docx4j.convert.out.fo.XsltFOFunctions.createBlockForPPr(reference, node-set, string, result-tree)': javax.xml.transform.TransformerException: Cannot convert argument/return type in call to method 'org.docx4j.convert.out.fo.XsltFOFunctions.createBlockForPPr(reference, node-set, string, result-tree)'
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.passErrorsToListener(TransformerFactoryImpl.java:661)
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:836)
at __redirected.__TransformerFactory.newTemplates(__TransformerFactory.java:137) [jboss-modules.jar:1.2.0.CR1]
at org.docx4j.XmlUtils.getTransformerTemplate(XmlUtils.java:925) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.loadDefaultTemplates(AbstractXsltExporterDelegate.java:98) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.getDefaultTemplate(AbstractXsltExporterDelegate.java:85) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.getTemplates(AbstractXsltExporterDelegate.java:76) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.process(AbstractXsltExporterDelegate.java:64) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractWmlExporter.process(AbstractWmlExporter.java:63) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractWmlExporter.process(AbstractWmlExporter.java:1) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:78) [docx4j-3.2.0.jar:]
at org.docx4j.Docx4J.toFO(Docx4J.java:460) [docx4j-3.2.0.jar:]
at com.plutext.docx.toc.TocGenerator.a(TocGenerator.java:124) [Plutext-Enterprise-3.2.0.4.jar:]
at com.plutext.docx.toc.TocGenerator.a(TocGenerator.java:70) [Plutext-Enterprise-3.2.0.4.jar:]
at com.plutext.docx.toc.TocGenerator.generateToc(TocGenerator.java:11) [Plutext-Enterprise-3.2.0.4.jar:]
at com.plutext.docx.toc.TocGenerator.generateToc(TocGenerator.java:86) [Plutext-Enterprise-3.2.0.4.jar:]
at com.plutext.docx.toc.TocGenerator.generateToc(TocGenerator.java:53) [Plutext-Enterprise-3.2.0.4.jar:]

ERROR [org.docx4j.XmlUtils] (http-/0.0.0.0:8080-6) Cannot convert argument/return type in call to method 'org.docx4j.convert.out.fo.XsltFOFunctions.createBlockForRPr(reference, node-set, node-set, result-tree)': javax.xml.transform.TransformerException: Cannot convert argument/return type in call to method 'org.docx4j.convert.out.fo.XsltFOFunctions.createBlockForRPr(reference, node-set, node-set, result-tree)'
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.passErrorsToListener(TransformerFactoryImpl.java:661)
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:836)
at __redirected.__TransformerFactory.newTemplates(__TransformerFactory.java:137) [jboss-modules.jar:1.2.0.CR1]
at org.docx4j.XmlUtils.getTransformerTemplate(XmlUtils.java:925) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.loadDefaultTemplates(AbstractXsltExporterDelegate.java:98) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.getDefaultTemplate(AbstractXsltExporterDelegate.java:85) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.getTemplates(AbstractXsltExporterDelegate.java:76) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.process(AbstractXsltExporterDelegate.java:64) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractWmlExporter.process(AbstractWmlExporter.java:63) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractWmlExporter.process(AbstractWmlExporter.java:1) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:78) [docx4j-3.2.0.jar:]
at org.docx4j.Docx4J.toFO(Docx4J.java:460) [docx4j-3.2.0.jar:]
at com.plutext.docx.toc.TocGenerator.a(TocGenerator.java:124) [Plutext-Enterprise-3.2.0.4.jar:]
at com.plutext.docx.toc.TocGenerator.a(TocGenerator.java:70) [Plutext-Enterprise-3.2.0.4.jar:]
at com.plutext.docx.toc.TocGenerator.generateToc(TocGenerator.java:11) [Plutext-Enterprise-3.2.0.4.jar:]
at com.plutext.docx.toc.TocGenerator.generateToc(TocGenerator.java:86) [Plutext-Enterprise-3.2.0.4.jar:]
at com.plutext.docx.toc.TocGenerator.generateToc(TocGenerator.java:53) [Plutext-Enterprise-3.2.0.4.jar:]

ERROR [org.docx4j.XmlUtils] (http-/0.0.0.0:8080-6) Cannot convert argument/return type in call to method 'org.docx4j.convert.out.common.XsltCommonFunctions.notImplemented(reference, node-type, string)': javax.xml.transform.TransformerException: Cannot convert argument/return type in call to method 'org.docx4j.convert.out.common.XsltCommonFunctions.notImplemented(reference, node-type, string)'
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.passErrorsToListener(TransformerFactoryImpl.java:661)
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:836)
at __redirected.__TransformerFactory.newTemplates(__TransformerFactory.java:137) [jboss-modules.jar:1.2.0.CR1]
at org.docx4j.XmlUtils.getTransformerTemplate(XmlUtils.java:925) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.loadDefaultTemplates(AbstractXsltExporterDelegate.java:98) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.getDefaultTemplate(AbstractXsltExporterDelegate.java:85) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.getTemplates(AbstractXsltExporterDelegate.java:76) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.process(AbstractXsltExporterDelegate.java:64) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractWmlExporter.process(AbstractWmlExporter.java:63) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractWmlExporter.process(AbstractWmlExporter.java:1) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:78) [docx4j-3.2.0.jar:]
at org.docx4j.Docx4J.toFO(Docx4J.java:460) [docx4j-3.2.0.jar:]
at com.plutext.docx.toc.TocGenerator.a(TocGenerator.java:124) [Plutext-Enterprise-3.2.0.4.jar:]
at com.plutext.docx.toc.TocGenerator.a(TocGenerator.java:70) [Plutext-Enterprise-3.2.0.4.jar:]
at com.plutext.docx.toc.TocGenerator.generateToc(TocGenerator.java:11) [Plutext-Enterprise-3.2.0.4.jar:]
at com.plutext.docx.toc.TocGenerator.generateToc(TocGenerator.java:86) [Plutext-Enterprise-3.2.0.4.jar:]
at com.plutext.docx.toc.TocGenerator.generateToc(TocGenerator.java:53) [Plutext-Enterprise-3.2.0.4.jar:]

multiple times similar to above ecxeption repeats...seems the root cause is below exceptions...

Caused by: javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:832)
at __redirected.__TransformerFactory.newTemplates(__TransformerFactory.java:137) [jboss-modules.jar:1.2.0.CR1]
at org.docx4j.XmlUtils.getTransformerTemplate(XmlUtils.java:925) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.loadDefaultTemplates(AbstractXsltExporterDelegate.java:98) [docx4j-3.2.0.jar:]

Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: Exception exporting package
at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:96) [docx4j-3.2.0.jar:]
at org.docx4j.Docx4J.toFO(Docx4J.java:460) [docx4j-3.2.0.jar:]
at com.plutext.docx.toc.TocGenerator.a(TocGenerator.java:124) [Plutext-Enterprise-3.2.0.4.jar:]
... 159 more
Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: Exception loading default template "org/docx4j/convert/out/fo/docx2fo.xslt", Could not compile stylesheet
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.loadDefaultTemplates(AbstractXsltExporterDelegate.java:102) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.getDefaultTemplate(AbstractXsltExporterDelegate.java:85) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.getTemplates(AbstractXsltExporterDelegate.java:76) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.process(AbstractXsltExporterDelegate.java:64) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractWmlExporter.process(AbstractWmlExporter.java:63) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractWmlExporter.process(AbstractWmlExporter.java:1) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:78) [docx4j-3.2.0.jar:]
... 161 more
Caused by: javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:832)
at __redirected.__TransformerFactory.newTemplates(__TransformerFactory.java:137) [jboss-modules.jar:1.2.0.CR1]
at org.docx4j.XmlUtils.getTransformerTemplate(XmlUtils.java:925) [docx4j-3.2.0.jar:]
at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.loadDefaultTemplates(AbstractXsltExporterDelegate.java:98) [docx4j-3.2.0.jar:]
... 167 more


My application runs under JBOSS and i can see xalan-2.7.1.jbossorg-1.jar jar present under jboss module.

Re: Auto update TOC after merging documents

PostPosted: Thu Jun 18, 2015 12:29 pm
by jason
We can't use xsltc.trax, so you shouldn't be using

org.apache.xalan.xsltc.trax.TransformerFactoryImpl

but rather

org.apache.xalan.processor.TransformerFactoryImpl

You need xalan-2.7.1.jar and serializer-2.7.1.jar

See for example
http://stackoverflow.com/questions/2129 ... jexception