0

I'm currently using Docx4Java 3.1.0. I have all the dependencies included in my netbeans project.

When I run this piece of code:

    package pse;

/**
 *
 * @author Hrach
 */

import java.util.HashMap;

import org.docx4j.XmlUtils;
import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.io.SaveToZipFile;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.Document;


public class VariableReplace {

    public static void main(String[] args) throws Exception {

        // Exclude context init from timing
        org.docx4j.wml.ObjectFactory foo = Context.getWmlObjectFactory();

        // Input docx has variables in it: ${colour}, ${icecream}
        String inputfilepath = System.getProperty("user.dir") + "/documents/in.docx";

        boolean save = false;
        String outputfilepath = System.getProperty("user.dir")
                + "/rd/OUT_VariableReplace.docx";

        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
                .load(new java.io.File(inputfilepath));
        MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();

        HashMap<String, String> mappings = new HashMap<String, String>();
        mappings.put("colour", "green");
        mappings.put("icecream", "chocolate");

        long start = System.currentTimeMillis();

        // Approach 1 (from 3.0.0; faster if you haven't yet caused unmarshalling to occur):

            documentPart.variableReplace(mappings);

        long end = System.currentTimeMillis();
        long total = end - start;
        System.out.println("Time: " + total);

        // Save it
        if (save) {
            SaveToZipFile saver = new SaveToZipFile(wordMLPackage);
            saver.save(outputfilepath);
        } else {
            System.out.println(XmlUtils.marshaltoString(documentPart.getJaxbElement(), true,
                    true));
        }
    }

}

I get the output below:

run:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Time: 9
<w:document mc:Ignorable="w14 w15 wp14" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:ns21="urn:schemas-microsoft-com:office:powerpoint" xmlns:ns23="http://schemas.microsoft.com/office/2006/coverPageProps" xmlns:dsp="http://schemas.microsoft.com/office/drawing/2008/diagram" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:odx="http://opendope.org/xpaths" xmlns:odgm="http://opendope.org/SmartArt/DataHierarchy" xmlns:dgm="http://schemas.openxmlformats.org/drawingml/2006/diagram" xmlns:ns17="urn:schemas-microsoft-com:office:excel" xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:odi="http://opendope.org/components" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:ns9="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ns32="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:ns30="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" xmlns:ns12="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing" xmlns:ns31="http://schemas.openxmlformats.org/drawingml/2006/compatibility" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:odq="http://opendope.org/questions" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:odc="http://opendope.org/conditions" xmlns:oda="http://opendope.org/answers">
    <w:body>
        <w:p w:rsidRPr="00B959F9" w:rsidR="00D133F0" w:rsidP="00B959F9" w:rsidRDefault="00B959F9">
            <w:r w:rsidRPr="00B959F9">
                <w:t></w:t>
            </w:r>
            <w:r>
                <w:t>colour</w:t>
            </w:r>
            <w:r w:rsidRPr="00B959F9">
                <w:t></w:t>
            </w:r>
            <w:r>
                <w:t xml:space="preserve">, </w:t>
            </w:r>
            <w:r w:rsidRPr="00B959F9">
                <w:t></w:t>
            </w:r>
            <w:r>
                <w:t>icecream</w:t>
            </w:r>
            <w:bookmarkStart w:name="_GoBack" w:id="0"/>
            <w:bookmarkEnd w:id="0"/>
            <w:r w:rsidRPr="00B959F9">
                <w:t></w:t>
            </w:r>
        </w:p>
        <w:sectPr w:rsidRPr="00B959F9" w:rsidR="00D133F0">
            <w:pgSz w:w="11906" w:h="16838"/>
            <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="708" w:footer="708" w:gutter="0"/>
            <w:cols w:space="708"/>
            <w:docGrid w:linePitch="360"/>
        </w:sectPr>
    </w:body>
</w:document>
BUILD SUCCESSFUL (total time: 10 seconds)

The User Directory is: C:\Users\Hrach\Desktop\Programming\JAVA Projects\PSE This is where the documents folder is: C:\Users\Hrach\Desktop\Programming\JAVA Projects\PSE\documents This is where the rd folder is: C:\Users\Hrach\Desktop\Programming\JAVA Projects\PSE\rd

I have made a simple docx file and included just these variables in it: ${colour}, ${icecream}

When i run this file, I am expecting an output file to be made in the directory rd with those variables replaced accordingly. For some reason, I am unable to get this to work, could it be because Microsoft Word is splitting the words?

Please help and thanks in advance, Hrach.

  • The XML output you posted doesn't have ${colour} in it - split or otherwise - which suggests it isn't in the input. Unzip the input docx, and look at its document.xml. Or add System.out.println(documentPart.getXML()) before you do variableReplace. – JasonPlutext Jun 21 '14 at 08:04
  • For some reason, this is what is being run at the end: } else { System.out.println(XmlUtils.marshaltoString(documentPart.getJaxbElement(), true, true)); System.out.println("Something went wrong..."); } – Hrach Ghapantsyan Jun 21 '14 at 16:08
  • Like @JasonPlutext said, what is the content of your `document.xml` file? Because it doesn't look like you have valid fields in there (i.e. `${colour}` and `${ice-cream}`). – Ben Jun 23 '14 at 19:38
  • 1
    I got it fixed, all I had to do was use VariablePrepare then VariableReplace. Thanks for all of your help. – Hrach Ghapantsyan Jun 27 '14 at 22:25

1 Answers1

0

just set 'save'flag to true. By default example contains it as a false.

boolean save = false;

change to:

boolean save = true;
Artur_PL
  • 57
  • 1
  • 7