在为段落添加书签时遇到一些奇怪的问题

时间:2016-05-06 10:11:25

标签: java xml-parsing docx4j

public class BookmarkAdd  extends AbstractSample {

public static JAXBContext context = org.docx4j.jaxb.Context.jc; 

/**
 * @param args
 */
@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {

    String inputfilepath = "Chapter_3.docx";

File file = new java.io.File(inputfilepath);



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

    String outputfilepath = System.getProperty("user.dir")+"/ 1.docx";  

    ClassFinder finder = new ClassFinder(P.class); // <----- change this to suit
    new TraversalUtil(documentPart.getContent(), finder);
    int Counter = 0;
    System.out.println(finder.results.size());
    for (Object o : finder.results) 
    {
        P para =(P)o;
        String name = "para" + Counter;

            bookmarkPara(para, 0, para.getParagraphContent().size(), name, Counter);
            Counter++;


    SaveToZipFile saver = new SaveToZipFile(wordMLPackage);
    saver.save(outputfilepath);
  //         wordMLPackage.save(new java.io.File(inputfilepath));

    }
    }




/**
 * Surround the specified r in the specified p
 * with a bookmark (with specified name and id)
 * @param p
 * @param r
 * @param name
 * @param id
 */

public static void bookmarkPara(P p, int StartIndex,int EndIndex, String name, int id) {

    ObjectFactory factory = Context.getWmlObjectFactory();
    BigInteger ID = BigInteger.valueOf(id);


        // Add bookmark end first
        CTMarkupRange mr = factory.createCTMarkupRange();
        mr.setId(ID);
        JAXBElement<CTMarkupRange> bmEnd = factory.createBodyBookmarkEnd(mr);
        p.getParagraphContent().add(EndIndex, bmEnd); // from 2.7.0, use getContent()

        // Next, bookmark start
        CTBookmark bm = factory.createCTBookmark();
        bm.setId(ID);
        bm.setName(name);
        JAXBElement<CTBookmark> bmStart =  factory.createBodyBookmarkStart(bm);
        p.getParagraphContent().add(StartIndex, bmStart);



}

public static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) {
    List<Object> result = new ArrayList<Object>();
    if (obj instanceof JAXBElement)
        obj = ((JAXBElement<?>) obj).getValue();

    if (obj.getClass().equals(toSearch))
        result.add(obj);
    else if (obj instanceof ContentAccessor) {
        List<?> children = ((ContentAccessor) obj).getContent();
        for (Object child : children) {
            result.addAll(getAllElementFromObject(child, toSearch));
        }
    }
    return result;
}

}

使用这段代码我将每个段落标记为paran的para0,这段代码对于大部分文档都非常好但是我无法为我的两个docx文件添加书签我不知道为什么它显示以下内容错误。

 java.lang.IllegalArgumentException: obj parameter must not be null
at javax.xml.bind.helpers.AbstractMarshallerImpl.checkNotNull(Unknown Source)
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(Unknown Source)
at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:361)
at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:330)
at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:249)
at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:198)
at org.docx4j.openpackaging.io.SaveToZipFile.savePart(SaveToZipFile.java:424)
at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:387)
at org.docx4j.openpackaging.io.SaveToZipFile.savePart(SaveToZipFile.java:442)
at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:387)
at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:168)
at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:97)
at Backup.BookmarkAdd.main(BookmarkAdd.java:64)

.....

0 个答案:

没有答案