Исключение DOCX4J : исключение в потоке «main» java.lang.Исключение ArrayIndexOutOfBoundsException: 1

#docx4j

#docx4j

Вопрос:

Мы получаем ошибку ниже

 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at org.docx4j.convert.in.xhtml.TableHelper.setupTblGrid(TableHelper.java:227)
    at org.docx4j.convert.in.xhtml.XHTMLImporterImpl.traverse(XHTMLImporterImpl.java:1021)
    at org.docx4j.convert.in.xhtml.XHTMLImporterImpl.traverse(XHTMLImporterImpl.java:1304)
    at org.docx4j.convert.in.xhtml.XHTMLImporterImpl.traverse(XHTMLImporterImpl.java:1284)
    at org.docx4j.convert.in.xhtml.XHTMLImporterImpl.traverse(XHTMLImporterImpl.java:1284)
    at org.docx4j.convert.in.xhtml.XHTMLImporterImpl.traverse(XHTMLImporterImpl.java:1284)
    at org.docx4j.convert.in.xhtml.XHTMLImporterImpl.traverse(XHTMLImporterImpl.java:1284)
    at org.docx4j.convert.in.xhtml.XHTMLImporterImpl.traverse(XHTMLImporterImpl.java:1284)
    at org.docx4j.convert.in.xhtml.XHTMLImporterImpl.traverse(XHTMLImporterImpl.java:1284)
    at org.docx4j.convert.in.xhtml.XHTMLImporterImpl.traverse(XHTMLImporterImpl.java:825)
    at org.docx4j.convert.in.xhtml.XHTMLImporterImpl.convert(XHTMLImporterImpl.java:698)
    at com.deloitte.abbvie.practice.Docx4jGenerateDocument.main(Docx4jGenerateDocument.java:51)
  

когда мы пытаемся сгенерировать документ Word, используя приведенный ниже HTML. согласно нашему пониманию, если мы добавляем дочернюю таблицу, <td></td> она начинает генерировать исключение.

test2.html

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content="HTML Tidy for Java (vers. 2009-12-01), see jtidy.sourceforge.net" />
<title></title>
</head>
<body>
<table style="width: 100%; border-collapse: collapse; border: 0.5px solid black;">
<tbody>
<tr>
<td bgcolor="#E5DFEC" valign="top" width="20%" style="border-collapse: collapse; border: 0.5px solid black; border-bottom: 0.0px solid; border-right: 0.0px solid; border-left: 0.0px solid;">
<div style="color: #000066; font-size: 15px;">Test</div>
</td>
<td width="80%" style="border-collapse: collapse; border: 0.5px solid black; border-bottom: 0.1px solid; border-right: 0.0px solid;">
<h3 style="font-weight: bold; text-decoration: underline;"><u style="font-family: Calibri;">TEST 1:</u></h3>
<p><img src="Docs_UAT_ISSUE2//a2x03000000GyjIAAS_image_12117863437.png" /></p>
<h3 style="font-weight: bold; text-decoration: underline;"><u style="font-family: Calibri;">TEST 2:</u></h3>
<table align="left" class="ql-table-blob" border="1" style="width: 6.5in; margin-left: 6.75pt;" width="624">
<tbody>
<tr>
<td colspan="3" rowspan="1" valign="bottom" style="width: 6.5in;" width="624">
<p class="ListEnd" style="margin-left: 0in;"><b>ABC <a target="_blank">Tests</a></b></p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1" valign="bottom" style="width: 139.25pt;" width="186">
<p class="ListEnd" style="margin-left: 0in;"><b>PQR</b></p>
</td>
<td colspan="1" rowspan="1" valign="bottom" style="width: 175.5pt;" width="234">
<p class="ListEnd" style="margin-left: 0in;"><b>MNO</b></p>
</td>
<td colspan="1" rowspan="1" valign="bottom" style="width: 153.25pt;" width="204">
<p class="ListEnd" style="margin-left: 0in;"><b>XYZ</b></p>
</td>
</tr>
<tr style=";">
<td colspan="1" rowspan="1" valign="top" style="width: 139.25pt;" width="186">
<p class="ListEnd" style="margin-left: 0in;">Hematocrit<br />
 Hemoglobin<br />
 Red blood cell (RBC) count<br />
 White blood cell (WBC) count<br />
 Neutrophils<br />
 Bands<br />
 Lymphocytes<br />
 Monocytes<br />
 Basophils<br />
 Eosinophils<br />
 Platelet count (estimate not amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp; acceptable)</p>
</td>
<td colspan="1" rowspan="3" valign="top" style="width: 175.5pt;" width="234">
<p class="ListEnd" style="margin-left: 0in;">Blood urea nitrogen (BUN) or Urea<br />
 dfgsdf<br />
dfgsdfggCreatinine dfgdfesg (Cockcroft-Gault calculation)<br />
 Tfgsdfgotal fgdfgsd<br />
 Dirfgsdgsdfgdect and indiredfgsdfgct bilirubin<br />
 Lactate njkkh (LDH)<br />
 jkljljl<br />
 Alanine hjkhjkhjkhjk (ljj;klj;kl/ALT)<br />
 Aspartate jkjkl (SGOT/AST)<br />
 Alkaline sdfsdgdf<br />
 Sofdgbsdfgdium<br />
 Pofgsfgtassium<br />
 Cagdrfgdflcium<br />
 Inorfgrdgdfganic phosphorus<br />
 Urifgdrhdfgc acid<br />
 fgdfgf protein<br />
 Glfghdhucose<br />
 Bicarfghgfdhbonate/CO2<br />
 fghdfhh</p>
</td>
<td colspan="1" rowspan="3" valign="top" style="width: 153.25pt;" width="204">
<p class="ListEnd" style="margin-left: 0in;">A</p>
<p class="ListEnd" style="margin-left: 0in;">B</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1" valign="bottom" style="width: 139.25pt;" width="186">
<p class="ListEnd" style="margin-left: 0in;"><b>C</b></p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1" valign="top" style="width: 139.25pt;" width="186">
<p class="ListEnd" style="margin-left: 0in;">C<br />
 A<br />
 psdcsdfH<br />
 Protesdfsdain<br />
 Blodfsdod<br />
 Glucosdfsdgsdfse<br />
 Leukosdfafcyte edfsdfasdfsterase<br />
 Nitrdfdfsitdfgsddes<br />
 Bilirudfgsdfdgsdgfffgbin<br />
 Urobilidfsddnogen<br />
 Micrsdvsdfdrfgoscopic analdfgdfgfdgysis (as dfgdfgsdfneeded)</p>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</body>
</html>
  

Вот код Java, который мы использовали для создания файла docx с использованием docx4j.

 package com.deloitte.abbvie.practice;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.math.BigInteger;

import org.docx4j.convert.in.xhtml.XHTMLImporterImpl;
import org.docx4j.jaxb.Context;
import org.docx4j.model.structure.PageDimensions;
import org.docx4j.model.structure.PageSizePaper;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.wml.Body;
import org.docx4j.wml.SectPr;
import org.docx4j.wml.SectPr.PgMar;

import com.deloitte.abbvie.common.DocumentUtil;

public class Docx4jGenerateDocument {
    static DocumentUtil documentUtil = new DocumentUtil();

    public static void main(String[] args) throws Exception {
//      String finalHTMLString = "<ul> <li>Coffee</li> <li>Tea</li> <li>Milk</li> <li>CHILD <ul> <li>Child 1</li> <li>Child 2</li> <li>Child 3</li> </ul> </li> </ul> <ol> <li>Coffee</li> <li>Tea</li> <li>Milk</li> <li>CHILD 1 <ol> <li>Child 1</li> <li>Child 2</li> <li>Child 3</li> <li>CHILD 2 <ol> <li>Child 1</li> <li>Child 2</li> <li>Child 3</li> </ol> </li> </ol> </li> </ol>";

//      OR
        BufferedReader br = new BufferedReader(new FileReader(
                "C:\Users\naveekhan\Documents\Naveed_Project\Projects_Workspace\DocumentGenerationProtocolOpsManual-SP\src\main\java\com\deloitte\abbvie\practice\test2.html"));
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();

        while (line != null) {
            sb.append(line);
            sb.append("n");
            line = br.readLine();
        }
        String finalHTMLString = sb.toString();
//==============================================================        

//      finalHTMLString = documentUtil.replaceCheckBoxs(finalHTMLString);
//      finalHTMLString = documentUtil.fixWhitespaceIssue(finalHTMLString);
//      finalHTMLString = documentUtil.cleanHTML(finalHTMLString);
        
//      System.out.println(finalHTMLString);

        String filePath = "C:\Users\naveekhan\Documents\Naveed_Project\Projects_Workspace\DocumentGenerationProtocolOpsManual-SP\src\main\java\com\deloitte\abbvie\practice\GenerateDocument-06-11-2020.docx";

        if (!finalHTMLString.isEmpty()) {
            // actual code to generate WORD document
            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(PageSizePaper.LETTER, false);
            XHTMLImporterImpl xHTMLImporter = new XHTMLImporterImpl(wordMLPackage);
            wordMLPackage.getMainDocumentPart().getContent().addAll(xHTMLImporter.convert(finalHTMLString, null));
            File exportFile = new File(filePath);
            // setting page margin
            Body body = wordMLPackage.getMainDocumentPart().getJaxbElement().getBody();
            PageDimensions page = new PageDimensions();
            PgMar pgMar = page.getPgMar();
            pgMar.setLeft(BigInteger.valueOf(750));
            pgMar.setRight(BigInteger.valueOf(750));
            SectPr sectPr = Context.getWmlObjectFactory().createSectPr();
            body.setSectPr(sectPr);
            sectPr.setPgMar(pgMar);
            wordMLPackage.save(exportFile);
        }
    }

}
  

Может ли кто-нибудь или владелец библиотеки предоставить нам решение для устранения проблемы?

Ответ №1:

См . https://github.com/plutext/docx4j-ImportXHTML/issues/29

Согласно этому отчету о проблеме, обходным решением было бы удалить align=»left» .

Если вы не можете этого сделать, решение проблемы является более сложным.

Первым шагом в решении этой проблемы было бы перенести docx4j-ImportXHTML в текущую версию https://github.com/flyingsaucerproject/flyingsaucer чтобы увидеть, исчезла ли проблема. Я подозреваю, что это не так, и в этом случае следующим шагом будет попытка исправить это в базе кода flyingsaucer.