Apache POI и XDOCREPORT NullPointerException - PullRequest
       51

Apache POI и XDOCREPORT NullPointerException

0 голосов
/ 27 февраля 2019

Я делаю замены заполнителя в файле docx и после этого мне нужно конвертировать файл в PDF.Все мои усилия заканчиваются на

fr.opensagres.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerException

at fr.opensagres.poi.xwpf.converter.pdf.PdfConverter.doConvert(PdfConverter.java:71)
at fr.opensagres.poi.xwpf.converter.pdf.PdfConverter.doConvert(PdfConverter.java:39)
at fr.opensagres.poi.xwpf.converter.core.AbstractXWPFConverter.convert(AbstractXWPFConverter.java:46).

Я использую эти зависимости:

    implementation("org.apache.poi:poi-ooxml:3.17")
implementation("fr.opensagres.xdocreport:fr.opensagres.xdocreport.converter.docx.xwpf:2.0.1")

Если я пытаюсь конвертировать исходный (неизмененный) файл docx, все работает как надо, нокогда я заменяю заполнители и сохраняю документ, все падает.Часть моего кода:

        FileInputStream fis = new FileInputStream(COPIED);
        XWPFDocument doc = new XWPFDocument(fis);

        doc.createStyles();



        for (XWPFParagraph p : doc.getParagraphs()) {
            List<XWPFRun> runs = p.getRuns();
            if (runs != null) {
                for (XWPFRun r : runs) {
                    String text = r.getText(0);
                    StringSubstitutor substitutor = new StringSubstitutor(fieldsForReport);
                    String replacedText = substitutor.replace(text);
                    r.setText(replacedText, 0);
                }
            }
        }
        for (XWPFTable tbl : doc.getTables()) {
            for (XWPFTableRow row : tbl.getRows()) {
                for (XWPFTableCell cell : row.getTableCells()) {
                    for (XWPFParagraph p : cell.getParagraphs()) {
                        for (XWPFRun r : p.getRuns()) {
                            String text = r.getText(0);
                            StringSubstitutor substitutor = new StringSubstitutor(fieldsForReport);
                            String replacedText = substitutor.replace(text);
                            r.setText(replacedText, 0);
                        }
                    }
                }
            }
        }

        FileOutputStream fos = new FileOutputStream(COPIED);
        doc.write(fos);
        doc.close();



        FileInputStream fis = new FileInputStream(COPIED);
        XWPFDocument document = new XWPFDocument(fis);
        PdfOptions options = PdfOptions.create();
        PdfConverter converter = (PdfConverter) PdfConverter.getInstance();
        converter.convert(document, new FileOutputStream(DEST), options);

        document.close();

1 Ответ

0 голосов
/ 28 февраля 2019

Следующее работает для меня, используя новейшую apache poi версию 4.0.1 и новейшую версию 2.0.2 из fr.opensagres.poi.xwpf.converter.core и consorts.

import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;

//needed jars: fr.opensagres.poi.xwpf.converter.core-2.0.2.jar, 
//             fr.opensagres.poi.xwpf.converter.pdf-2.0.2.jar,
//             fr.opensagres.xdocreport.itext.extension-2.0.2.jar,
//             itext-4.2.1.jar                                  
import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions;
import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter;

//needed jars: apache poi and it's dependencies
//inclusive    ooxml-schemas-1.4.jar
import org.apache.poi.xwpf.usermodel.*;

public class DOCXToPDFConverterSampleMin {

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

  String docPath = "./WordDocument.docx";
  String pdfPath = "./WordDocument.pdf";

  InputStream in = new FileInputStream(new File(docPath));
  XWPFDocument document = new XWPFDocument(in);

  for (XWPFParagraph paragraph : document.getParagraphs()) {
   for (XWPFRun run : paragraph.getRuns()) {
    String text = run.getText(0);
    if (text != null && text.contains("$name$")) {
     text = text.replace("$name$", "Axel Richter");
     run.setText(text, 0);
    } else if (text != null && text.contains("$date$")) {
     text = text.replace("$date$", "2019-02-28");
     run.setText(text, 0);
    }
   }
  }
  for (XWPFTable table : document.getTables()) {
   for (XWPFTableRow row : table.getRows()) {
    for (XWPFTableCell cell : row.getTableCells()) {
     for (XWPFParagraph paragraph : cell.getParagraphs()) {
      for (XWPFRun run : paragraph.getRuns()) {
       String text = run.getText(0);
       if (text != null && text.contains("$name$")) {
        text = text.replace("$name$", "Axel Richter");
        run.setText(text,0);
       } else if (text != null && text.contains("$date$")) {
        text = text.replace("$date$", "2019-02-28");
        run.setText(text, 0);
       }
      }
     }
    }
   }
  }

  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run = paragraph.createRun();
  run.setText("This is new Text in this document.");

  PdfOptions options = PdfOptions.create();
  OutputStream out = new FileOutputStream(new File(pdfPath));
  PdfConverter.getInstance().convert(document, out, options);

  document.close();
  out.close();

 }
}
...